MATLAB 数学应用 微分方程 边界值问题 求解边界值问题

本文介绍了MATLAB中解决边界值问题(BVP)的工具bvp4c和bvp5c,它们用于求解常微分方程(ODE)的解,满足特定边界条件。解的初始估计值和未知参数的处理是关键,bvp4c和bvp5c在精度和误差控制方面有所不同。奇异BVP的处理也在讨论范围内。求解器通过迭代调整网格和参数来找到满足条件的解,并提供了deval函数用于解的评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在边界值问题 (BVP) 中,目标是求常微分方程 (ODE) 的解,该解还需满足某些指定的边界条件。边界条件指定积分区间中两个或多个位置处的解的值之间的关系。在最简单的情形中,边界条件适用于区间的开始和结束(即边界)。

MATLAB中BVP求解器 bvp4c 和 bvp5c 用于处理以下形式的 ODE 方程组:

y′=f(x,y)

其中:

  • x 是自变量
  • y 是因变量
  • y’ 表示 y 关于 x 的导数,也写为 dy/dx

边界条件

在两点 BVP 的最简单情形中,ODE 的解在区间 [a, b] 中求得,并且必须满足边界条件

g(y(a),y(b))=0 .

要指定给定 BVP 的边界条件,您必须:

  • 编写 res = bcfun(ya,yb) 形式的函数,如果涉及未知参数,则使用 res = bcfun(ya,yb,p) 形式。将此函数作为第二个输入参数提供给求解器。该函数返回 res,这是在边界点处的解的残差值。例如,如果 y(a) = 1 且 y(b) = 0,则边界条件函数为
function res = bcfun(ya,yb)
res = [ya(1)-1
       yb(1)];
end
  • 在解的初始估计值中,网格中的第一个和最后一个点指定强制执行边界条件的点。对于上述边界条件,您可以指定 bvpinit(linspace(a,b,5),yinit) 来对 a 和 b 强制执行边界条件。

MATLAB 中的 BVP 求解器还适用于包含下列各项的其他类型问题:

  • 未知参数 p
  • 解具有奇异性
  • 多点条件(将积分区间分成若干区域的内边界)

在多点边界条件的情形下,边界条件应用于积分区间中两个以上的点。例如,可能要求在区间的开始处、中间处和结束处的解为零。有关如何指定多点边界条件的详细信息,请参阅 bvpinit。

解的初始估计值

与初始值问题不同,边界值问题的解可以是:

  • 无解
  • 有限个解
  • 无限多个解

求解 BVP 过程的重要部分是提供所需解的估计值。估计值的准确与否对求解器性能甚至是能否成功计算来说至关重要。

使用 bvpinit 函数为解的初始估计值创建结构体。求解器 bvp4c 和 bvp5c 接受此结构体作为第三个输入参数。

为解创建良好的初始估计值更像是一门艺术,而不是一门科学。不过,仍有一些常规指导原则,包括:

确保初始估计值满足边界条件,因为解也需要满足这些边界条件。如果问题包含未知参数,则参数的初始估计值也应该满足边界条件。

尝试将关于实际问题或预期解的信息尽可能多地纳入初始估计值。例如,如果解应该振荡或者有一定数量的符号变化,则初始估计值也应该如此。

考虑网格点的位置(解的初始估计值的 x 坐标)。BVP 求解器会在求解过程中调整这些点,因此您不需要指定太多网格点。最佳做法是在解会快速变化的位置附近指定几个网格点。

如果在较小区间内有一个已知的、更简单的解,则将它用作较大区间内的初始估计值。通常,您可以将一个问题作为一系列相对简单的问题来求解,这种做法称为延拓。使用延拓时,可以使用一个问题的解作为求解下一个问题的初始估计值,从而将一系列简单问题连接起来。

查找未知参数

通常,BVP 会涉及需要同时求解的未知 p 参数。ODE 和边界条件变为

y′=f(x,y,p)
g(y(a),y(b),p)=0

在此情况下,边界条件必须足以确定参数 p 的值。

