public class TriggerDate extends Object implements AdditionalStateProvider, ManeuverTriggersResetter
此类的典型用例是在轨道确定或机动优化期间估计机动开始和停止日期。
设 \((t_0, y_0)\) 为传播开始时的状态,\((t_1, y_1)\) 为机动触发时间的状态,\((t_t, y_t)\) 为传播过程中任意时间 \(t\) 的状态,\(f_m(t, y)\) 为机动对全局 ODE \(\frac{dy}{dt} = f(t, y)\) 的贡献。我们对雅可比列 \(\frac{\partial y_t}{\partial t_1}\) 感兴趣。
这个雅可比矩阵有两部分:主要部分对应于由于机动引起的加速度的完整贡献,因为它被延迟了一个小量 \(dt_1\),而次要部分对应于机动开始后加速度的变化,因为质量消耗被延迟,因此航天器的质量与标称开始时间的质量不同。
主要部分的计算如下。在触发时间 \(t_1\) 之后(根据传播方向),\[\frac{\partial y_t}{\partial t_1} = \pm \frac{\partial y_t}{\partial y_1} f_m(t_1, y_1)\] 其中符号取决于 \(t_1\) 是开始触发还是停止触发,传播是向前还是向后。
如果 \(t_1 \neq t_0\),我们没有 \(\frac{\partial y_t}{\partial y_1}\) 可用,但是我们在任何时间都有 \(\frac{\partial y_t}{\partial y_0}\),因为它可以通过积分变分方程进行数值传播或通过其他解析传播器的封闭形式表达式进行计算。我们使用经典的组合规则来恢复相对于中间时间 \(t_1\) 的状态转移矩阵:\[\frac{\partial y_t}{\partial y_0} = \frac{\partial y_t}{\partial y_1} \frac{\partial y_1}{\partial y_0}\] 我们推导出 \[\frac{\partial y_t}{\partial y_1} = \frac{\partial y_t}{\partial y_0} \left(\frac{\partial y_1}{\partial y_0}\right)^{-1}\]
因此,主要部分对雅可比列的贡献可以使用以下封闭形式表达式计算:\[\frac{\partial y_t}{\partial t_1} = \pm \frac{\partial y_t}{\partial y_0} \left(\frac{\partial y_1}{\partial y_0}\right)^{-1} f_m(t_1, y_1) = \frac{\partial y_t}{\partial y_0} c_1\] 其中 \(c_1\) 是在触发时间 \(t_1\) 时机动的带符号贡献,并且通过解决 \(\frac{\partial y_1}{\partial y_0} c_1 = \pm f_m(t_1, y_1)\) 在触发时间计算。
由于列的主要部分是使用封闭形式表达式生成的,因此此生成器实现了 AdditionalStateProvider
接口,并直接将列存储在传播过程中的主状态中。
由于封闭形式表达式需要在触发时间 \(t_1\) 选择 \(c_1\),因此仅当传播开始于机动之外并在积分过程中经过 \(t_1\) 时才有效。
次要部分的计算如下。我们有加速度 \(\vec{\Gamma} = \frac{\vec{F}}{m}\) 和 \(m = m_0 - q (t - t_s)\),其中 \(m\) 是当前质量,\(m_0\) 是初始质量,\(t_s\) 是机动触发时间。在触发时间上的延迟 \(dt_s\) 导致质量消耗的延迟。我们得到:\[d\vec{\Gamma} = \frac{-\vec{F}}{m^2} dm = \frac{-\vec{F}}{m^2} q dt_s = -\vec{\Gamma}\frac{q}{m} dt_s\] 从这个全微分中,我们提取加速度的偏导数 \[\frac{\partial\vec{\Gamma}}{\partial t_s} = -\vec{\Gamma}\frac{q}{m}\]
因此,次要部分对雅可比列的贡献可以通过积分加速度的偏导数来计算,以获得位置的偏导数。
由于列的次要部分是使用微分方程生成的,因此设置了一个单独的基础生成器,该生成器实现了 AdditionalDerivativesProvider
接口,以在传播过程中执行积分。
此生成器确保将主要部分和次要部分相加,以计算雅可比矩阵的完整列。
实现确保在传播开始时 不 重置 \(c_1\)。这样,如果我们在机动中间中断传播并重新启动传播,就可以获得正确的雅可比矩阵。
MedianDate
, Duration
Constructor and Description |
---|
TriggerDate(String stmName, String triggerName, boolean manageStart, Maneuver maneuver, double threshold)
简单构造函数。
|
Modifier and Type | Method and Description |
---|---|
double[] |
getAdditionalState(SpacecraftState state)
获取额外状态。
|
MassDepletionDelay |
getMassDepletionDelay()
获取质量消耗效应处理器。
|
String |
getName()
获取额外状态的名称。
|
void |
init(SpacecraftState initialState, AbsoluteDate target)
在传播开始时初始化额外状态提供器。
|
void |
maneuverTriggered(SpacecraftState state, boolean start)
观察机动触发。
|
SpacecraftState |
resetState(SpacecraftState state)
当机动触发时重置状态。
|
boolean |
yields(SpacecraftState state)
检查此提供器是否应该让出,以便另一个提供器有机会添加缺失部分。
|
public String getName()
getName
在接口 AdditionalStateProvider
中
public boolean yields(SpacecraftState state)
决定是否让出通常基于提供的 state
中是否已经 可用
额外状态(但理论上也可能取决于额外状态导数是否已经 可用
,或任何其他标准)。例如,如果提供程序需要状态转移矩阵,则可以将此方法实现为:
public boolean yields(final SpacecraftState state) {
return !state.getAdditionalStates().containsKey("STM");
}
默认实现返回 false
,这意味着状态数据可以立即 生成
。
只有在状态转移矩阵状态可用时,才能计算列状态。
yields
在接口 AdditionalStateProvider
中
state
- 要处理的状态
public MassDepletionDelay getMassDepletionDelay()
public void init(SpacecraftState initialState, AbsoluteDate target)
init
在接口 ManeuverTriggersResetter
中
init
在接口 AdditionalStateProvider
中
initialState
- 传播开始时的初始状态信息
target
- 传播的日期
public double[] getAdditionalState(SpacecraftState state)
getAdditionalState
在接口 AdditionalStateProvider
中
state
- 额外状态应对应于的航天器状态
public void maneuverTriggered(SpacecraftState state, boolean start)
start
参数对应于从过去到未来的物理时间流,而不是可能是向后的传播方向。这意味着在正向传播期间,第一次调用将设置 start
为 true
,第二次调用将设置 start
为 false
,而在向后传播中,第一次调用将设置 start
为 false
,第二次调用将设置 start
为 true
。
maneuverTriggered
在接口 ManeuverTriggersResetter
中
state
- 触发日期时的航天器状态(应用机动之前)
start
- 如果为 true,则触发是机动的开始
public SpacecraftState resetState(SpacecraftState state)
resetState
在接口 ManeuverTriggersResetter
state
- 触发日期的飞船状态
Copyright © 2002-2023 CS GROUP. All rights reserved.