MATLAB 数学应用 微分方程

本文演示了如何使用 MATLAB 构造几种不同类型的微分方程并求解。MATLAB 提供了多种数值算法来求解各种微分方程:

  • 初始值问题
  • 边界值问题
  • 时滞微分方程
  • 偏微分方程

初始值问题

vanderpoldemo 是用于定义 van der Pol 方程的函数
d y 2 d t 2 − μ ( 1 − y 2 ) d y d t + y = 0 \dfrac{d^{2}_y}{d_{t^{2}}}-μ(1-y^{2})\dfrac{d_y}{d_t}+y=0 dt2dy2μ(1y2)dtdy+y=0

type vanderpoldemo % 加载对应vanderpoldemo.m文件内容

function dydt = vanderpoldemo(t,y,Mu)
dydt = [y(2); Mu*(1-y(1)^2)*y(2)-y(1)];

该方程写作包含两个一阶常微分方程 (ODE) 的方程组。将针对参数 μ 的不同值计算这些方程。为了实现更快的积分,您应该根据 μ 的值选择合适的求解器。

当 μ=1 时,任何 MATLAB ODE 求解器都能有效地求解 van der Pol 方程。ode45 求解器就是其中之一。该方程在域 [0,20] 中求解,初始条件为 y(0)=2 和 d y d t ∣ t = 0 = 0 \dfrac{d_y}{d_t}|_{t=0}=0 dtdyt=0=0

tspan = [0 20];
y0 = [2; 0];
Mu = 1;
ode = @(t,y) vanderpoldemo(t,y,Mu);
[t,y] = ode45(ode, tspan, y0);

plot(t,y(:,1))
xlabel('t')
ylabel('solution y')
title('van der Pol Equation, \mu = 1')

在这里插入图片描述

对于较大的 μ,问题将变为刚性。此标签表示拒绝使用普通方法计算的问题。这种情况下,要实现快速积分,需要使用特殊的数值方法。ode15s、ode23s、ode23t 和 ode23tb 函数可有效地求解刚性问题。

当 μ=1000 时,van der Pol 方程的求解使用 ode15s,初始条件相同。您需要将时间范围大幅度延长到 [0,3000] 才能看到解的周期性变化。

tspan = [0, 3000];
y0 = [2; 0];
Mu = 1000;
ode = @(t,y) vanderpoldemo(t,y,Mu);
[t,y] = ode15s(ode, tspan, y0);

plot(t,y(:,1))
title('van der Pol Equation, \mu = 1000')
axis([0 3000 -3 3])
xlabel('t')
ylabel('solution y')

在这里插入图片描述

边界值问题

bvp4c 和 bvp5c 可以求解常微分方程的边界值问题。

示例函数 twoode 将一个微分方程写作包含两个一阶 ODE 的方程组。此微分方程为
d y 2 d t 2 + ∣ y ∣ = 0 \dfrac{d_y^{2}}{d_{t^{2}}}+|y|=0 dt2dy2+y=0

type twoode % 加载对应twoode .m文件内容

function dydx = twoode(x,y)
dydx = [ y(2); -abs(y(1)) ];

函数 twobc 求解该问题的边界条件为:y(0)=0 和 y(4)=−2。

type twobc % 加载对应twobc .m文件内容

function res = twobc(ya,yb)
res = [ ya(1); yb(1) + 2 ];

在调用 bvp4c 之前,您必须为要在网格中表示的解提供一个猜想值。然后,求解器就像对解进行平滑处理一样修改网格。

bvpinit 函数以您可以传递给求解器 bvp4c 的形式设定初始猜想值。对于 [0 1 2 3 4] 的网格以及 y(x)=1 和 y’(x)=0 的常量猜想值,对 bvpinit 的调用为:

solinit = bvpinit([0 1 2 3 4],[1; 0]);

利用这个初始猜想值,您可以使用 bvp4c 对该问题求解。使用 deval 计算 bvp4c 在某些点返回的解,然后绘制结果值。

sol = bvp4c(@twoode, @twobc, solinit);

xint = linspace(0, 4, 50);
yint = deval(sol, xint);
plot(xint, yint(1,:));
xlabel('x')
ylabel('solution y')
hold on

在这里插入图片描述

