数学实验 常微分方程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六 常微分方程的Matlab 解法

一、实验目的

1. 了解常微分方程的解析解。 2. 了解常微分方程的数值解。

3. 学习掌握MATLAB 软件有关的命令。

二、实验内容

一根长l 的无弹性细线,一段固定,另一端悬挂一个质量为m 的小球,在重力的作用下小球处于垂直的平衡位置。若使小球偏离平衡位置一个角度θ,让它自由,它就会沿圆弧摆动。在不考虑空气阻力的情况下,小球会做一定周期的简谐运动。利用牛顿第二定律得到如 下的微分方程

0)0(',)0(,sin "0===θθθθθmg ml

问该微分方程是线性的还是非线性的?是否存在解析解?如果不存在解析解,能否求出其近似解?

三、实验准备

MATLAB 中主要用dsolve 求符号解析解,ode45,ode23,ode15s 求数值解。

ode45是最常用的求解微分方程数值解的命令,对于刚性方程组不宜采用。ode23与ode45类似,只是精度低一些。ode12s 用来求解刚性方程组,是用格式同ode45。可以用help dsolve, help ode45查阅有关这些命令的详细信息.

四、实验方法与步骤

练习1 求下列微分方程的解析解 (1)b ay y +='

(2)1)0(',0)0(,)2sin(''==-=y y y x y (3)1)0(',1)0(',','==-=+=g f f g g g f f 方程(1)求解的MATLAB 代码为:

clear;

s=dsolve('Dy=a*y+b')

结果为

s =-b/a+exp(a*t)*C1

方程(2)求解的MATLAB 代码为:

clear;

s=dsolve('D2y=sin(2*x)-y','y(0)=0','Dy(0)=1','x') simplify(s) %以最简形式显示s

结果为

s =(-1/6*cos(3*x)-1/2*cos(x))*sin(x)+(-1/2*sin(x)+1/6*sin(3*x))*cos(x)+5/3*sin(x) ans =-2/3*sin(x)*cos(x)+5/3*sin(x) 方程(3)求解的MATLAB 代码为:

clear;

s=dsolve('Df=f+g','Dg=g-f','f(0)=1','g(0)=1') simplify(s.f) %s 是一个结构 simplify(s.g)

结果为

ans =exp(t)*cos(t)+exp(t)*sin(t) ans =-exp(t)*sin(t)+exp(t)*cos(t) 练习2 求解微分方程

,1)0(,1'=++-=y t y y

先求解析解,再求数值解,并进行比较。由

clear;

s=dsolve('Dy=-y+t+1','y(0)=1','t') simplify(s)

可得解析解为t

e t y -+=。下面再求其数值解,先编写M 文件fun8.m

%M 函数fun8.m

function f=fun8(t,y) f=-y+t+1;

再用命令

clear; close; t=0:0.1:1;

y=t+exp(-t); plot(t,y); %化解析解的图形

hold on; %保留已经画好的图形,如果下面再画图,两个图形和并在一起 [t,y]=ode45('fun8',[0,1],1);

plot(t,y,'ro'); %画数值解图形,用红色小圈画 xlabel('t'),ylabel('y')

结果见图6.7.1

图6.7.1 解析解与数值解

由图7.1可见,解析解和数值解吻合得很好。 下面我们讨论实验引例中的单摆问题.

练习3 求方程

0)0(',)0(,sin "0===θθθθθmg ml

的数值解.不妨取15)0(,8.9,1===θg l .则上面方程可化为

0)0(',15)0(,sin 8.9"===θθθθ

先看看有没有解析解.运行MATLAB 代码

clear;

s=dsolve('D2y=9.8*sin(y)','y(0)=15','Dy(0)=0','t') simplify(s)

知原方程没有解析解.下面求数值解.令',21θθ==y y 可将原方程化为如下方程组

⎪⎩⎪

⎨⎧====0)0(,15)0()

sin(8.9''21

1221y y y y y y

建立M 文件fun9.m 如下

%M 文件fun9.m

function f=fun9(t,y)

f=[y(2), 9.8*sin(y(1))]'; %f 向量必须为一列向量

运行MATLAB 代码

clear; close;

[t,y]=ode45('fun9',[0,10],[15,0]);

plot(t,y(:,1)); %画θ随时间变化图,y(:2)则表示'θ的值 xlabel('t'),ylabel('y1')

结果见图6.7.2

图6.7.2 数值解

由图6.7.2可见,θ随时间t 周期变化。

练习4 (刚性方程组求解)求下面刚性微分方程的解

⎪⎩⎪

⎨⎧==-=--=1

)0(,2)0(,

100'99.9901.0'21

22211y y y y y y y 使用dsolve 可知解析解为

)100ex p(),

100ex p()01.0ex p(21t y t t y -=-+-=

下面求数值解. 建立M 文件fun10.m 如下

%M 文件fun10.m

function f=fun10(t,y)

f=[-0.01*y(1)-99.99*y(2), -100*y(2)]';

运行MATLAB 代码

clear; close;

[t,y]=ode45('fun10',[0,10],[2,1]);

plot(t,y); text(1,1.1,'y1'); text(1,0.1,'y2'); xlabel('t'),ylabel('y')

结果见图6.7.3

图6.7.3 数值解

图6.7.3给人的感觉似乎是1y 始终大于0.5.但由21,y y 的解析解可知,当∞→t 时,两个分量

21,y y 均趋于0.2y 下降极快,0001.0)1.0(2

6.7.4).若用

clear; close;

[t,y]=ode45('fun10',[0,400],[2,1]); tstep=length(t) %求计算总步数 minh=min(diff(t)) %最小步长 maxh=max(diff(t)) %最大步长

结果为

tstep =48261

相关文档
最新文档