实验目的 实验内容 MATLAB 2 、学会用 Matlab 求微分方程的数值解. 实验软件 1 、学会用 Matlab 求简单微分方程的解析解. 1 、求简单微分方程的解析解. 2 、求微分方程的数值解.
求微分方程的数值解 (一)常微分方程数值解的定义 (二)建立数值解法的一些途径 (三)用 Matlab 软件求常微分方程的数值解 返 回
微分方程的解析解 求微分方程(组)的解析解命令 : dsolve(‘ 方程 1’, ‘ 方程 2’,…‘ 方程 n’, ‘ 初始条件 ’, ‘ 自变量 ’) To Matlab ( ff1 ) 结 果: u = tg(t-c)
解 输入命令 : y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x') 结 果 为 : y =3e -2x sin ( 5x ) To Matlab ( ff2 )
解 输入命令 : [x,y,z]=dsolve('Dx=2*x-3*y+3*z','Dy=4*x-5*y+3*z','Dz=4*x-4*y+2*z', 't') ; x=simple(x) % 将 x 化简 y=simple(y) z=simple(z) 结 果 为: x = (c 1 -c 2 +c 3 +c 2 e -3t -c 3 e -3t )e 2t y = -c 1 e -4t +c 2 e -4t +c 2 e -3t -c 3 e -3t +(c 1 -c 2 +c 3 )e 2t z = (-c 1 e -4t +c 2 e -4t +c 1 -c 2 +c 3 )e 2t To Matlab ( ff3 ) 返 回
微分方程的数值解 (一)常微分方程数值解的定义 在生产和科研中所处理的微分方程往往很复杂且大多 得不出一般解。而在实际上对初值问题,一般是要求得 到解在若干个点上满足规定精确度的近似值,或者得到 一个满足精确度要求的便于计算的表达式。 因此,研究常微分方程的数值解法是十分必要的。 返 回
(二)建立数值解法的一些途径 1 、用差商代替导数 若步长 h 较小,则有 故有公式: 此即欧拉法。
2 、使用数值积分 对方程 y’=f(x,y), 两边由 x i 到 x i+1 积分,并利用梯形公式,有: 实际应用时,与欧拉公式结合使用: 此即改进的欧拉法。 故有公式:
3 、使用泰勒公式 以此方法为基础,有龙格 - 库塔法、线性多步法等方 法。 4 、数值公式的精度 当一个数值公式的截断误差可表示为 O ( h k+1 )时 ( k 为正整数, h 为步长),称它是一个 k 阶公式。 k 越大,则数值公式的精度越高。 欧拉法是一阶公式,改进的欧拉法是二阶公式。 龙格 - 库塔法有二阶公式和四阶公式。 线性多步法有四阶阿达姆斯外插公式和内插公式。 返 回
(三)用 Matlab 软件求常微分方程的数值解 [t , x]=solver ( ’f’,ts,x 0,options ) ode45 ode23 ode113 ode15s ode23s 由待解 方程写 成的 m- 文件名 ts=[t 0 , t f ] , t 0 、 t f 为自 变量的初 值和终值 函数的 初值 ode23 :组合的 2/3 阶龙格 - 库塔 - 芬尔格算法 ode45 :运用组合的 4/5 阶龙格 - 库塔 - 芬尔格算法 自变 量值 函数 值 用于设定误差限 ( 缺省时设定相对误差 10 -3, 绝对误差 ), 命令为: options=odeset ( ’reltol’,rt,’abstol’,at ), rt , at :分别为设定的相对误差和绝对误差.
1 、在解 n 个未知函数的方程组时, x 0 和 x 均为 n 维向量, m- 文件中的待解方程组应以 x 的分量形式写成. 2 、使用 Matlab 软件求数值解时,高阶微分方程必须 等价地变换成一阶微分方程组. 注意 :
解 : 令 y 1 =x , y 2 =y 1 ’ 1 、建立 m- 文件 vdp1000.m 如下: function dy=vdp1000(t,y) dy=zeros(2,1); dy(1)=y(2); dy(2)=1000*(1-y(1)^2)*y(2)-y(1); 2 、取 t 0 =0 , t f =3000 ,输入命令: [T,Y]=ode15s('vdp1000',[0 3000],[2 0]); plot(T,Y(:,1),'-') 3 、结果如图 To Matlab ( ff4 )
解 1 、建立 m- 文件 rigid.m 如下: function dy=rigid(t,y) dy=zeros(3,1); dy(1)=y(2)*y(3); dy(2)=-y(1)*y(3); dy(3)=-0.51*y(1)*y(2); 2 、取 t 0 =0 , t f =12 ,输入命令: [T,Y]=ode45('rigid',[0 12],[0 1 1]); plot(T,Y(:,1),'-',T,Y(:,2),'*',T,Y(:,3),'+') 3 、结果如图 To Matlab ( ff5 ) 图中, y 1 的图形为实线, y 2 的图形为 “*” 线, y 3 的图形为 “+” 线. 返 回