Problem definition
Zarchan, 'Tactical and Strategic Missile Guidance', Ch. 8; Shima & Rasmussen, 'Cooperative Interceptor Guidance'
Canonical RHS excerpt from the registered callable used for this benchmark cell. Expand it to verify the state equations; it is not a standalone runnable fixture.
Show canonical RHS excerpt
def rhs(t: float, y: np.ndarray) -> np.ndarray:
d = np.zeros(dim)
positions = np.empty((N_total, 2))
for k in range(N_total):
bk = k * _STATES_PER_VEHICLE
positions[k, 0] = y[bk + 0]
positions[k, 1] = y[bk + 1]
for i in range(N_interceptors):
bi = i * _STATES_PER_VEHICLE
x_m, y_m, th_m = y[bi + 0], y[bi + 1], y[bi + 2]
vx_m = V_m * np.cos(th_m)
vy_m = V_m * np.sin(th_m)
d[bi + 0] = vx_m
d[bi + 1] = vy_m
tgt_idx = N_interceptors + (i % N_targets)
bt = tgt_idx * _STATES_PER_VEHICLE
x_t, y_t, th_t = y[bt + 0], y[bt + 1], y[bt + 2]
dx = x_t - x_m
dy = y_t - y_m
r_sq = dx * dx + dy * dy
if r_sq > d_miss_sq:
r = np.sqrt(r_sq) + _EPS_RANGE
vx_t = V_t * np.cos(th_t)
vy_t = V_t * np.sin(th_t)
dlam_dt = (dx * (vy_t - vy_m) - dy * (vx_t - vx_m)) / (r * r)
V_c = -(dx * (vx_t - vx_m) + dy * (vy_t - vy_m)) / r
a_pn = N_pn * V_c * dlam_dt
else:
a_pn = 0.0
a_deconf_x = 0.0
a_deconf_y = 0.0
for j in range(N_interceptors):
if j == i:
continue
bj = j * _STATES_PER_VEHICLE
dxij = y[bi + 0] - y[bj + 0]
dyij = y[bi + 1] - y[bj + 1]
dist_sq = dxij * dxij + dyij * dyij
if dist_sq < d_gate_sq:
dist = np.sqrt(dist_sq) + _EPS_RANGE
separation = max(dist - d_safe, 0.1)
repulsion = 50.0 / (separation * separation)
repulsion = min(repulsion, 200.0)
a_deconf_x += repulsion * dxij / dist
a_deconf_y += repulsion * dyij / dist
a_total = a_pn + (a_deconf_x * np.sin(th_m) - a_deconf_y * np.cos(th_m))
d[bi + 2] = np.clip(a_total, -50.0, 50.0) / V_m
for j in range(N_targets):
bj = (N_interceptors + j) * _STATES_PER_VEHICLE
th_t_j = y[bj + 2]
d[bj + 0] = V_t * np.cos(th_t_j)
d[bj + 1] = V_t * np.sin(th_t_j)
d[bj + 2] = omega_t
return d- Parameters
- N_interceptors = 3
- N_pn = 3
- N_targets = 2
- N_total = 5
- V_m = 100
- V_t = 30
- _EPS_RANGE = 1e-06
- _STATES_PER_VEHICLE = 3
- d_gate_sq = 10000
- d_miss_sq = 4
- d_safe = 50
- dim = 15
- omega_t = 0
- Initial condition
- y(0) = [-200, 0, 1.57079632679, 0, 0, 1.57079632679, …] [shape=(15,), min=-200, max=3000]
- Horizon
- t ∈ [0, 60]
Canonical RHS excerpt captured from the same registered callable used for the published benchmark. Frozen closure values are summarized below; helper imports and solver settings are intentionally omitted.