类 GraggBulirschStoerIntegrator

所有已实现的接口:
ODEIntegrator

public class GraggBulirschStoerIntegrator extends AdaptiveStepsizeIntegrator
该类实现了用于常微分方程的Gragg-Bulirsch-Stoer积分器。

Gragg-Bulirsch-Stoer算法是目前可用的最有效算法之一,适用于平滑问题。它使用Richardson外推法来估计如果步长可以减小到零时的解。

该方法在积分过程中同时改变步长和阶数,以最小化计算成本。当需要非常高的精度时,它特别适用。该方法何时比高阶嵌入Runge-Kutta方法(如Dormand-Prince 8(5,3))更有效取决于问题。Hairer、Norsett和Wanner的著作中给出的结果显示,例如,在积分Saltzam-Lorenz方程时,当精度约为1e-6时,该方法比高阶方法更有效(作者指出这个问题对于第一次积分步骤中的误差非常敏感),在积分七体问题(比如pleiades问题,涉及准碰撞,自动步长控制至关重要)时,精度约为1e-11时该方法更有效。

该实现基本上是E. Hairer和G. Wanner的Fortran代码odex的Java重新实现。该代码的再分发政策可在此处找到,为方便起见,下面是再分发政策。

版权所有(c)2004年,Ernst Hairer

允许在源代码和二进制形式中重新分发和使用,无论是否进行修改,只要满足以下条件:

  • 源代码的再分发必须保留上述版权声明、此条件列表和以下免责声明。
  • 二进制形式的再分发必须在文档和/或其他提供的材料中重现上述版权声明、此条件列表和以下免责声明。

