matlab求解微分方程组

matlab求解微分方程组,第1张

ODE方程组可以通过MATLAB的ode系列命令进行求解(ode23,ode45,ode15s,ode113,),不同的算法代表不同的积分方法,具有不同的精度,适用于不同的场合,具体可参考有关Simulink求解器的选择方法,对于本题,若以ode45命令为例进行求解:
① 新建函数文件:fm
function dX=f(t,X)
% X=[ x ]
% [ y ];
dX=[ 7310^5(X(1)/X(2))-18810^4(X(1)^2/X(2));
7310^5-18810^4X(1)+1069X(1)sqrt(2110^6-X(2)) ];
保存。
② 在命令行运行以下命令:
[t,X]=ode45(@f,[0 10],[2065 0099])
(由于题设未给出,这里假定仿真10s,对应第二项 [0 10],即从0s至10s)
③ 绘图:
plot(t,X(:,1)) %绘制x(t)图像
plot(t,X(:,2)) %绘制y(t)图像
补充:1)本题函数的刚性较大,求解时可能出现复数,请校核函数表达式和初值,并选择恰当的积分方法;2)其它ode命令的使用方法类同,具体请参见help

可以用desolve方程:
r=dsolve('eqn1','eqn2',,'cond1','cond2',,'var')
eqn1表示第1个微分方程,cond1表示第1个初始条件,var表示微分方程中的自变量,默认为t。

这说明此微分方程没有显示解,应用数值方法求解,例如ode45等函数
就一个例子(选自matlab帮助文档)
解入下微分方程组
1,建立方程组函数

function dy = rigid(t,y)dy = zeros(3,1); % a column vectordy(1) = y(2) y(3);dy(2) = -y(1) y(3);dy(3) = -051 y(1) y(2);
2,求解并绘图
[T,Y] = ode45(@rigid,[0 12],[0 1 1]);plot(T,Y(:,1),'-',T,Y(:,2),'-',T,Y(:,3),'')
结果

信号处理|MATLAB电子书|偏微分方程的MATLAB解法免费下载
 6puw
pdetool是matlab的一个重要的工具箱,它可以用数值解法来求解各种繁琐的偏微分方程问题,并且 *** 作非常便捷。    

能画一个当然也能画多个了。
画第二个之前用plot on命令,这样后面再绘图的时候就都画在同一个坐标图里面了。
如果你用的ode函数,注意参数t或者你给的例子是x,范围要按你分段的那么分,得出的数据才会在绘图中也分段。也就是说分段放在ode函数里,不是放在plot里。
另外很多微分方程可以直接解出来的,用dsolve函数。
比如你给的这个例子就可以,只不过解出来的y=C1exp(xt)和y=C1exp(2xt),里面含有两个待定系数,要先给出初始值或者边界条件,把系数确定,才能绘图的。这时分段范围就可以直接放在plot函数里了。
对于第二个问题,用ode解的微分方程确定不了反函数。
可以用dsolve解出微分方程,然后再用solve,把x当未知数,求出用y表示的x。
再代入y的特定值,就可以求出对应的x了。

这个如果点列很密集的话,数值微分就是差分
那你就用循环结构咯
for ii=1:m
for jj=1:m
dy(ii)=(y(ii+1)-y(ii))/(x(ii+1)-x(ii));
end
end
dy
这样 每相邻两个点的差分就能知道了 然后 成图 就可以近似认为是微分了,其中m是已知的 看你的数据有多少个了

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没错这就是求解器的返回值。它是一个11的结构体。双击它,你会看到它的内部组织,各个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=soly(:,end))

sol=odextend(sol,@vdp1,20);plot(solx,soly(1,:))=====================================================================================

3、求解器的参数设置

就是option这个东西,既然是选项,则也可以不设置它,采用默认值。

要设置的话,可以用odeset这个命令。怎么用?

option=odeset('name1',value1,'name2',value2) (matlab所有参数设置基本上都是这种形式)
name自然就是属性名字。value就是你赋予它的值。求解器可以设置哪些参数,而设置了这些参数有什么影响,而这些参数应该则么设置。在命令行里输入
help
odeset:D
。看到的绝对比我讲得详细。所以我不多说了。(友情提醒,如果使用ode15什么来着,可以为它设置Jacobian这个参数,以更快更准更好的求解。如何设置,不懂的话,偶过后会贴。)

O=odeget(option,'name')

编过GUI的话这两个命令再熟悉不过了:D


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12702848.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存