如何用matlab求解向量微分方程
发布网友
发布时间:2022-04-19 11:18
我来回答
共1个回答
热心网友
时间:2023-06-26 19:25
ODE部分--------ODE--->ordinary
differential
equations先总述一下:D 1、ode的求解器ode
ODE的求解器有很多,在help里可以查到。列出了每一种求解器的适应范围(stiff或者nonstiff)以及它采用的数学原理,比如Runge-Kutta,Adams,NDFs之类。(这个在数值分析课中会学到,可惜偶当时觉得很无聊,后悔中)。
大家有时间多去了解了解,懂了来给大家分享分享:D
。
如果不懂那么多理论,优先采用ode45,如果你发现它计算的效率特别低下或者是计算根本出不来,则考虑换ode15s。
sol是任意名字。对于怎么把要求解的方程写为function,2楼例子。所以你告诉求解器这三样东西(输入参数),它就可以为你求解出y。
sol
=
ode45(@yourfun,[tmin,tmax],[y0,y0'])
你的公式
积分范围
初值
sol=ode45(@vdp1,[0,20],[2,0]);
把以上代码命令行里直接执行,这是matlab自带的一个例子。在workspace里你会看到多了一个变量叫sol.没错这就是求解器的返回值。它是一个1*1的结构体。双击它,你会看到它的内部组织,各个field以及它们的“形状”。每一个你都可以双击它,继续深入看它的结构。我现在关心的只有X,Ysolverextdata,x,y,stats,idata================================================================================2、求解计算完毕后,我们可以做什么
首先,当然是得到结果。
deval(sol,x,1)
sol如上,写在求解等号左边的变量名字,是返回来的handles。x是一组向量,是你期望求值的点。数字1就表示你要y第一行的值(这个是在求解微分方程组的情况。不明白什么叫第一行,就去双击sol,再双击y),如果去掉1,则返回矩阵,也就是所有y的值。在matlab命令行运行以下代码:
sol=ode45(@vdp1,[0,20],[2,0]);x=linspace(0,20,100);y=deval(sol,x,1);plot(x,y);
此外,我们还可以扩展,matlab叫做odextend。扩展什么?
odextend(sol,odefun,tfinal)
看到最后一个变量名了吧,t_final
这样明显一点。也就是,我之前算过的微分方程组,原来算到t1,我现在要接着继续计算到新的t_final。默认以上次计算的y终值,作为此次计算的初值。
odextend(sol,odefun,tfinal,yinit)
当然,如果你想重新给它赋初值,也可以加入参数yinit。(友情提示:获取上次计算的Y的终值:y=sol.y(:,end))
sol=odextend(sol,@vdp1,20);plot(sol.x,sol.y(1,:))=====================================================================================
3、求解器的参数设置
也
就是option这个东西,既然是选项,则也可以不设置它,采用默认值。
要设置的话,可以用odeset这个命令。怎么用?
option=odeset('name1',value1,'name2',value2......) (matlab所有参数设置基本上都是这种形式)
name自然就是属性名字。value就是你赋予它的值。求解器可以设置哪些参数,而设置了这些参数有什么影响,而这些参数应该则么设置。在命令行里输入
help
odeset:D
。看到的绝对比我讲得详细。所以我不多说了。(友情提醒,如果使用ode15什么来着,可以为它设置Jacobian这个参数,以更快更准更好的求解。如何设置,不懂的话,偶过后会贴。)
O=odeget(option,'name')
编过GUI的话这两个命令再熟悉不过了:D