此特定的边界值问题实际上有两种解。通过将初始猜想值更改为 y(x)=−1 和 y’(x)=0,可以求出另一个解。

solinit = bvpinit([0 1 2 3 4],[-1; 0]);
sol = bvp4c(@twoode,@twobc,solinit);

xint = linspace(0,4,50);
yint = deval(sol,xint);
plot(xint,yint(1,:));
legend('Solution 1','Solution 2')
hold off

在这里插入图片描述

时滞微分方程

dde23、ddesd 和 ddensd 可以求解具有各种时滞的时滞微分方程。示例 ddex1、ddex2、ddex3、ddex4 和 ddex5 构成了这些求解器的迷你使用教程。

ddex1 示例说明如何求解微分方程组

y 1 ′ ( t ) = y 1 ( t − 1 ) y_1^{'}(t)=y_1(t-1) y1(t)=y1(t1)
y 2 ′ ( t ) = y 1 ( t − 1 ) + y 2 ( t − 0.2 ) y_2^{'}(t)=y_1(t-1)+y_2(t-0.2) y2(t)=y1(t1)+y2(t0.2)
y 3 ′ ( t ) = y 2 ( t ) y_3^{'}(t)=y_2(t) y3(t)=y2(t)

您可以使用匿名函数表示这些方程

ddex1fun = @(t,y,Z) [Z(1,1); Z(1,1)+Z(2,2); y(2)];

问题的历史解(t≤0 时)固定不变:

y 1 ′ ( t ) = 1 y_1^{'}(t)=1 y1(t)=1
y 2 ′ ( t ) = 1 y_2^{'}(t)=1 y2(t)=1
y 3 ′ ( t ) = 1 y_3^{'}(t)=1 y3(t)=1

您可以将历史解表示为由 1 组成的向量。

ddex1hist = ones(3,1);

采用二元素向量表示方程组中的时滞。

lags = [1 0.2];

将函数、时滞、历史解和积分区间 [0,5] 作为输入传递给求解器。求解器在整个积分区间生成适合绘图的连续解。

sol = dde23(ddex1fun, lags, ddex1hist, [0 5]);

plot(sol.x,sol.y);
title({'An example of Wille and Baker', 'DDE with Constant Delays'});
xlabel('time t');
ylabel('solution y');
legend('y_1','y_2','y_3','Location','NorthWest');

在这里插入图片描述

偏微分方程

pdepe 使用一个空间变量和时间对偏微分方程求解。示例 pdex1、pdex2、pdex3、pdex4 和 pdex5 构成了 pdepe 的迷你使用教程。

此示例问题使用函数 pdex1pde、pdex1ic 和 pdex1bc。

pdex1pde 定义微分方程

π 2 ∂ u ∂ t = ∂ ∂ x ( ∂ u ∂ x ) π^{2}\dfrac{∂_u}{∂_t}=\dfrac{∂}{∂_x}(\dfrac{∂_u}{∂_x}) π2tu=x(xu)

type pdex1pde

function [c,f,s] = pdex1pde(x,t,u,DuDx)

c = pi^2;
f = DuDx;
s = 0;

pdex1ic 设置初始条件

u(x,0)=sinπx.

type pdex1ic

function u0 = pdex1ic(x)

u0 = sin(pi*x);

pdex1bc 设置边界条件

u ( 0 , t ) = 0 , u(0,t)=0, u(0,t)=0,
π e − t + ∂ ∂ x u ( 1 , t ) = 0 πe^{-t}+\dfrac{∂}{∂_x}u(1,t)=0 πet+xu(1,t)=0

type pdex1bc

function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t)

pl = ul;
ql = 0;
pr = pi * exp(-t);
qr = 1;

pdepe 需要提供空间离散 x 和时间向量 t(您要获取解快照的时间点)。使用包含 20 个节点的网格求解此问题,并请求五个 t 值的解。提取解的第一个分量并绘图。

x = linspace(0,1,20);
t = [0 0.5 1 1.5 2];
sol = pdepe(0,@pdex1pde,@pdex1ic,@pdex1bc,x,t);

u1 = sol(:,:,1);

surf(x,t,u1);
xlabel('x');
ylabel('t');
zlabel('u');

在这里插入图片描述

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
matlab中的微分方程-matlab中的微分方程.doc 1510 matlab中的微分方程 第1节  Matlab能够处理什么样的微分方程Matlab提供了解决包括解微分方程在内的各种类型问题的函数: 1. 常规微分方程(ODEs)的初始值问题 初值问题是用MATLAB ODE求解器解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用ODE45,对刚性度(?stiff)问题采用ODE15S。(对于stiffness的解释,请参照“什么是Stiffness”一节。) 2. 微分-代数方程(DAEs)的初值问题 在那些守恒定律规定一些变量之间满足常数关系领域经常遇到这类问题。Matlab 可以用ODE15S 或者 ODE23T解决索引(index)为1的DAEs。(对于索引的解释,请参阅“DAEs与他们的索引”一章。) 3. 边界值问题(BVPs) 这种通常要求微分方程在两边都具有特殊的条件组成。尽管他们通常不象IVPs那样经常遇到,但是他们也是工程应用中比较常见的问题。可以利用函数BVP4C来解决这类问题。 4. 时延微分方程(DDEs) 这类微分方程包含了独立变量的延迟。他们在生物与化学模型这类大量的应用中遇到,可以通过DDE23来解决这类问题。 5. 偏微分方程(PDEs) 采用PDEPE可以解决一维时空的抛物面与椭圆方程的初值、边界值的问题。而那些对更加多的一般的偏微分方程感兴趣的可以利用PDE工具箱。 更多的matlab的综合应用技术的信息请参阅Solution8314。 更多的有关matlab采用的各种求解器的算法的信息请查看下面的URLs: ● ODE 函数 ● BVP 函数 ● DDE 函数 ● PDE 函数 第2节 可以从什么地方获得更多的指导与附加信息?    可以从MATLAB Center、网站的新闻组、文件交换点可以获得一系列资料,可以进一步解释MATLAB解决各种方程(ODE,DAE,BVP,DDE)的求解器的算法和使用。你可以下载各种方程的文章与手册,他们通常带有大量的实例。   可以从 matlab自带的帮助文件的 Mathematics|Differential Equations下找到使用指导。   Cleve Moler的《Numerical Computing with MATLAB》的第七章详细讨论了OEDs的解法,并附带有大量的实例与简单的问题练习。    第3节 对ODE求解器的语法存在有些什么变化? 在MATLAB6.5(R13)中应用ODE求解器求解的首选语法是: [t,y]=odesolver(odefun,tspan,y0,options,parameter1,parameter2,…,parameterN); odesolver 是你采用的求解器,例如ODE45或者ODE15S。odefun是微分方程的定义函数,所以odefun定义独立参数(典型的是时间t)的导数y‘ 以及y和其他的参数。在MATLAB6.5(R13)中,推荐使用函数句柄作为odefun。 例如,ode45(@xdot,tspan,y0),而不是用 ode45('xdot',tspan,y0)。 请看采用函数句柄的好处的文档: 采用函数句柄传递你定义MATLAB求解器计算的量、例如大规模矩阵或者Jacobian模式的函数。 如果你喜好采用字符串儿传递你的函数,matlab求解器将回溯匹配。 在老的matlab版本里,通过传递标志来规定求解器的状态和恰当的计算。在MATALB6.0以及其后的版本中,这就没有必要了,可以从matlab自带的文档中发现这个差别。 如果里采用的matlab的ODE求解器的老的语法,你可以看看我们FTP站点上的各种求解器的老的实例: ftp://ftp.mathworks.com/pub/doc/papers/ 前面的站点包含了BVP,DAE与DDE这三个方向的采用老的语法的实例。你可以在下面的站点中找到应用ODE45与ODE23的实例: ftp://ftp.mathworks.com/pub.mathworks/toolbox/matlab/funfun 你可以在MATLAB Center的文件交换站点查看这些例子的更新版本。 第4节  如何减小ODE的阶次? 求解一阶ODE的代码是很直接的。然而,二阶或者三阶的ODE不能够直接应用求解。你必须先将高阶的ODE改写成一阶的ODEs系统,使得它可以采用MATLAB ODE求解器。 这是一个如何将二阶微分方程改写成两个一阶微分
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结冰架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值