在边界值问题 (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)-1yb(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′=x1​Sy+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′=x1​Sy+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 直接控制真误差。

求解器 说明
bvp4c bvp4c 是一个有限差分代码,此代码实现 3 阶段 Lobatto IIIa 公式。这是配置公式,并且配置多项式会提供在整个积分区间中处于四阶精度的 C1 连续解。网格选择和误差控制均基于连续解的残差。配置方法使用点网格将积分区间分为子区间。通过对源于边界条件以及所有子区间上配置条件的线性代数方程全局组求解,求解器会确定数值解。然后,求解器会估计每个子区间上数值解的误差。如果解不满足容差标准,则求解器会调整网格并重复计算过程。您必须提供初始网格的点以及网格点处解的初始近似估计。
bvp5c bvp5c 是一个有限差分代码,此代码实现 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)) 近似。

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

  1. MATLAB 数学应用 微分方程

    本文演示了如何使用 MATLAB 构造几种不同类型的微分方程并求解.MATLAB 提供了多种数值算法来求解各种微分方程: 初始值问题 边界值问题 时滞微分方程 偏微分方程 初始值问题 vanderpo ...

  2. MATLAB 数学应用 微分方程 时滞微分方程 具有常时滞的DDE

    本文讲述了如何使用 dde23 对具有常时滞的DDE(时滞微分方程)方程组求解. 方程组为: y 1 ′ ( t ) = y 1 ( t − 1 ) y'_1(t)=y_1(t−1) y1′​(t)= ...

  3. MATLAB 数学应用 微分方程 时滞微分方程

    时滞微分方程包含的项的值依赖于先前时间的解.时滞可以固定不变.与时间相关或与状态相关,而求解器函数(dde23.ddesd 或 ddensd)的选择取决于方程中的时滞类型.通常,时滞将导数的当前值与某 ...

  4. MATLAB 数学应用 微分方程 边界值问题 使用延拓求解BVP问题

    本文讲述了如何使用延拓求解难以进行数值求解的边界值问题,延拓实际上是将问题分解成一系列更简单的问题. 对于 0<e≪1,考虑如下微分方程 ey′′+xy′=−eπ2cos(πx)−πxsin(π ...

  5. MATLAB 数学应用 微分方程 边界值问题 求解具有未知参数的BVP

    本文说明如何使用 bvp4c 求解具有未知参数的边界值问题. 马蒂厄方程在区间 [0,π] 上定义为 y′′+(λ−2qcos(2x))y=0y'^{'} +(λ−2q cos(2x))y = 0y′ ...

  6. MATLAB 数学应用 微分方程 常微分方程 求解非刚性ODE

    本文介绍两个使用 ode45 来求解非刚性常微分方程的示例.MATLAB拥有三个非刚性 ODE 求解器. ode45 ode23 ode113 对于大多数非刚性问题,ode45 的性能最佳.但对于允许 ...

  7. 数学建模——微分方程模型的求解

    文章目录 微分方程的符号解法 微分方程数值解法 一些常用的微分方程模型(学习中,持续更新) Logistics模型 传染病模型 本文介绍微分方程的求解,不介绍微分方程的建立方法 微分方程的符号解法 求 ...

  8. MATLAB 数学应用 微分方程 时滞微分方程 中立型DDE

    本文讲述了如何使用 ddensd 求解中立型DDE(时滞微分方程),其中时滞出现在导数项中. 方程是: y ′ ( t ) = 1 + y ( t ) − 2 y ( t 2 ) 2 − y ′ ( ...

  9. MATLAB 数学应用 微分方程 时滞微分方程 具有不连续性的心血管模型DDE

    本文讲述了如何使用 dde23 对具有不连续导数的心血管模型求解. 方程组为: P ˙ a ( t ) = − 1 c a R P a ( t ) + 1 c a R P v ( t ) + 1 c ...

最新文章

  1. 小程序首页获取数据给数组赋值,实现加载更多,以及遇到的坑
  2. Android 工程报错解决 Unable to resolve target 'android-17'
  3. java中获取当前服务器的Ip地址
  4. TCP之超时重传机制
  5. android init(system/core/init/init.c)分析
  6. C++vector进行局部排序
  7. 采用lamp架构搭建discuz论坛
  8. 现实世界的Windows Azure 视频:新南威尔士州教育部(DET)利用Windows Azure实现在线科学测验...
  9. 【音效处理】Vibrato 简介
  10. java mcv_Spring和SpringMCV配置
  11. 用Apache James搭建本地邮件服务器
  12. OpenGL 渲染篇
  13. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_2_函数式接口的使用...
  14. 如何理解create_singlethread_workqueue是严格按照顺序执行的
  15. 【物理应用】基于matlab非序贯蒙特卡洛法评估风电系统【含matlab源码 766期】
  16. 《R数据可视化手册》——3.8 绘制百分比堆积条形图
  17. matlab clc、clear all含义意思
  18. 皮卡丘0.1.5V.GPC无敌版
  19. reactos 0.0.21 编译
  20. Runes——Dart

热门文章

  1. HTML5/CSS3 第一章基础
  2. 仿写小米网站首页 产品导航栏
  3. C++如何做字符串分割(5种方法)
  4. 一个小故事讲明白进程、线程、Kotlin 协程到底啥关系?
  5. VS2022+unity3D开发环境搭建
  6. 基于Unity3D开发交通基础仿真模型实战
  7. 初学者该如何快速入门Python?内附十年Python大老详细学习攻略
  8. MySQL安装及环境配置教程
  9. OpenStack Icehouse私有云实战部署
  10. php mutile 手册,Redis技术手册 - Lamp资深讲师|lamp小强|linux|php|javascript - OSCHINA - 中文开源技术交流社区...