您必须为求解器提供任何未知参数的初始估计值。当调用 bvpinit 来创建结构体 solinit 时,请在第三个输入参数 parameters 中指定初始估计值向量。

solinit = bvpinit(x,v,parameters)

此外,用于编写 ODE 方程和边界条件代码的函数 odefun 和 bcfun 都必须具有第三个参数。

dydx = odefun(x,y,parameters)
res = bcfun(ya,yb,parameters)

求解微分方程时,求解器会调整未知参数的值以满足边界条件。求解器会在 sol.parameters 中返回未知参数的最终值。

奇异 BVP

bvp4c 和 bvp5c 可对以下形式的一类奇异 BVP 求解

y′=1xSy+f(x,y)y' = \dfrac{1}{x}Sy + f(x, y)y=x1Sy+f(x,y)
0=g(y(0),y(b)).0=g(y(0),y(b)).0=g(y(0),y(b)).

该求解器还可以接受以下形式的问题的未知参数

y′=1xSy+f(x,y,p)y' = \dfrac{1}{x}Sy + f(x,y,p)y=x1Sy+f(x,y,p)
0=g(y(0),y(b),p).0=g(y(0),y(b),p).0=g(y(0),y(b),p).

奇异问题必须位于 [0,b] 区间上,且 b > 0。使用 bvpset 将常量矩阵 S 作为 ‘SingularTerm’ 选项的值传递给求解器。x = 0 时的边界条件必须与平滑解 Sy(0) = 0 的必要条件一致。解的初始估计值也应该满足此条件。

当您求解奇异 BVP 时,求解器要求您的函数 odefun(x,y) 只返回方程中 f(x, y) 项的值。涉及 S 的项由求解器使用 ‘SingularTerm’ 选项单独处理。

BVP 求解器的选择

MATLAB 提供了求解器 bvp4c 和 bvp5c 来求解 BVP。在大多数情况下,您可以互换使用这些求解器。这些求解器之间的主要区别在于 bvp4c 实现四阶公式,而 bvp5c 实现五阶公式。

除两个求解器之间的误差容限含义以外,bvp5c 函数的使用方法与 bvp4c 完全类似。如果 S(x) 近似于解 y(x),则 bvp4c 控制残差 |S′(x) – f(x,S(x))|。这种方法间接控制真误差 |y(x) – S(x)|。使用 bvp5c 直接控制真误差。

求解器说明
bvp4cbvp4c 是一个有限差分代码,此代码实现 3 阶段 Lobatto IIIa 公式。这是配置公式,并且配置多项式会提供在整个积分区间中处于四阶精度的 C1 连续解。网格选择和误差控制均基于连续解的残差。配置方法使用点网格将积分区间分为子区间。通过对源于边界条件以及所有子区间上配置条件的线性代数方程全局组求解,求解器会确定数值解。然后,求解器会估计每个子区间上数值解的误差。如果解不满足容差标准,则求解器会调整网格并重复计算过程。您必须提供初始网格的点以及网格点处解的初始近似估计。
bvp5cbvp5c 是一个有限差分代码,此代码实现 4 阶段 Lobatto IIIa 公式。这是配置公式,并且配置多项式会提供在整个 [a,b] 中具有一致五阶精度的 C1 连续解。该公式作为隐式 Runge-Kutta 公式实现。bvp5c 直接对代数方程求解;然而,bvp4c 使用解析压缩法。bvp4c 直接处理未知参数;而 bvp5c 使用未知参数的平凡微分方程扩充方程组。

解的计算

在 bvp4c 和 bvp5c 中实现的配置方法在积分区间 [a,b] 上产生 C1 连续解。可以使用求解器返回的辅助函数 deval 和结构体 sol,在 [a,b] 中的任意点计算 S(x) 近似解。例如,要在网格点 xint 上计算解 sol,请使用以下命令

Sxint = deval(sol,xint)
deval 函数已向量化。对于向量 xint,Sxint 的第 i 列与解 y(xint(i)) 近似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

结冰架构

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

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

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

打赏作者

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

抵扣说明:

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

余额充值