代码之家  ›  专栏  ›  技术社区  ›  timday

寻找对导数精度持放松态度的ODE积分器/解算器

  •  1
  • timday  · 技术社区  · 17 年前

    我有一个(一阶)常微分方程系统,计算导数相当昂贵。

    然而,可以在给定的误差范围内以相当低的成本计算导数,这是因为导数是从收敛序列计算的,并且可以将范围放在丢弃项的最大贡献上,或者通过使用存储在kd树/八叉树查找表中的预计算范围信息。

    不幸的是,我还没有找到任何能从中受益的通用ODE解算器;它们似乎都只是给你坐标,想要得到准确的结果。(请注意,我不是ODE方面的专家;我熟悉龙格库塔(Runge Kutta),这是《数字回归》一书中的材料,LSODE和Gnu科学图书馆的解算器)。

    (对于我见过的所有解决方案,你提供了一个 derivs 接受 t x ,并返回 dx/dt 返回但理想的情况下,我要找一个能回叫的 T x s ,并收到 dx/dt_min 和 dx/dt_max 阵列返回,导数范围保证在要求的精度范围内。(可能有许多同样有用的变体)。

    任何指向解决方案的指针,如果是针对这类问题设计的,或者是解决问题的其他方法(我不敢相信我是第一个想要这样的东西的人),都将不胜感激。

    7 回复  |  直到 12 年前
        1
  •  1
  •   quant_dev    17 年前

    粗略地说,如果你知道f'到绝对误差eps,并且从x0到x1积分,那么导数中的误差产生的积分误差将是<=每股收益*(x1-x0)。还有一个离散化错误,来自ODE解算器。考虑大EPS*(X1-X0)可以给你和给ODE求解器提供F值,用误差lt=计算。EPS

        2
  •  1
  •   Jim    17 年前

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

    在许多算法中, 例如, 非线性方程求解,f(x)=0,导数f’(x)的估计值是牛顿方法中所需要的全部,因为你只需要沿着答案的“一般方向”进行。

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

        3
  •  1
  •   timday    17 年前

    derivs 函数基本上返回间隔。使用区间算术的积分器将保持x作为区间。我所感兴趣的是在 x 他在期末考试中 t . 一个明显的方法是迭代地重新积分,提高样本的质量,在每次迭代中引入最大的误差,直到我们最终得到一个具有可接受范围的结果(尽管就总体效率而言,这听起来像是一种“比疾病更糟糕的治疗”)。我怀疑自适应步长控制可以很好地适应这种方案,选择步长可以使“隐式”离散化误差与“显式误差”(即区间范围)相比较。

    不管怎样,谷歌搜索“ode解算器区间算法”或只是“区间ode”会发现大量有趣的新的相关内容( VNODE 特别是其参考文献)。

        4
  •  1
  •   Jed    16 年前

    如果你有一个刚性系统,你将使用某种形式的隐式方法,在这种情况下,导数只在牛顿迭代中使用。使用近似雅可比矩阵会使牛顿迭代产生严格的二次收敛,但这通常是可以接受的。或者(大多数情况下,如果系统较大),您可以使用无雅可比矩阵的牛顿-克雷洛夫方法来求解阶段,在这种情况下,近似雅可比矩阵仅成为一个预条件,并且在牛顿迭代中保持二次收敛。

        5
  •  0
  •   gnovice    17 年前

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

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

        6
  •  0
  •   Mike Dunlavey    17 年前

    我不确定我的贡献有多大,但在制药建模领域,我们使用LSODE、DVERK和DGPADM。DVERK是一个很好的快速简单的5/6阶龙格库塔解算器。DGPADM是一个很好的矩阵指数求解器。若你们的常微分方程是线性的,那个么矩阵指数是目前为止最好的。但你的问题有点不同。

    顺便说一句,T参数只是为了一般性。我从未见过一个真正的系统依赖于T。

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

    补充:如果你在做轨道模拟,在我看来,我听说过基于圆锥曲线的特殊方法。

        7
  •  0
  •   Sam Harwell    16 年前

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

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

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