lyxxl 发表于 2007-4-2 11:00

求教怎样用ode求解多个初始条件的常微方程组?

小弟想用ODE45求解多个初始条件下的微分方程组,请问如何处理?
如:t0=0,tf=2;
tspan=;
Xx=
=ode45('dydt2',tspan,Xx)
a00=YY(:,3)
b00=YY(:,4)
a01=YY(:,1)
b01=YY(:,2)
subplot(2,1,1),plot(a01,b01,'b','linewidth',2);hold on
subplot(2,1,2),plot(t,a00,'r','linewidth',2);hold on

function yd=dydt2(t,x)
a=250,b=0.3,st=0.2,w=1
yd=[(-a*sin(x(3)+b*sin(w*t))*sin(x(4))-2/3/st)*x(1)+a*cos(x(3)+b*sin(w*t))*cos(x(4))*x(2);
          -a*cos(x(3)+b*sin(w*t))*cos(x(4))*x(1)+(a*sin(x(3)+b*sin(w*t))*sin(x(4))-2/3/st)*x(2);
          x(1)-a*cos(x(3)+b*sin(w*t))*sin(x(4));
          x(2)+a*sin(x(3)+b*sin(w*t))*cos(x(4))]
这样只能求解一个初始条件Xx=的情况,比如我想求解Xx=,vx=,vy=,x=,y=含多个初始条件下系统的运动情况,请问应该怎么解决,我想用循环肯定是不太现实的,因为我的初始条件得一万多个,即考察某区间内一万个点经过某段时间演化后这一万个点的状态.
想改用数组的形式,把原M文件改为

function yd=dydt2(t,x)
a=100,b=0,st=0.2,w=1
yd=[(-a*sin(x(3,:)+b*sin(w*t)).*sin(x(4,:))-2/3/st).*x(1,:)+a*cos(x(3,:)+b*sin(w*t))*cos(x(4,:)).*x(2,:);
          -a*cos(x(3,:)+b*sin(w*t)).*cos(x(4,:)).*x(1,:)+(a*sin(x(3,:)+b*sin(w*t)).*sin(x(4,:))-2/3/st).*x(2,:);
          x(1,:)-a*cos(x(3,:)+b*sin(w*t)).*sin(x(4,:));
          x(2,:)+a*sin(x(3,:)+b*sin(w*t)).*cos(x(4,:))]

然后Xx=,但是老出错误提示:
??? Error using ==> funfun\private\odearguments
Solving DYDT1 requires an initial condition vector of length 4.

Error in ==> ode45 at 173
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in ==> Untitled2 at 8
=ode45('dydt2',tspan,XY)

是不是ODE不能解决数组形式的微分组?
请问该问题如何解决?顺便再求教一下,改成数组格式后,tspan是否需要改变?画图应该如何画?
多谢高人指点,小弟感激涕零,无以为报!

[ 本帖最后由 lyxxl 于 2007-4-6 16:42 编辑 ]

gghhjj 发表于 2007-4-15 07:26

初值只能以向量的形式给出来,而不能是矩阵
换句话来说,这个问题只能用循环的形式实现

lyxxl 发表于 2007-4-15 15:34

哦,多谢了!

多谢了!
还有个问题,能不能再请教一下,我想如果不用循环,能不能把这个问题排列在一起求解 ,用的时间会减少吗?
比如原来的点是4维的,我把他改成400维的,每四维之间相互独立,一下求解100个点,这样会不会省时间呢?

gghhjj 发表于 2007-4-16 04:34

原帖由 lyxxl 于 2007-4-15 15:34 发表
多谢了!
还有个问题,能不能再请教一下,我想如果不用循环,能不能把这个问题排列在一起求解 ,用的时间会减少吗?
比如原来的点是4维的,我把他改成400维的,每四维之间相互独立,一下求解100个点,这样会不会省时间呢?

可以做到,但是对提高效率应该没什么作用
页: [1]
查看完整版本: 求教怎样用ode求解多个初始条件的常微方程组?