1

我有一个(一阶)ODE 系统,计算导数相当昂贵。

然而,在给定的误差范围内,导数的计算成本要低得多,因为导数是从收敛序列计算的,并且边界可以放在丢弃项的最大贡献上,或者通过使用存储在 kd-tree 中的预先计算的范围信息/octree 查找表。

不幸的是,我还没有找到任何可以从中受益的通用 ODE 求解器;他们似乎都只是给你坐标并想要一个准确的结果。(请注意,我不是 ODE 方面的专家;我熟悉 Runge-Kutta、Numerical Recipies 书中的材料、LSODE 和 Gnu 科学图书馆的求解器)。

即对于我见过的所有求解器,您提供了一个derivs回调函数,接受 at和一个数组x,并返回一个返回数组dx/dt;但理想情况下,我正在寻找一个能提供回调txs和一系列可接受的错误,并接收dx/dt_mindx/dt_max返回数组的方法,其导数范围保证在所需的精度范围内。(可能有许多同样有用的变体)。

任何考虑到这种事情而设计的求解器的指针,或解决问题的替代方法(我不敢相信我是第一个想要这样的东西的人)将不胜感激。

4

7 回答 7

1

粗略地说,如果你知道 f' 到绝对误差 eps,并从 x0 积分到 x1,那么来自导数误差的积分误差将是 <= eps*(x1 - x0)。还有来自您的 ODE 求解器的离散化错误。考虑一下 eps*(x1 - x0) 对您来说有多大,并为 ODE 求解器提供使用 error <= eps 计算的 f' 值。

于 2009-02-01T17:28:31.620 回答
1

我不确定这是一个恰当的问题。

在许多算法中,例如,非线性方程求解,f(x) = 0,一个导数 f'(x) 的估计是用于像牛顿法这样的东西所需要的,因为你只需要在“大方向”的答案。

但是,在这种情况下,导数是您正在求解的(ODE)方程的主要部分 - 导数错误,您将得到错误的答案;这就像试图仅用 f(x) 的近似值来求解 f(x) = 0。

正如另一个答案所建议的那样,如果您将 ODE 设置为应用 f(x) + g(x),其中 g(x) 是一个错误项,您应该能够将导数中的错误与输入中的错误联系起来。

于 2009-02-04T19:21:22.513 回答
1

在考虑了更多之后,我想到区间算术可能是关键。我的derivs函数基本上返回间隔。使用区间算术的积分器会将 x 保持为区间。我感兴趣的只是x在 final 的 s 上获得足够小的误差界限t。一个明显的方法是迭代地重新集成,提高样本的质量,每次迭代都会引入最大的错误,直到我们最终得到一个具有可接受范围的结果(尽管这听起来可能是一种“比疾病更糟糕的治疗方法”)整体效率)。我怀疑自适应步长控制可以很好地适应这种方案,选择步长以保持“隐式”离散化误差与“显式误差”相当

无论如何,谷歌搜索“ode 求解器区间算术”或只是“区间 ode”会发现大量有趣的新内容和相关内容(特别是VNODE及其参考资料)。

于 2009-02-06T16:36:47.460 回答
1

如果您有一个刚性系统,您将使用某种形式的隐式方法,在这种情况下,导数仅在牛顿迭代中使用。使用近似雅可比行列式会花费您在牛顿迭代上的严格二次收敛,但这通常是可以接受的。或者(主要是在系统很大的情况下)您可以使用无雅可比 Newton-Krylov 方法来求解阶段,在这种情况下,您的近似雅可比只是一个预处理器,并且您在牛顿迭代中保持二次收敛。

于 2009-11-08T19:12:07.557 回答
0

您是否考虑过使用odeset?它允许您为 ODE 求解器设置选项,然后将选项结构作为第四个参数传递给您调用的任何求解器。您可能最感兴趣的错误控制属性(RelTol、AbsTol、NormControl)。不确定这是否正是您需要的那种帮助,但这是我能想到的最好的建议,几年前最后一次使用 MATLAB ODE 函数。

另外:对于用户定义的导数函数,您是否可以将公差硬编码到导数的计算中,或者您真的需要从求解器传递错误限制?

于 2009-02-01T23:04:42.453 回答
0

不确定我做出了多大贡献,但在制药建模领域,我们使用 LSODE、DVERK 和 DGPADM。DVERK 是一个不错的快速简单阶 5/6 Runge-Kutta 求解器。DGPADM 是一个很好的矩阵指数求解器。如果您的 ODE 是线性的,那么矩阵指数是迄今为止最好的。但是你的问题有点不同。

顺便说一句, T 论点只是为了一般性。我从未见过依赖于 T 的实际系统。

你可能正在进入新的理论领域。祝你好运!

补充:如果您正在进行轨道模拟,在我看来,我听说过用于此的特殊方法,基于圆锥截面曲线。

于 2009-02-04T19:03:14.670 回答
0

检查具有线性基函数和中点求积的有限元方法。求解以下 ODE 只需要对每个元素的 f(x)、k(x) 和 b(x) 进行一次评估:

-k(x)u''(x) + b(x)u'(x) = f(x)

答案将具有与您的评估误差成比例的逐点误差。

如果您需要更平滑的结果,您可以使用二次基函数,每个元素对上述每个函数进行 2 次评估。

于 2009-11-08T19:30:25.290 回答