声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1930|回复: 8

[编程技巧] ode45

[复制链接]
发表于 2008-10-29 16:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
ode45中能不能使用循环
回复
分享到:

使用道具 举报

发表于 2008-10-29 16:47 | 显示全部楼层

回复 楼主 francexuqu 的帖子

请尽可能清楚、详细的说明问题,不要让别人去猜你的意思。
 楼主| 发表于 2008-10-29 17:46 | 显示全部楼层
比如:
Ey=1:1:100;初始值y(1)=1;y(2)=0;y(3)=0;y(4)=0;x=[-40:40]
dy(1) = -2*pi*y(3)/y(1)*Ey;
dy(2) = -2*pi*(y(3)/y(1)*Ey-y(4)/y(1));
dy(3) = -2*pi*(Ey-y(2)/y(1)*Ey);
dy(4) = -2*pi*y(2)/y(1);

如果Ey是一个确定的值,直接用ode45便可解;
ifEy是个数组,且此时初值条件不变,可不可以用ode45解
if可以,如何做?
发表于 2008-10-29 23:06 | 显示全部楼层

回复 板凳 francexuqu 的帖子

你这个可以实现 ,Ey当着参数传递进去,循环放在外面

评分

1

查看全部评分

发表于 2008-10-30 11:22 | 显示全部楼层

回复 板凳 francexuqu 的帖子

可以实现,只需要稍微改变一下导数函数文件的格式,再把ey当做参数参数由ode45传进去就可以了。

  1. function dy=yyydot(t,y,flag,Ey)
  2. dy=[ -2*pi*y(3)/y(1)*Ey;
  3. -2*pi*(y(3)/y(1)*Ey-y(4)/y(1));
  4. -2*pi*(Ey-y(2)/y(1)*Ey);
  5. -2*pi*y(2)/y(1)];
复制代码

  1. clear;clc
  2. x0=[1;0;0;0];
  3. Ey=[1,21];
  4. for ii=1:2
  5.     [t,x]=ode45('yyydot',[-40,40],x0,[],Ey(ii));
  6.     figure;plot(t,x)
  7. end
复制代码
f1.jpg
f2.jpg
 楼主| 发表于 2008-11-3 19:06 | 显示全部楼层

回复 5楼 sogooda 的帖子

??? Error using ==> funfun\private\odearguments
Correct syntax is ode45(YYYDOT,tspan,y0,options).
Error in ==> ode45 at 173
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in ==> lliu at 5
    [t,x]=ode45('yyydot',[-40,40],x0,Ey(ii));

代码去掉flag在我的机子上面运行,得到上面的结果
flag是什么用途呢

[ 本帖最后由 francexuqu 于 2008-11-3 19:40 编辑 ]
发表于 2008-11-3 19:38 | 显示全部楼层

回复 6楼 francexuqu 的帖子

1.没什么用。
2.允许
3.ode45('yyydot',[-40,40],x0,[],Ey(ii));或者更推荐ode45(@yyydot,[-40,40],x0,[],Ey(ii));
4.都行

上面的程序我之前可以运行,但是现在好像有点儿问题——也许是我调试之后忘了把改动贴上来了吧。又改了一下,可以在一个文件里放着。应该不会再有问题了。

  1. function solveyyy
  2. clear;clc
  3. x0=[1;0;0;0];
  4. Ey=[1,21];
  5. for ii=1:2
  6.     [t,x]=ode45(@yyydot,[-40,40],x0,[],Ey(ii));
  7.     figure;plot(t,x)
  8. end
  9. function dy=yyydot(t,y,Ey)
  10. dy=[ -2*pi*y(3)/y(1)*Ey;
  11. -2*pi*(y(3)/y(1)*Ey-y(4)/y(1));
  12. -2*pi*(Ey-y(2)/y(1)*Ey);
  13. -2*pi*y(2)/y(1)];
复制代码
 楼主| 发表于 2008-11-3 19:49 | 显示全部楼层
[t,x]=ode45(@yyydot,[-40,40],x0,[],Ey(ii));
请问这里的空矩阵表示什么,将其删掉,为什么不能运行
出错的代码:
??? Input argument "Ey" is undefined.
Error in ==> liu>yyydot at 10
dy=[ -2*pi*y(3)/y(1)*Ey;
Error in ==> funfun\private\odearguments at 110
f0 = feval(ode,t0,y0,args{:});   % ODE15I sets args{1} to yp0.
Error in ==> ode45 at 173
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in ==> liu at 6
    [t,x]=ode45(@yyydot,[-40,40],x0,Ey(ii));
发表于 2008-11-3 20:15 | 显示全部楼层

回复 8楼 francexuqu 的帖子

通常都是将第四个参数设定为空的……
doc ode45
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-10-1 23:35 , Processed in 0.059124 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表