程序包 org.hipparchus.ode


package org.hipparchus.ode

该程序包提供了用于解决普通微分方程问题的类。

该程序包解决形式为y'=f(t,y)的初值问题,其中t0y(t0)=y0已知。提供的积分器从t=t0t=t1计算y(t)的估计值。还可以获得相对于初始状态dy(t)/dy(t0)或相对于某些ODE参数dy(t)/dp的导数。

所有积分器都提供密集输出。这意味着除了在离散时间计算状态向量外,它们还提供了一种廉价的方法来获取时间步长之间的状态。它们通过扩展ODEStateInterpolator抽象类的类来实现,这些类在每个步骤结束时提供给用户使用。

所有积分器都处理基于切换函数的多个离散事件检测。这意味着积分器可以由用户指定的离散事件驱动。必要时缩短步骤以确保事件发生在步骤边界上(即使积分器是固定步长积分器)。当触发事件时,积分可以停止(这称为G-stop功能),状态向量可以更改,或者积分可以继续进行。后一种情况对于优雅处理微分方程中的不连续性并在接近不连续性时获得准确的密集输出非常有用。有关事件处理的更多信息,请参见org.hipparchus.ode.events

用户应该在自己的类中描述问题(在下面的图表中为UserProblem),这些类应该实现OrdinaryDifferentialEquation接口。然后,用户应该将其传递给他在所有实现ODEIntegrator接口的类中选择的积分器。

积分问题的解决方案通过两种方式提供。第一种针对简单使用:在积分过程结束时,状态向量被复制到ODEIntegrator.integrate方法的y数组中。第二种应该在整个积分过程中需要更深入的信息时使用。用户可以在调用ODEIntegrator.integrate方法之前将实现ODEStepHandler接口或将实现ODEFixedStepHandler接口的用户指定对象包装成StepNormalizer对象注册到积分器中。在积分过程中将适当调用用户对象,允许用户处理中间结果。默认的步骤处理程序什么也不做。

DenseOutputModel是一个特殊用途的步骤处理程序,能够存储所有步骤并在积分结束后提供对任何中间结果的透明访问。该类的一个重要特点是它实现了Serializable接口。这意味着可以将整个积分范围内的集成函数的完整连续模型序列化并在以后重用(如果存储在持久介质如文件系统或数据库中)或在其他地方(如果发送到另一个应用程序)。仅存储积分的结果,没有对积分问题本身的引用。

可以为特定需求开发自定义实现。例如,如果一个应用程序完全由积分过程驱动,则该应用程序的大部分代码将在专门针对该应用程序的步骤处理程序中运行。

一些积分器(简单的积分器)使用在创建时设置的固定步长。更高效的积分器使用内部处理的可变步长,以控制积分误差与指定精度的关系(这些积分器扩展了AdaptiveStepsizeIntegrator抽象类)。在这种情况下,每个成功步骤后调用的步骤处理程序显示可变步长。可以使用StepNormalizer类将可变步长转换为可以由实现ODEFixedStepHandler接口的类处理的固定步长。自适应步长积分器可以自动计算初始步长,但是如果用户更喜欢保留对积分的完全控制或自动猜测错误,则用户可以指定它。

固定步长积分器
名称 阶数
Euler 1
Midpoint 2
经典龙格-库塔 4
Gill 4
3/8 4
Luther 6
自适应步长积分器
名称 积分阶数 误差估计阶数
Higham and Hall 5 4
多姆和普林斯 5(4) 5 4
多姆和普林斯 8(5,3) 8 5和3
格雷格-布利尔施-斯托尔 可变(默认最多18个) 可变
亚当斯-巴什福斯 可变 可变
亚当斯-穆尔顿 可变 可变

在上表中,亚当斯-巴什福斯亚当斯-穆尔顿积分器显示为可变步长积分器。这是对使用Nordsieck向量表示的经典算法的扩展。