chourhy 发表于 2012-3-8 19:26

一个求解常微分方程组的程序老是出错,求各位大神指导下,谢谢了

方程是这样的:dx/dt=cosa   dy/dt=sinada/dt=mdm/dt=-10sina
边界条件是:   t=0时,x=0,y=0,m=0
                        t=1时,y=0,m=0
本人运行的程序如下:
Clear
pi = N[\];
pe=10;
gm = 0.53 ;
de:={y1'\Cos],y2'\Sin],
   y3'\y4,y4'\-pe*Sin]}
leftBC:={y1\0,y2\0,y3\m,y4\0}
soln:=NDSolve,leftBC]],{y1,y2,y3,y4},{t,0,1},
   MaxSteps\2000]
endpt:={y1,y2,y3,y4}/.First[
       NDSolve,leftBC]],{y1,y2,y3,
         y4},{t,0,1},MaxSteps\2000]]/.t\1;
Clear
rts:=FindRoot[{endpt[]\0},{m,{gm,0.99gm}},AccuracyGoal\6,
   MaxIterations\1000]
endpt
m=m/.rts
{yy1,yy2,yy3,yy4}={y1,y2,y3,y4}/.First;
ParametricPlot,yy2}/.soln/.rts],{t,0,1},
PlotRange\All,AspectRatio\Automatic,PlotPoints\100]
但是老是弹出错误提示:NDSolve::ndinnt: Initial condition m is not a number or a rectangular array of numbers
实在不清楚哪里有问题,所以来求助各位高手,希望不吝赐教
谢谢了

xhn 发表于 2012-5-1 13:04

endpt函数只能接受数值变量,Findroot会对方程进行符号代入化简,导致NDSolve以符号m做为初值,计算出错。
Findroot好像不能以这种方式给定初值。
程序按如下方式修改,不报错,能得到结果。
对不对我就不确定了,说实话没看懂你的程序……

endpt := ({y1, y2, y3, y4} /.
      First[NDSolve[
      Flatten, leftBC]], {y1, y2, y3,
         y4}, {t, 0, 1}, MaxSteps -> 2000]] /. t -> 1)[];
Clear
rts := FindRoot[{endpt == 0}, {m, gm, 0.99 gm}, AccuracyGoal -> 6,
MaxIterations -> 1000]

chourhy 发表于 2012-5-2 21:09

回复 2 # xhn 的帖子

非常感谢你的解答{:{01}:}
但是我按照你的意思改了过来为什么还是出错啊。。。
错误提示是:FindRoot::nlnum: "The function value {endpt[{0.53,0.5247}]} is not a list of numbers with dimensions {1} at {m} = {{0.53,0.5247}}"
不知道是哪里出了问题
能解答下吗谢谢了

chourhy 发表于 2012-5-3 10:32

回复 2 # xhn 的帖子

早上起来又试了一下 可以算了谢谢你了{:{01}:}
页: [1]
查看完整版本: 一个求解常微分方程组的程序老是出错,求各位大神指导下,谢谢了