方程求解的实验 matlab,matlab 实验四 求微分方程的解
實際應用問題通過數學建模所歸納而得到的方程,絕大多數都是微分方程,真正能得到代數方程的機會很少.另一方面,能夠求解的微分方程也是十分有限的,特別是高階方程和偏微分方程(組).這就要求我們必須研究微分方程(組)的解法,既要研究微分方程(組)的解析解法(精確解),更要研究微分方程(組)的數值解法(近似解).
對微分方程(組)的解析解法(精確解),Matlab有專門的函數可以用,本實驗將作一定的介紹.
本實驗將主要研究微分方程(組)的數值解法(近似解),重點介紹Euler折線法.
1.dsolve('equ1','equ2',…):Matlab求微分方程的解析解.equ1、equ2、…為方程(或條件).寫方程(或條件)時用Dy表示y關于自變量的一階導數,用用D2y表示y關于自變量的二階導數,依此類推.
2.simplify(s):對表達式s使用maple的化簡規則進行化簡.
例如:
syms x
simplify(sin(x)^2 + cos(x)^2)
ans=1
3.[r,how]=simple(s):由于Matlab提供了多種化簡規則,simple命令就是對表達式s用各種規則進行化簡,然后用r返回最簡形式,how返回形成這種形式所用的規則.
例如:
syms x
[r,how]=simple(cos(x)^2-sin(x)^2)
r = cos(2*x)
how = combine
4.[T,Y] = solver(odefun,tspan,y0)求微分方程的數值解.
說明:
(1)其中的solver為命令ode45、ode23、ode113、ode15s、ode23s、ode23t、ode23tb之一.
(2) odefun是顯式常微分方程:
(3)在積分區間tspan=
上,從到,用初始條件求解.
(4)要獲得問題在其他指定時間點上的解,則令tspan=
(要求是單調的).
(5)因為沒有一種算法可以有效地解決所有的ODE問題,為此,Matlab提供了多種求解器Solver,對于不同的ODE問題,采用不同的Solver.
求解器
Solver
ODE類型
特點
說明
ode45
非剛性
單步算法;4、5階Runge-Kutta方程;累計截斷誤差達
大部分場合的首選算法
ode23
非剛性
單步算法;2、3階Runge-Kutta方程;累計截斷誤差達
使用于精度較低的情形
ode113
非剛性
多步法;Adams算法;高低精度均可到
計算時間比ode45短
ode23t
適度剛性
采用梯形算法
適度剛性情形
ode15s
剛性
多步法;Gear's反向數值微分;精度中等
若ode45失效時,可嘗試使用
ode23s
剛性
單步法;2階Rosebrock算法;低精度
當精度較低時,計算時間比ode15s短
ode23tb
剛性
梯形算法;低精度
當精度較低時,計算時間比ode15s短
(6)要特別的是:ode23、ode45是極其常用的用來求解非剛性的標準形式的一階常微分方程(組)的初值問題的解的Matlab的常用程序,其中:
ode23采用龍格-庫塔2階算法,用3階公式作誤差估計來調節步長,具有低等的精度.
ode45則采用龍格-庫塔4階算法,用5階公式作誤差估計來調節步長,具有中等的精度.
5.ezplot(x,y,[tmin,tmax]):符號函數的作圖命令.x,y為關于參數t的符號函數,[tmin,tmax]為t的取值范圍.
6.inline():建立一個內聯函數.格式:inline('expr', 'var1', 'var2',…),注意括號里的表達式要加引號.
例:Q = dblquad(inline('y*sin(x)'), pi, 2*pi, 0, pi).
1.幾個可以直接用Matlab求微分方程精確解的例子:
例1:求解微分方程,并加以驗證.
求解本問題的Matlab程序為:
syms x y ?????????????????????????????????%line1
y=dsolve('Dy+2*x*y=x*exp(-x^2)','x')???????? ?%line2
diff(y,x)+2*x*y-x*exp(-x^2)???????????????? ?%line3
simplify(diff(y,x)+2*x*y-x*exp(-x^2))???????? ?%line4
說明:
(1)行line1是用命令定義x,y為符號變量.這里可以不寫,但為確保正確性,建議寫上;
(2)行line2是用命令求出的微分方程的解:
1/2*exp(-x^2)*x^2+exp(-x^2)*C1
(3)行line3使用所求得的解.這里是將解代入原微分方程,結果應該為0,但這里給出:
-x^3*exp(-x^2)-2*x*exp(-x^2)*C1+2*x*(1/2*exp(-x^2)*x^2+exp(-x^2)*C1)
(4)行line4用simplify()函數對上式進行化簡,結果為0,表明的確是微分方程的解.
例2:求微分方程在初始條件下的特解,并畫出解函數的圖形.
求解本問題的Matlab程序為:
syms x y
y=dsolve('x*Dy+y-exp(x)=0','y(1)=2*exp(1)','x')
ezplot(y)
微分方程的特解為:y=1/x*exp(x)+1/x* exp (1)(Matlab格式),即,解函數的圖形如圖1:
圖1
例3:求微分方程組在初始條件下的特解,并畫出解函數的圖形.
求解本問題的Matlab程序為:
syms x y t
[x,y]=dsolve('Dx+5*x+y=exp(t)','Dy-x-3*y=0','x(0)=1','y(0)=0','t')
simple(x);
simple(y);
ezplot(x,y,[0,1.3]);axis auto
微分方程的特解(式子特別長)以及解函數的圖形均略.
2.用ode23、ode45等求解非剛性的標準形式的一階常微分方程(組)的初值問題的數值解(近似解).
例4:求解微分方程初值問題的數值解,求解范圍為區間[0, 0.5].
fun=inline('-2*y+2*x^2+2*x','x','y');
[x,y]=ode23(fun,[0,0.5],1);
x';
y';
plot(x,y,'o-')
>> x'
ans =
0.0000 ??0.0400 ??0.0900? ?0.1400? ?0.1900 ??0.2400
0.2900 ??0.3400 ??0.3900 ??0.4400 ??0.4900? ?0.5000
>> y'
ans =
1.0000 ??0.9247 ??0.8434 ??0.7754 ??0.7199 ??0.6764
0.6440? ?0.6222 ??0.6105 ??0.6084? ?0.6154 ??0.6179
圖形結果為圖2.
圖2
例5:求解描述振蕩器的經典的Ver der Pol微分方程
分析:令則
先編寫函數文件verderpol.m:
function xprime = verderpol(t,x)
global mu;
xprime = [x(2);mu*(1-x(1)^2)*x(2)-x(1)];
再編寫命令文件vdp1.m:
global mu;
mu = 7;
y0=[1;0]
[t,x] = ode45('verderpol',[0,40],y0);
x1=x(:,1);x2=x(:,2);
plot(t,x1)
圖形結果為圖3.
圖3
3.用Euler折線法求解
前面講到過,能夠求解的微分方程也是十分有限的.下面介紹用Euler折線法求微分方程的數值解(近似解)的方法.
Euler折線法求解的基本思想是將微分方程初值問題
化成一個代數方程,即差分方程,主要步驟是用差商替代微商,于是:
記,從而,則有
例6:用Euler折線法求解微分方程初值問題
的數值解(步長h取0.4),求解范圍為區間[0,2].
解:本問題的差分方程為
相應的Matlab程序見附錄1.
數據結果為:
0 ????????1.0000
0.4000??? 1.4000
0.8000??? 2.1233
1.2000??? 3.1145
1.6000??? 4.4593
2.0000??? 6.3074
圖形結果見圖4:
圖4
特別說明:本問題可進一步利用四階Runge-Kutta法求解,讀者可將兩個結果在一個圖中顯示,并和精確值比較,看看哪個更“精確”?(相應的Matlab程序參見附錄2).
1.求微分方程的通解.
2.求微分方程的通解.
3.求微分方程組
在初始條件下的特解,并畫出解函數的圖形.
4.分別用ode23、ode45求上述第3題中的微分方程初值問題的數值解(近似解),求解區間為.利用畫圖來比較兩種求解器之間的差異.
5.用Euler折線法求解微分方程初值問題
的數值解(步長h取0.1),求解范圍為區間[0,2].
6.用四階Runge-Kutta法求解微分方程初值問題
的數值解(步長h取0.1),求解范圍為區間[0,3].
四階Runge-Kutta法的迭代公式為(Euler折線法實為一階Runge-Kutta法):
相應的Matlab程序參見附錄2.試用該方法求解第5題中的初值問題.
7.用ode45方法求上述第6題的常微分方程初值問題的數值解(近似解),從而利用畫圖來比較兩者間的差異.
總結
以上是生活随笔為你收集整理的方程求解的实验 matlab,matlab 实验四 求微分方程的解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zuul微服务网关、容错与监控、Zuul
- 下一篇: matlab中pol2cart()函数