本软件由版权持有人和贡献者“按原样”提供,不提供任何明示或暗示的担保,包括但不限于对适销性和特定用途适用性的暗示担保。在任何情况下,无论是在合同、严格责任还是侵权行为(包括疏忽或其他情形)的任何理论下,都不应由权利人或贡献者对任何直接、间接、附带、特殊、惩罚性或后果性损害(包括但不限于替代商品或服务的采购、使用、数据或利润损失或业务中断)承担责任,即使已被告知可能发生此类损害。

  • 构造器详细资料

    • GraggBulirschStoerIntegrator

      public GraggBulirschStoerIntegrator(double minStep, double maxStep, double scalAbsoluteTolerance, double scalRelativeTolerance)
      简单构造函数。使用给定的步长边界构建一个Gragg-Bulirsch-Stoer积分器。所有调整参数均设置为默认值。默认步长处理程序不执行任何操作。
      参数:
      minStep - 最小步长(符号无关,无论积分方向,向前或向后),最后一步可以小于此值
      maxStep - 最大步长(符号无关,无论积分方向,向前或向后),最后一步可以小于此值
      scalAbsoluteTolerance - 允许的绝对误差
      scalRelativeTolerance - 允许的相对误差
    • GraggBulirschStoerIntegrator

      public GraggBulirschStoerIntegrator(double minStep, double maxStep, double[] vecAbsoluteTolerance, double[] vecRelativeTolerance)
      简单构造函数。使用给定的步长边界构建一个Gragg-Bulirsch-Stoer积分器。所有调整参数均设置为默认值。默认步长处理程序不执行任何操作。
      参数:
      minStep - 最小步长(即使是向后积分,也必须是正的),最后一步可以小于此值
      maxStep - 最大步长(即使是向后积分,也必须是正的)
      vecAbsoluteTolerance - 允许的绝对误差
      vecRelativeTolerance - 允许的相对误差
  • 方法详细资料

    • setStabilityCheck

      public void setStabilityCheck(boolean performStabilityCheck, int maxNumIter, int maxNumChecks, double stepsizeReductionFactor)
      设置稳定性检查控制。

      稳定性检查在外推方案的前几次迭代中执行。如果此测试失败,则拒绝该步骤并减小步长。

      默认情况下,测试在每个步骤最多进行两次迭代,每次迭代最多进行一次。默认步长减小因子为0.5。

      参数:
      performStabilityCheck - 如果为true,则执行稳定性检查,如果为false,则跳过检查
      maxNumIter - 执行检查的最大迭代次数(如果为负数或零,则迭代次数重置为默认值)
      maxNumChecks - 每次迭代执行的最大检查次数(如果为负数或零,则检查次数重置为默认值)
      stepsizeReductionFactor - 失败时的步长减小因子(如果小于0.0001或大于0.9999,则因子重置为默认值)
    • setControlFactors

      public void setControlFactors(double control1, double control2, double control3, double control4)
      设置步长控制因子。

      新的步长hNew由旧步长h计算得出:

       hNew = h * stepControl2 / (err/stepControl1)^(1/(2k + 1))
       

      其中err为缩放误差,k为外推方案的迭代次数(从0开始计数)。默认值为stepControl1为0.65,stepControl2为0.94。

      步长受以下限制:

       stepControl3^(1/(2k + 1))/stepControl4 <= hNew/h <= 1/stepControl3^(1/(2k + 1))
       

      默认值为stepControl3为0.02,stepControl4为4.0。

      参数:
      control1 - 第一个步长控制因子(如果小于0.0001或大于0.9999,则因子重置为默认值)
      control2 - 第二个步长控制因子(如果小于0.0001或大于0.9999,则因子重置为默认值)
      control3 - 第三个步长控制因子(如果小于0.0001或大于0.9999,则因子重置为默认值)
      control4 - 第四个步长控制因子(如果小于1.0001或大于999.9,则因子重置为默认值)
    • setOrderControl

      public void setOrderControl(int maximalOrder, double control1, double control2)
      设置阶数控制参数。

      Gragg-Bulirsch-Stoer方法在积分过程中同时改变步长和阶数,以最小化计算成本。每次外推步骤将阶数增加2,因此将使用的最大阶数始终为偶数,它是外推表中最大列数的两倍。

       如果w(k - 1) <= w(k) * orderControl1,则降低阶数
       如果w(k) <= w(k - 1) * orderControl2,则增加阶数
       

      其中w是每个阶数的单位步长工作表(函数调用次数除以步长),k是当前阶数。

      构造后的默认最大阶数为18(即最大列数为9)。默认值为orderControl1为0.8,orderControl2为0.9。

      参数:
      maximalOrder - 外推表中的最大阶数(如果阶数<=6或为奇数,则最大阶数重置为默认值)
      control1 - 第一个阶数控制因子(如果小于0.0001或大于0.9999,则因子重置为默认值)
      control2 - 第二个阶数控制因子(如果小于0.0001或大于0.9999,则因子重置为默认值)
    • setInterpolationControl

      public void setInterpolationControl(boolean useInterpolationErrorForControl, int mudifControlParameter)
      设置插值阶数控制参数。稠密输出的插值阶数为2k - mudif + 1。mudif的默认值为4,并且插值误差默认用于步长控制。
      参数:
      useInterpolationErrorForControl - 如果为true,则插值误差用于步长控制
      mudifControlParameter - 插值阶数控制参数(如果<= 0或>= 7,则参数重置为默认值)
    • integrate

      public ODEStateAndDerivative integrate(ExpandableODE equations, ODEState initialState, double finalTime) throws MathIllegalArgumentException, MathIllegalStateException
      将微分方程积分到给定时间。

      此方法解决初始值问题(IVP)。

      由于此方法存储一些在积分过程中在其公共接口中可用的内部状态变量(通过ODEIntegrator.getCurrentSignedStepsize()),因此它是线程安全的。

      参数:
      equations - 要积分的微分方程
      initialState - 初始状态(时间,主要状态向量和次要状态向量)
      finalTime - 积分的目标时间(可以设置为小于t0的值以进行反向积分)
      返回:
      最终状态,如果积分达到目标,则其时间将与finalTime相同,但如果某些ODEEventHandler在某个点停止积分,则可能不同。
      抛出:
      MathIllegalArgumentException - 如果积分步长太小
      MathIllegalArgumentException - 如果无法找到事件的位置
      MathIllegalStateException - 如果函数评估的数量超过限制