matlab subs函数_2019数学建模国赛|Matlab 求解微分方程(组)

750c2baeb5b3088ef667f398e58ba67c.png

Matlab学习——求解微分方程(组)

3270be900330c6c7d6512c653e6c2710.png

1.在 Matlab 中,用大写字母 D 表示导数,Dy 表示 y 关于自变量的一阶导数,D2y 表示 y 关于自变量的二阶导数,依此类推.函数 dsolve 用来解决常微分方程(组)的求解问题,调用格式为

X=dsolve(‘eqn1’,’eqn2’,…)

如果没有初始条件,则求出通解,如果有初始条件,则求出特解系统缺省的自变量为 t。

2.函数 dsolve 求解的是常微分方程的精确解法,也称为常微分方程的符号解.但是,有大量的常微分方程虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解,在求常微分方程数值解方面,MATLAB 具有丰富的函数,将其统称为 solver,其一般格式为:

           [T,Y]=solver(odefun,tspan,y0)

说明:

    (1)solver 为命令 ode45、ode23、ode113、ode15s、ode23s、ode23t、ode23tb、ode15i 之一.

    (2)odefun 是显示微分方程 y '  = f (t , y) 在积分区间 tspan = [t 0 , t f ] 上从 t0 到 t f  用初始条件 y0 求解.

    (3)如果要获得微分方程问题在其他指定时间点 t 0 , t1 , t 2 , , t f  上的解,则令tspan = [t 0 , t1 , t 2 , t f ] (要求是单调的).

    (4)因为没有一种算法可以有效的解决所有的 ODE 问题,为此,Matlab 提供了多种求解器 solver,对于不同的 ODE 问题,采用不同的 solver

ef20b7932ee1b7f6724b82ee9ee311c6.png

3.在 matlab 命令窗口、程序或函数中创建局部函数时,可用内联函数 inline,inline 函数形式相当于编写 M 函数文件,但不需编写 M-文件就可以描述出某种数学关系.调用 inline 函数,只能由一个 matlab 表达式组成,并且只能返回一个变量,不允许[u,v]这种向量形式.因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用 inline 函数,inline 函数的一般形式为:

       FunctionName=inline(‘函数内容’, ‘所有自变量列表’)

例如:(求解 F(x)=x^2*cos(a*x)-b ,a,b 是标量;x 是向量 )在命令窗口输入:

Fofx=inline('x.^2.*cos(a.*x)-b','x','a','b');g

系统输出为:g=-1.5483 -1.7259注意:由于使用内联对象函数 inline 不需要另外建立 m 文件,所有使用比较方便,另外在使用 ode45 函数的时候,定义函数往往需要编辑一个 m 文件来单独定义,这样不便于管理文件,这里可以使用 inline 来定义函数。

例子:

一、ex(求精确解):

1. 求解微分方程 y ' + 2xy = xe-x2

syms x y; y=dsolve('Dy+2*x*y=x*exp(-x^2)','x')

运行结果:

3009e47f3e872034f3c3db668b749a69.png

2. 求微分方程 xy ' + y - e x  = 0 在初始条件 y (1) = 2e 下的特解并画出解函数的图形.

syms x y; y=dsolve('x*Dy+y-exp(1)=0','y(1)=2*exp(1)','x');ezplot(y)

运行结果:

0623632abcccb213a19650e933f93dc9.png

3. 求解微分方程组

06f213690231473fe56b3d43eddc9a0f.png

在初始条件x (t = 0)= 1, y (t =0 )= 0 下的特解,并画出解函数的图像。

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');

simplify(x);

simplify(y);

ezplot(x,y,[0,1.3]);axis auto

其中,simplify函数可以对符号表达式进行简化。以下是运行结果:

778592b0e2dd451f605efb2205b7a5ee.png

二、ex(近似解):

1. 求解微分方程初值问题的数值解,求解范围为区间 [0,0.5] 。

fun=inline('-2*y+2*x^2+2*x','x','y');

[x,y]=ode23(fun,[0,0.5],1);

plot(x,y,'o-')

6cbfb0223b664993b8d6a8b7f48bfc2f.png

2.求解微分方程

c00d6b027cbe250e165a0953df65f756.png

,y(0) = 1,y(0) = 0 的解,并画出解的图像。

通过变换,将二阶方程化为一阶方程组求解 . 令 2efb290d6d42be1f8cd2ffa89202324c.png,则 ea653207d2fc35679ca68d58db04f13b.png

编写 vdp.m 文件:

function fy=vdp(t,x)

fy=[x(2);7*(1-x(1)^2)*x(2)-x(1)];

end

命令行输入:

y0=[1;0]

[t,x]=ode45('vdp',[0,40],y0);

y=x(:,1);dy=x(:,2);

plot(t,y,t,dy)

4011d7ebe8297b235c75c8c068612a89.png

在使用ode45函数的时候,定义函数往往需要编辑一个 .m文件来单独定义,这样不便于管理文件,因此编写 inline 函数:

fy=inline('[x(2);7*(1-x(1)^2)*x(2)-x(1)]','t','x'),运行:

5d0387b5597be2f7a1a5747040679f88.png

结果一致!

三、ex(用 Euler 折线法求解):

Euler 折线法求解的基本思想是将微分方程初值问题a179e4e9600ef83e56268755523d3e07.png

 化成一个代数(差分)方程,主要步骤是用差商

f21ac652992ba343e798d8953a9bbb71.png

替代微商,于是

3e80dd819d66e28f038348cb99e62971.png

b57c5ddb6abe2523b709d0ce066469ed.png

从而1dde7680ab8e61dc5380efd00fc1e19a.png,于是

48e1f0178ab801c511534a5709421833.png

 1. 用 Euler 折线法求解微分方程初值问题

b7eeef6f8e99008da403a70a950f657b.png

的数值解(步长h取 0.4),求解范围为区间[0,2]

本题的差分方程为:4954f7409ee10262ba620c7c599c2f6c.png

clear;

f=sym('y+2*x/y^2');a=0;b=2;

h=0.4;

n=(b-a)/h+1;

x=0;

y=1;

szj=[x,y];%数值解

for i=1:n-1

y=y+h*subs(f,{'x','y'},{x,y});%subs,替换函数

x=x+h;

szj=[szj;x,y];

end;

szj;

plot(szj(:,1),szj(:,2))

说明:替换函数 subs 例如:输入 subs(a+b,a,4) 意思就是把 a 用 4 替换掉,返回 4+b,也可以替换多个变量,例如:subs(cos(a)+sin(b),{a,b},[sym('alpha'),2])分别用字符 alpha 替换 a 和 2 替换 b,返回 cos(alpha)+sin(2)。

供稿人: 李溶洋 审稿人: 林楠 排版: 新媒体中心 a6430e04090069b32599673db232ecb4.gif 126c1036fae6490f19681eefabfb7f67.png bfc4da52f72518ee54052cd537007d1a.png长按扫码关注
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值