matlab使用教程(25)—常微分方程(ODE)选项

1.ODE 选项摘要

        解算 ODE 经常要求微调参数、调整误差容限或向求解器传递附加信息。本主题说明如何指定选项以及每个选项与哪些微分方程求解器兼容。

1.1 选项语法

        使用 odeset 函数创建 options 结构体,然后将其作为第四个输入参数传递给求解器。例如,要调整相对和绝对误差容限,请使用以下命令:
opts = odeset('RelTol',1e-2,'AbsTol',1e-5);
[t,y] = ode45(@odefun,tspan,y0,opts);
        如果您使用不带输入参数的 odeset 命令,MATLAB 将显示每个选项的可能值列表,并以花括号 {} 表示默认值。
        odeget 函数可以查询现有结构体中的选项值,您可以用该函数来根据条件动态更改选项值。例如,以下代码检测 Stats 是否设置为 'on' ,并根据需要更改其值:
if isempty(odeget(opts,'Stats'))
odeset(opts,'Stats','on')
end

1.2 选项与每个求解器的兼容性

        在 odeset 中,有些选项是通用的,可与任何求解器兼容,还有一些选项是特定于求解器的。下表总结了每个选项与不同求解器之间的兼容性。

        * 只有在解算不涉及质量矩阵的问题时,才对 ode15s ode23t ode23tb 求解器使用 NonNegative 参数。
        ** ode15i 的事件函数必须接受 yp 的第三个输入参数。

1.3 用法示例

        MATLAB 包含几个示例文件,说明了如何使用各种选项。例如,键入 edit ballode 查看使用 'Events' 指定事件函数的示例,或键入 edit batonode 查看使用 'Mass' 指定质量矩阵的示例。有关示例文件及其使用的选项的完整总结,请参阅 “ODE 示例和文件摘要” 。

2.ODE 事件位置

2.1 什么是事件位置?

        某些 ODE 方程组的解算难度部分在于确定停止求解的合适时间。积分区间中的最终时间可能由具体事件(而非数字)进行定义。从树上落下的苹果便是一个示例。ODE 求解器应当在苹果落地后立即停止,但您事前并不知道该事件会在何时发生。与之相似地,有些问题所涉及的事件则不会终止求解。沿行星轨道运行的卫星便是一个示例。这种情况下,您可能不希望提前停止积分,但仍希望检测到卫星每次围绕较大天体完成一个运行周期的时刻。
        在 ODE 的求解过程中,使用事件函数来检测发生特定事件的时刻。事件函数采用您指定的表达式,并在该表达式等于零时检测事件。它们还能在检测到事件时提示 ODE 求解器停止积分。

2.2 编写事件函数

        使用 odeset 函数的 'Events' 选项指定事件函数。事件函数必须具有一般形式
[value,isterminal,direction] = myEventsFcn(t,y)
        在 ode15i 的情况下,事件函数还必须接受 yp 的第三个输入参数。
        输出参数 value isterminal direction 均为向量,其第 i 个元素与第 i 个事件相对应:
        • value(i) 是描述第 i 个事件的数学表达式。当 value(i) 等于零时发生事件。
        • 如果当第 i 个事件发生时停止积分,则 isterminal(i) = 1 。否则为 0
        • 如果需要查找全零值(默认值),则 direction(i) = 0 。值为 +1 时仅在事件函数递增的位置查找零,值为 -1 时仅在事件函数递减的位置查找零。指定 direction = [] 将对所有事件使用默认值 0。再次考虑苹果从树上落下的情形。表示落体的 ODE 为
        初始条件为 y 0 = 1 y ′ 0 = 0 。您可以使用事件函数来确定 y t = 0 的时刻,即苹果落地的时刻。对于此问题,检测苹果何时落地的事件函数为
function [position,isterminal,direction] = appleEventsFcn(t,y)
position = y(1); % The value that we want to be zero
isterminal = 1; % Halt integration
direction = 0; % The zero can be approached from either direction
end

2.3 事件信息

        如果指定了事件函数,则使用三个额外的输出参数调用 ODE 求解器,如下所示
[t,y,te,ye,ie] = odeXY(odefun,tspan,y0,options)
        求解器返回的三个附加输出对应于检测到的事件:
        • te 是发生事件的时刻的列向量。
        • ye 包含 te 中的每个事件时刻对应的解值。
        • ie 包含事件函数返回的向量的索引。这些值指示求解器检测到的事件。
        您也可以使用单个输出来调用求解器,如下所示
sol = odeXY(odefun,tspan,y0,options)
        这种情况下,事件信息以 sol.te sol.ye sol.ie 的形式存储在结构体中。

2.4 局限性

        ODE 求解器采用的与事件函数配合使用的求根机制存在下列局限性:
        • 如果在积分的第一步即发生终止事件,则求解器会将该事件记录为非终止事件并继续积分。
        • 如果在第一步发生多个终止事件,则仅记录第一个事件,并且求解器会继续积分。
        • 零值由每步之间的符号交叉确定。因此,对于两步间有偶数个交叉的函数而言,可能会错失其零值。如果求解器步长跨越了多个事件,请尝试减小 RelTol AbsTol 以提高精度。也可以设置 MaxStep 以便为步长设置上限。调整 tspan 不会更改求解器所用的步长。

