常见 ODE 问题疑难解答
本主题描述在使用求解器函数(ode45
、ode15s
等)求解 ODE 时可能遇到的常见问题解答。
误差容限
疑问或问题 | 回答 |
---|---|
如何选择误差阈值 |
粗略地讲,这意味着您希望 |
我希望求得达到计算机精度的答案。为什么不能直接将 | 可以接近计算机精度,但不能如此接近。求解器不允许 |
我如何通知求解器我并不在乎如何获取某个解分量的正确答案? | 可以增大与此解分量相对应的绝对误差容限 |
问题规模
疑问或问题 | 回答 |
---|---|
使用 ODE 套件能够解算多大的问题? | 主要限制在于内存和时间。在每个时间步长中,适用于非刚性问题的求解器分配长度为 如果问题是非刚性问题,或者使用的是 |
我解算的方程组非常大,但是我仅关心其中几个 | 有。 |
启动积分有哪些成本,如何减少启动成本? | 当求解器尝试查找适用于问题标量的步长时,会带来最大的启动成本。如果您碰巧知道适当的步长,请使用 |
积分器采用的第一个步长太大,并且错过重要行为。 | 使用 |
解分量
疑问或问题 | 回答 |
---|---|
解似乎与我的预期不符。 | 如果您的预期是正确的,则从默认值开始减小误差容限。需要较小的相对误差容限才能正确解算在“较长”区间积分的问题,以及不稳定性适中的问题。 检查是否存在在某段时间内小于其绝对误差容限的解分量。如果是这种情况,则表明您对这些分量中的正确位数未做任何要求。对于这些分量而言,这可能是可接受的,但无法精确计算这些分量可能会降低依赖于这些分量的其他分量的精度。 |
我的绘图不够平滑。 | 增大求解器中 |
我在计算解时绘制解,此解看似正常,但代码在某个点出现问题。 | 首先验证 ODE 函数在出现问题的位置附近是否平滑。如果不平滑,则求解器必须采用较小步长才能解决此问题。将积分区间分解为多个片段,使 ODE 函数在其上显示为平滑函数,可能会有帮助。 如果此函数非常平滑,并且代码采用极小的步长,则您可以尝试用非专用于刚性问题的求解器来解算刚性问题。改用刚性求解器 |
如果我有最终值但没有初始值,应该怎么办? | ODE 套件的所有求解器都允许您按时间向前或向后解算。这些求解器的语法为 |
我的积分过程异常缓慢,使用了太多的时间步。 | 首先,检查并确保 如果 ODE 函数在 最后,确保以有效方式编写 ODE 函数。求解器会在 ODE 函数中多次计算导数。数值积分的成本在很大程度上依赖于计算 ODE 函数的成本。请不要在每次计算中重新计算复杂的常量参数,而应将其存储到全局变量中,或者对这些参数仅计算一次并将其传递给嵌套函数。 |
我确定解在 | 如果您确定在 如果微分方程具有周期性系数或解,通过将最大步长限制为此周期的长度,确保求解器不会跨越多个周期。 |
问题类型
求解器可否处理使用直线法离散的偏微分方程 (PDE)? | 可以,因为离散生成 ODE 方程组。根据离散的情况,可能具有一种 ODE 求解器已考虑到的与质量矩阵相关的方程组形式。此方程组往往为刚性方程组。如果 PDE 为抛物线,或现象发生的时间跨度极其不同(如流体中的化学反应),即属于这种情况。在这种情况下,请使用下列四个刚性求解器中的一个: 如果存在多个方程,则使用 如果方程组不是刚性方程组,或者刚性不太强,则 您可以使用 MATLAB® PDE 求解器 |
可否求一组示例数据的积分? | 不能直接求积分。可转为通过插值或其他数据拟合方法将数据表示为函数。此函数的平滑性至关重要。样条曲线等分段多项式拟合看似平滑,但对求解器而言却并非如此;当拟合导数包含曲折时,求解器采用较小的步长。请使用平滑的函数来表示数据,或者使用对平滑性不太敏感的某个低阶求解器( |
另请参阅
odeset
| odeget
| deval
| odextend