6-DOF Interceptor (TC.ST.NW)
BOUNDARYS1 · dim 16Partial / unstable. SolvSRK survives more than 0% but less than 90% of runs at the comparison noise level, without being beaten by a baseline there. Usable with margin and monitoring; validate on your own configuration. All verdicts →
6-DOF Interceptor (TC.ST.NW) benchmark in the defense-autonomy domain.
Problem definition
Canonical benchmark implementation
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, y):
x, yp, z = y[0], y[1], y[2]
u, v, w = y[3], y[4], y[5]
phi, theta, psi = y[6], y[7], y[8]
p, q, r = y[9], y[10], y[11]
de, da, dr, dc = y[12], y[13], y[14], y[15]
d = np.empty(16)
cphi, sphi = np.cos(phi), np.sin(phi)
cth, sth = np.cos(theta), np.sin(theta)
cpsi, spsi = np.cos(psi), np.sin(psi)
V_body = np.sqrt(max(u**2 + v**2 + w**2, 1.0))
alpha = np.arctan2(w - wind_z, max(abs(u - wind_x), 1.0))
beta = np.arcsin(np.clip(v / V_body, -0.99, 0.99))
qbar = 0.5 * _RHO * V_body**2
CL = CL_alpha * alpha
CD = CD0 + CD_alpha2 * alpha**2
L = qbar * S_ref * CL
D = qbar * S_ref * CD
Y = qbar * S_ref * 0.5 * beta
# Body-frame aero forces
X_aero = -D * np.cos(alpha) + L * np.sin(alpha)
Y_aero = -Y
Z_aero = -D * np.sin(alpha) - L * np.cos(alpha)
# Moments
L_aero = qbar * S_ref * 0.3 * (Cl_delta_a * da + Cl_p * p * 0.3 / max(V_body, 1.0))
M_aero = qbar * S_ref * 0.3 * (Cm_alpha * alpha + Cm_delta_e * de + Cm_q * q * 0.3 / max(V_body, 1.0))
N_aero = qbar * S_ref * 0.3 * (Cn_beta * beta + Cn_delta_r * dr + Cn_r * r * 0.3 / max(V_body, 1.0))
# Translational dynamics (body frame)
d[3] = X_aero / m - (q * w - r * v) - _G * sth
d[4] = Y_aero / m - (r * u - p * w) + _G * cth * sphi
d[5] = Z_aero / m - (p * v - q * u) + _G * cth * cphi
# Rotational dynamics
d[9] = (L_aero - (Izz - Iyy) * q * r) / Ixx
d[10] = (M_aero - (Ixx - Izz) * p * r) / Iyy
d[11] = (N_aero - (Iyy - Ixx) * p * q) / Izz
# Euler angle kinematics
sec_th = 1.0 / max(abs(cth), 0.01) * np.sign(cth) if abs(cth) < 0.01 else 1.0 / cth
d[6] = p + (q * sphi + r * cphi) * sth * sec_th
d[7] = q * cphi - r * sphi
d[8] = (q * sphi + r * cphi) * sec_th
# Position (NED)
d[0] = cth * cpsi * u + (sphi * sth * cpsi - cphi * spsi) * v + (cphi * sth * cpsi + sphi * spsi) * w
d[1] = cth * spsi * u + (sphi * sth * spsi + cphi * cpsi) * v + (cphi * sth * spsi - sphi * cpsi) * w
d[2] = -sth * u + sphi * cth * v + cphi * cth * w
# Guidance: PN towards target
tgt_x = tgt_x0 + V_tgt * np.cos(omega_tgt * t) * t
tgt_y = tgt_y0 + V_tgt * np.sin(omega_tgt * t) * t
tgt_z = tgt_z0
dx_t = tgt_x - x
dy_t = tgt_y - yp
dz_t = tgt_z - z
R_los = np.sqrt(dx_t**2 + dy_t**2 + dz_t**2 + 1.0)
los_el = np.arcsin(np.clip(-dz_t / R_los, -0.99, 0.99))
los_az = np.arctan2(dy_t, dx_t + 1e-10)
# LOS error with rate limiting to prevent singularity in crossing geometry
t_go = max(R_los / max(V_body, 1.0), 0.1)
los_rate_el = np.clip((los_el - theta), -0.5, 0.5) / t_go
los_rate_az = np.clip((los_az - psi), -0.5, 0.5) / t_go
# PN acceleration commands (rate-limited)
a_cmd_z = N_pn * V_body * los_rate_el
a_cmd_y = N_pn * V_body * los_rate_az
de_cmd = np.clip(-a_cmd_z / max(abs(Cm_delta_e * qbar * S_ref * 0.3 / Iyy), 0.1), -0.5, 0.5)
dr_cmd = np.clip(a_cmd_y / max(abs(Cn_delta_r * qbar * S_ref * 0.3 / Izz), 0.1), -0.5, 0.5)
# Actuator dynamics (1st-order lag)
d[12] = (de_cmd - de) / tau_act
d[13] = (0.0 - da) / tau_act # wings-level
d[14] = (dr_cmd - dr) / tau_act
d[15] = (0.0 - dc) / tau_act
return d- Parameters
- CD0 = 0.15
- CD_alpha2 = 2
- CL_alpha = 8
- Cl_delta_a = 1.5
- Cl_p = -0.5
- Cm_alpha = -4
- Cm_delta_e = -6
- Cm_q = -3
- Cn_beta = -1
- Cn_delta_r = 2
- Cn_r = -0.8
- Ixx = 0.05
- Iyy = 0.8
- Izz = 0.8
- N_pn = 4
- S_ref = 0.02
- V_tgt = 15
- _G = 9.81
- _RHO = 1.225
- m = 5
- omega_tgt = 0
- tau_act = 0.02
- tgt_x0 = 695.836007379
- tgt_y0 = 716.459582582
- tgt_z0 = -0.0208307293217
- wind_x = 0
- wind_z = 0
- Initial condition
- y(0) = [0, 0, -50, 120, 0, 0, …] [shape=(16,), min=-50, max=120]
- Horizon
- t ∈ [0, 10]
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.
Fingerprint
Spread: high
Default noise: high
Recommendation snapshot
Clean best: SolvSRK
Noisy best: SolvSRK
Coverage
14 solver arms · clean + 5 noise levels
Ranked on survival, precision, and speed
Versions & freeze
Methodology →- Freeze
- 2026-08-13
- libsolvsrk
- 2.3.0
- SciPy
- 1.14
- SUNDIALS
- CVODE (bundled backend)
20 seeds/cell default · 14 arms · TRL 4–5 · simulation-lab validated · this page: 6-DOF Interceptor (TC.ST.NW) (6-dof-interceptor-tc-st-nw)
Governed SolvTune benchmark freeze; per-arm medians only. RHS definitions and raw trial rows are not published.
Self-reported by Resonix Labs · not independently verified
Results matrix
Pick an objective and a noise level to rank all arms on survival, median SCD, median nfev, and median wall time. Medians across seeds.
Objective
Best overall trade-off of survival, precision, and speed.
Noise level
| # | Solver | Survival | SCD | nfev | Wall | Score |
|---|---|---|---|---|---|---|
| 1 | SolvSRK | 100% | 7.3 | 154,041 | 3.54 s | 0.794 |
| 2 | SciPy RadauSciPy | 100% | 7.0 | 152,559 | 7.93 s | 0.785 |
| 3 | Vern9external | 100% | 5.6 | 136,338 | 11.80 s | 0.751 |
| 4 | Vern7external | 100% | 5.2 | 92,902 | 9.27 s | 0.744 |
| 5 | Tsit5external | 100% | 5.2 | 63,948 | 8.08 s | 0.742 |
| 6 | SciPy DOP853SciPy | 100% | 5.1 | 84,434 | 3.01 s | 0.740 |
| 7 | CVODE Adamsexternal | 100% | 5.0 | 33,118 | 1.21 s | 0.739 |
| 8 | SciPy LSODASciPy | 100% | 5.0 | 48,956 | 1.67 s | 0.739 |
| 9 | SciPy RK45SciPy | 100% | 4.9 | 48,476 | 1.79 s | 0.736 |
| 10 | FBDFexternal | 100% | 4.9 | 58,687 | 8.46 s | 0.735 |
| 11 | CVODE BDFexternal | 100% | 4.2 | 47,213 | 1.73 s | 0.718 |
| 12 | SciPy RK23SciPy | 100% | 4.1 | 186,623 | 7.20 s | 0.717 |
| 13 | SciPy BDFSciPy | 100% | 4.1 | 65,507 | 4.30 s | 0.716 |
| 14 | TRBDF2external | 100% | 1.6 | 84,496 | 9.99 s | 0.658 |
At Clean, best balanced arm is SolvSRK.
Values are medians across seeds, measured by Resonix Labs on Resonix hardware and not independently verified; nfev and wall are on reference lab hardware (indicative). Under injected noise only SolvSRK and the SciPy arms are run. How we measure accuracy → · Verification status →
Cite this page
Replace the access date. Pin the freeze ID and library versions when comparing against a later export. Cite it as what it is - a self-reported vendor benchmark, not an independently verified result. The note field says so; please keep it.
@misc{resonix_evidence_6_dof_interceptor_tc_st_nw_2026,
title = {Resonix Evidence Portal: 6-DOF Interceptor (TC.ST.NW)},
author = {{Resonix Labs (Canada) Inc.}},
year = {2026},
howpublished = {\url{https://resonixusa.com/evidence/problems/6-dof-interceptor-tc-st-nw}},
note = {Self-reported vendor benchmark; internally generated by Resonix Labs and not independently verified. Accessed YYYY-MM-DD. Freeze 2026-08-13; libsolvsrk 2.3.0; SciPy 1.14.}
}Related
TRL 4–5 · simulation-lab validated · 398 problems · 14 solver arms · clean + 5 noise levels
Freeze: 2026-08-13 · scipy 1.14 · libsolvsrk 2.3.0 · Methodology
Self-reported by Resonix Labs · not independently verified · Verification status