matlab求解微分方程——个人总结
其实不算是总结了,而是自己的初学笔记。
资料:help
建议:可以
先看例子。我刚开始看这一节,也是晕晕乎乎莫名其妙
。看的时候,至少也要把
代码运行一下,亲自看看结果的结构
ODE部分--------ODE--->ordinary differential equations
先
总述一下
1、ODE的求解器
ODE的求解器有很多,在help里可以查到。列出了每一种求解器的适应范围(stiff或者nonstiff)以及它采用的数学原理,比如Runge-Kutta,Adams,NDFs之类。(这个在数值分析课中会学到,可惜偶当时觉得很无聊,后悔中)。
大家有时间多去了解了解,懂了来给大家分享分享
。
如果不懂那么多理论,优先采用
ode45,如果你发现它计算的效率特别低下或者是计算根本出不来,则可能是stiff问题了,则考虑换
ode15s。
这部分后面还会涉及,这里就不多说了。
sol = ode45(@yourfun,[tmin,tmax],[y0,y0'])
你的公式 积分范围 初值
引用:
sol=ode45(@vdp1,[0,20],[2,0]);
把以上代码命令行里直接执行,这是matlab自带的一个例子。在workspace里你会看到多了一个变量叫sol.没错这就是求解器的返回值。它是一个1*1的结构体。双击它,你会看到它的内部组织,各个field以及它们的“形状”。每一个你都可以双击它,继续深入看它的结构。我现在关心的只有X,Y
solver
extdata,
x,
y,
stats,
idata
================================================================================
2、求解计算完毕后,我们可以做什么
首先,当然是得到结果。
deval(sol,x,1)
sol如上,是返回来的handles。x是一组向量,是你期望求值的点。数字1就表示你要求第一行的值(不明白什么叫第一行,就去双击sol,再双击y),如果去掉1,则返回矩阵,也就是所有y的值。
引用:
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 这样明显一点。在之前的基础上继续计算到新的t_final。默认以上次计算的y终值(你在workspace双击sol,再双击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
。看到的绝对比我讲得详细。所以我不多说了。(友情提醒,如果使用ode15什么来着,可以为它设置Jacobian这个参数,以更快更准更好的求解。如何设置,不懂的话,偶过后会贴。)
O=odeget(option,'name') 编过GUI的话这两个命令再熟悉不过了
用ode系列可以求解Y对T的微分函数,可以涉及多阶微分。
1、函数形式:y‘=f(t,y) 这种我叫它显性函数 f(t,y,y')=0 隐函数,这种用ode15i求解 2、对于求解微分问题都要为其指定初值 得到: y'=f(t,y) y(t0)=y0 3、ode只能直接求解一阶微分,那我有多级微分怎么办呢?学过现代控制理论就知道怎么处理了 不学也不影响,基本上就是把 一个N阶微分方程转化为N个一阶微分方程组。 比如y'''=f(t,y,y',y'') y1'=y2 y2'=y3 y3'=f(t,y1,y2,y3)基本例子Examples: Solving Explicit ODE Problems附:谁解释下 van der Pol 是什么东西,这么特殊?范德蒙?不像呀 mu是个标量值 首先,转化为一阶阵 接着,写它的function(这里mu取了1.原因后面会说) 附:内容如此,形式可以多样 比如dydt=zeros(2,1); dydt(1)=…… %第一个 dydt(2)=…… %第二个 最后,应用求解 参数解释过了。@是指将vdp1这个function的handles传递过来。 (附:func2str, str2func真是个好东西) t是返回的“时间”向量,也就是积分轴向量(也就是sol里面那个x,这里是列向量形式) y是返回的结果(sol里面的y,只不过这里是列向量的形式,而sol里面是行向量形式) 另外,查看结果 这里引用结果 y(:,1) 注意与sol.y的引用区别 看到它怎么打mu这个字母了吧?help里有关于这种特殊的字符或者样式的表。忘记在哪里了,我以后找找。