接口 FieldODEEventDetector<T extends CalculusFieldElement<T>>
- 类型参数:
-
T
- 字段元素的类型
- 所有已知实现类:
-
AbstractFieldODEDetector
,EventSlopeFilterTest.FieldEvent
,FieldEventSlopeFilter
,StepFieldProblem
在解决ODE问题时,某些事件可以在离散时间触发。例如,当达到某个状态(G-stop功能)时,当事先未知确切日期时,或者当导数具有状态边界交叉时,就会发生这种情况。
这些事件被定义为当一个 g
切换函数的符号发生变化时发生。
由于事件仅依赖于问题并由独立的 时间 变量和状态向量触发,因此它们可以在几乎任何时间发生,事先未知。积分器将确保在步长内避免符号变化,当检测到此类事件时,它们将减小步长,以便将此事件准确放置在当前步骤的末尾。这保证了步长插值(始终具有一个步长范围)即使存在不连续性也是相关的。这与积分器提供的监视局部误差的步长控制无关(此事件处理功能适用于所有积分器,包括固定步长积分器)。
请注意,在Hipparchus 3.0之前,此接口中的方法位于 FieldODEEventHandler
接口和已废弃的 FieldEventHandlerConfiguration
接口中。这些接口已重新组织,以允许在事件检测和事件处理中使用不同的对象,从而允许用户重用具有自定义处理程序的预定义事件检测器。
- 从以下版本开始:
- 3.0
- 另请参阅:
-
方法概要
修饰符和类型方法说明g
(FieldODEStateAndDerivative<T> state) 计算切换函数的值。获取基础事件处理程序。获取事件处理程序检查之间的最大时间间隔。int
获取事件定位的迭代计数上限。获取用于检测状态事件的根查找算法。default void
init
(FieldODEStateAndDerivative<T> initialState, T finalTime) 在ODE积分开始时初始化事件处理程序。
-
方法详细资料
-
getMaxCheckInterval
FieldAdaptableInterval<T> getMaxCheckInterval()获取事件处理程序检查之间的最大时间间隔。- 返回:
- 事件处理程序检查之间的最大时间间隔
-
getMaxIterationCount
int getMaxIterationCount()获取事件定位的迭代计数上限。- 返回:
- 事件定位的迭代计数上限
-
getSolver
BracketedRealFieldUnivariateSolver<T> getSolver()获取用于检测状态事件的根查找算法。- 返回:
- 用于检测状态事件的根查找算法
-
getHandler
FieldODEEventHandler<T> getHandler()获取基础事件处理程序。- 返回:
- 基础事件处理程序
-
init
在ODE积分开始时初始化事件处理程序。此方法在积分开始时调用一次。如果需要,事件处理程序可以用于初始化一些内部数据。
默认实现不执行任何操作
- 参数:
-
initialState
- 初始时间、状态向量和导数 -
finalTime
- 积分的目标时间
-
g
计算切换函数的值。当此切换函数的符号变化时,将生成离散事件。积分器将确保以这种方式更改步长,以便这些事件恰好发生在步长边界上。切换函数必须在其根邻域内连续(但不一定平滑),因为积分器将需要找到其根以精确定位事件。
还请注意,积分器期望一旦发生事件,切换函数在下一步开始时(即在事件发生后)的符号与事件发生前的符号相反。这些步骤之间的一致性必须保持,否则将发生与根未被夹住相关的
异常
。这种一致性有时很难实现。一个典型的例子是使用事件来模拟球在地板上弹跳。表示这一点的第一个想法是
g(state) = h(state)
,其中 h 是时间state.getTime()
的地板上方的高度。当g(state)
达到 0 时,球在地板上,因此应该弹起,通常的方法是反转其垂直速度。然而,这意味着在事件之前g(state)
从正值减小到 0,而在事件之后g(state)
将从 0 增加到正值。这里破坏了一致性!这里的解决方案是g(state) = sign * h(state)
,其中 sign 是一个变量,其初始值设置为+1
。每次调用eventOccurred
方法时,将sign
重置为-sign
。这允许g(state)
函数保持连续(甚至平滑),即使跨事件,h(state)
不是。基本上,事件用于在弹跳点处 折叠h(state)
,而sign
用于在 展开 回来,因此求解器看到的是一个在事件之间表现平滑的g(state)
函数。此方法是幂等的,即多次使用相同状态调用此方法将导致相同的值,但有两个例外。首先,当处理程序上的
事件发生
时,g 函数的定义可能会更改,就像上面的示例中一样。其次,当同一积分器中的任何其他事件处理程序的事件发生
方法返回Action.RESET_EVENTS
、Action.RESET_DERIVATIVES
或Action.RESET_STATE
时,g 函数的定义可能会更改。- 参数:
-
state
- 当前独立 时间 变量、状态向量和导数的值 - 返回:
- g 切换函数的值
-