2.5 简单事件位置:弹球

        此示例说明如何编写一个与 ODE 求解器配合使用的简单事件函数。示例文件 ballode 将模拟弹球的运动。事件函数在球每次弹起时停止积分,然后使用新的初始条件重新开始积分。在球的弹跳过程中,积分多次停止并重新开始。弹球的方程为
function [value,isterminal,direction] = bounceEvents(t,y)
value = y(1); % Detect height = 0
isterminal = 1; % Stop the integration
direction = -1; % Negative direction only
        键入 ballode 以运行该示例并演示使用事件函数模拟球弹跳的过程。
ballode

2.6 高级事件位置:限制性三体问题

        此示例说明如何使用事件函数的定向分量。示例文件 orbitode 模拟限制性三体问题,其中一个主体环绕两个大得多的主体做轨道运行。事件函数将确定轨道中距离环绕主体最近和最远的点。由于事件函数在轨道最近点和最远点的值相同,因此将使用过零的方向来区分二者。限制性三体问题的方程为

        前两个解分量是微小物体的坐标,因此针对一个分量绘制另一个分量可以得到物体的轨迹。orbitode.m 中嵌套的事件函数将搜索两个事件。一个事件查找距离起点最远的点,另一个事件查找宇宙飞船返回到起点的点。即使积分器使用的步长并非通过事件位置确定,也会准确定位事件。在此示例中,指定过零方向的功能非常重要。返回到起点的点和距离起点最远的点具有相同的事件值,并由交叉方向来区分这两个点。为此行为编码的事件函数为

function [value,isterminal,direction] = orbitEvents(t,y)
% dDSQdt is the derivative of the equation for current distance. Local
% minimum/maximum occurs when this value is zero.
dDSQdt = 2 * ((y(1:2)-y0(1:2))' * y(3:4));
value = [dDSQdt; dDSQdt];
isterminal = [1; 0]; % stop at local minimum
direction = [1; -1]; % [local minimum, local maximum]
end
        键入 orbitode 以运行该示例。
orbitode
This is an example of event location where the ability to
specify the direction of the zero crossing is critical. Both
the point of return to the initial point and the point of
maximum distance have the same event function value, and the
direction of the crossing is used to distinguish them.
Calling ODE45 with event functions active...
Note that the step sizes used by the integrator are NOT
determined by the location of the events, and the events are
still located accurately.

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: matlab打靶法是一种数值方法,用于求解常微分方程的近似解。常微分方程是描述自然现象中变化的数学模型,求解这些方程能够帮助我们预测和理解物理、工程、生物等领域的现象。 matlab是一种高级数值计算软件,它提供了各种工具和函数来求解常微分方程。打靶法是其中一种常用的数值方法,也被称为射击法。它的基本思想是将常微分方程转化为一个求方程根的问题,并利用数值方法逐步逼近这些根,从而得到常微分方程的近似解。 使用matlab进行打靶法求解常微分方程的步骤如下: 1. 将常微分方程转化为一个方程根的问题。通常可以通过将方程变换为标准形式或者引入新的变量来实现。 2. 在matlab中定义目标函数。这个函数就是我们需要求解的方程根。将方程根的表达式写成一个函数,并输入到matlab中。 3. 在matlab中选择适当的数值方法。根据方程的特性和求解需求,选择合适的数值方法,如欧拉法、改进欧拉法、四阶龙格-库塔法等。 4. 在matlab中编写求解算法。根据选择的数值方法,编写相应的算法来逼近方程根。这通常涉及到逐步迭代计算和更新变量的过程。 5. 设置初始条件和精度要求。确定方程的初始条件(例如, 初始时刻和初始值)和求解的精度要求。 6. 运行matlab程序并获取结果。运行程序,matlab会根据设置的初始条件和精度要求进行计算,并输出方程的近似解。 需要注意的是,matlab打靶法求解常微分方程是一种数值逼近的方法,得到的解是近似解,并不一定完全准确。因此,在实际应用中,需要对结果进行验证和评估,确保解的可靠性和准确性。 ### 回答2: Matlab打靶法也被称为射线法或射线算法,是一种用于求解常微分方程ODE)数值解的方法。该方法是通过将ODE转化为一系列初始值问题(IVP),然后使用数值积分方法逐步逼近解。 具体步骤如下: 1. 将ODE转化为一系列初始值问题,即设定不同的初始条件。 2. 选择一个适当的数值积分方法,如欧拉法或龙格-库塔法等,在各个初始值点上进行数值积分。 3. 在每个初始值点上计算数值解,并将其与所需的目标值进行比较。 4. 根据比较结果,调整初始条件并进行下一次数值积分,直到达到所需的精度或满足停止准则。 5. 最终得到的数值解即为所求的常微分方程的解。 Matlab提供了一系列函数和工具箱来实现打靶法求解常微分方程。使用Matlab编程语言编写代码,可以轻松地实现打靶法的步骤。例如,可以使用“ode45”函数来进行数值积分,并在循环中不断调整初始条件,直到满足停止准则。 通过Matlab打靶法求解常微分方程不仅能高效地得到数值解,还可以通过调整初始条件的方式探索不同的解情况。此外,Matlab还提供了丰富的可视化工具,可以直观地展示求解过程和结果,有助于理解和分析问题。 总之,使用Matlab打靶法求解常微分方程是一种灵活、高效且可视化的方法,通过数值积分和初始条件不断调整,可以得到满足精度要求的数值解,并进一步分析和研究微分方程的性质。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

配电网和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值