类 EventSlopeFilter<T extends ODEEventDetector>
- 类型参数:
-
T
- 事件检测器的类型
- 所有已实现的接口:
-
ODEEventDetector
一般情况下,通过跨越零点的 g函数
隐式定义了 事件
。该函数在事件邻域内需要连续,并且其符号在事件之间保持一致。这意味着在ODE积分期间,触发的事件交替是函数从负值增加到正值的事件,以及函数从正值减少到负值的事件。
有时,用户只对一种类型的事件感兴趣(例如仅递增事件),而不关心另一种类型。在这种情况下,精确查找所有事件位置并触发稍后将被忽略的事件是浪费计算时间。
用户可以将常规的 事件检测器
包装在此类的实例中,并将此包装实例提供给 ODE求解器
,以避免浪费时间查找不感兴趣的事件。包装器将拦截对 g函数
和 eventOccurred
方法的调用,以忽略不感兴趣的事件。被包装的常规 事件处理器
将只看到有趣的事件,即仅为 递增
事件或 递减
事件。对 g函数
的调用次数也将减少。
- 从以下版本开始:
- 3.0
-
字段概要
从类继承的字段 org.hipparchus.ode.events.AbstractODEDetector
DEFAULT_MAX_ITER, DEFAULT_MAXCHECK, DEFAULT_THRESHOLD
-
构造器概要
-
方法概要
修饰符和类型方法说明protected EventSlopeFilter
<T> create
(AdaptableInterval newMaxCheck, int newMaxIter, BracketedUnivariateSolver<UnivariateFunction> newSolver, ODEEventHandler newHandler) 构建一个新实例。double
g
(ODEStateAndDerivative state) 计算切换函数的值。获取包装的原始检测器。void
init
(ODEStateAndDerivative initialState, double finalTime) 在ODE积分开始时初始化事件处理器。从类继承的方法 org.hipparchus.ode.events.AbstractODEDetector
getHandler, getMaxCheckInterval, getMaxIterationCount, getSolver, isForward, withHandler, withMaxCheck, withMaxCheck, withMaxIter, withSolver, withThreshold
-
构造器详细资料
-
EventSlopeFilter
包装一个事件检测器
。- 参数:
-
rawDetector
- 要包装的事件检测器 -
filter
- 要使用的过滤器 - 从以下版本开始:
- 3.0
-
-
方法详细资料
-
create
protected EventSlopeFilter<T> create(AdaptableInterval newMaxCheck, int newMaxIter, BracketedUnivariateSolver<UnivariateFunction> newSolver, ODEEventHandler newHandler) 构建一个新实例。- 指定者:
-
create
在类中AbstractODEDetector<EventSlopeFilter<T extends ODEEventDetector>>
- 参数:
-
newMaxCheck
- 最大检查间隔 -
newMaxIter
- 事件时间搜索中的最大迭代次数 -
newSolver
- 用于检测状态事件的根查找算法 -
newHandler
- 事件发生时要调用的事件处理器 - 返回:
- 适当子类型的新实例
-
getDetector
获取包装的原始检测器。- 返回:
- 包装的原始检测器
-
init
在ODE积分开始时初始化事件处理器。此方法在积分开始时仅调用一次。如果需要,事件处理器可以使用此方法初始化一些内部数据。
默认实现不执行任何操作
此实现设置积分方向并初始化事件处理器。如果子类覆盖此方法,则应调用
super.init(s0, t)
。- 指定者:
-
init
在接口中ODEEventDetector
- 覆盖:
-
init
在类中AbstractODEDetector<EventSlopeFilter<T extends ODEEventDetector>>
- 参数:
-
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函数的定义可能会更改,就像上面的示例一样。其次,当同一积分器中的任何其他事件处理程序的eventOccurred
方法返回Action.RESET_EVENTS
、Action.RESET_DERIVATIVES
或Action.RESET_STATE
时,g函数的定义可能会更改。- 指定者:
-
g
在接口中ODEEventDetector
- 指定者:
-
g
在类中AbstractODEDetector<EventSlopeFilter<T extends ODEEventDetector>>
- 参数:
-
state
- 独立时间变量、状态向量和导数的当前值 - 返回:
- g切换函数的值
- 另请参阅:
-