Swarm Track Fusion N=20 dense straight

PARITYS2 · dim 140

No clear winner. The survival gap is under 10 percentage points and the balanced-score gap is under 0.05, so neither SolvSRK nor the best baseline clears the win threshold. Either works — choose on cost, licensing, or integration effort. All verdicts →

20-target coordinated-turn tracking with proximity-based dynamic coupling. Per-target state [x,y,z,vx,vy,vz,omega] (dim=140). Dense initial spacing (100.0m). Maneuver: straight. 4 noise channels/target. Scale-probe variant for counter-UAS swarm-size validation.

Defense autonomy

Problem definition

Bar-Shalom, Willett & Tian, 'Tracking and Data Fusion', Ch. 6; Blackman & Popoli, 'Design and Analysis of Modern Tracking Systems'

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)

    # ── Per-target coordinated-turn dynamics ─────────────────
    positions = np.empty((N_targets, 3))
    for i in range(N_targets):
        b = i * _STATES_PER_TARGET
        vx, vy, vz = y[b + 3], y[b + 4], y[b + 5]
        omega = y[b + 6]

        d[b + 0] = vx
        d[b + 1] = vy
        d[b + 2] = vz
        d[b + 3] = -omega * vy
        d[b + 4] = omega * vx
        d[b + 5] = 0.0
        d[b + 6] = 0.0

        positions[i, 0] = y[b + 0]
        positions[i, 1] = y[b + 1]
        positions[i, 2] = y[b + 2]

        # Process noise (interpolated)
        ch = 4 * i
        d[b + 3] += np.interp(t, noise_ts, noise_table[ch + 0])
        d[b + 4] += np.interp(t, noise_ts, noise_table[ch + 1])
        d[b + 5] += np.interp(t, noise_ts, noise_table[ch + 2])
        d[b + 6] += sigma_omega * np.interp(t, noise_ts, noise_table[ch + 3])

    # ── Proximity-based dynamic coupling ──────────────────────
    for i in range(N_targets):
        bi = i * _STATES_PER_TARGET
        for j in range(i + 1, N_targets):
            bj = j * _STATES_PER_TARGET
            dx = positions[j, 0] - positions[i, 0]
            dy = positions[j, 1] - positions[i, 1]
            dz = positions[j, 2] - positions[i, 2]
            dist_sq = dx * dx + dy * dy + dz * dz

            if dist_sq < gate_sq:
                # Soft association weight (Gaussian decay within gate)
                w = coupling_strength * np.exp(-0.5 * dist_sq / (gate_sq * 0.25))
                inv_dist = 1.0 / np.sqrt(dist_sq + _EPS)
                ux, uy, uz = dx * inv_dist, dy * inv_dist, dz * inv_dist

                # Symmetric velocity perturbation (proximity-induced track confusion)
                d[bi + 3] += w * ux
                d[bi + 4] += w * uy
                d[bi + 5] += w * uz
                d[bj + 3] -= w * ux
                d[bj + 4] -= w * uy
                d[bj + 5] -= w * uz

                # Cross-coupling bleeds into turn-rate estimates
                bearing_ij = np.arctan2(dy, dx + _EPS)
                d[bi + 6] += 0.1 * w * np.sin(bearing_ij)
                d[bj + 6] -= 0.1 * w * np.sin(bearing_ij)

    return d
Parameters
  • N_targets = 20
  • _EPS = 1e-12
  • _STATES_PER_TARGET = 7
  • coupling_strength = 0.5
  • dim = 140
  • gate_sq = 22500
  • noise_table = [0.377038385025, -1.26638818038, -0.755127010466, -2.18229223524, -2.55536033277, 1.26082298154, …] [shape=(80, 601), min=-8.04631729511, max=9.46391537727]
  • noise_ts = [0, 0.05, 0.1, 0.15, 0.2, 0.25, …] [shape=(601,), min=0, max=30]
  • sigma_omega = 0.01
Initial condition
y(0) = [50, 0, 102.514604422, -24.1400960653, -3.10899316614, -0.947549941423, …] [shape=(140,), min=-142.658477444, max=150]
Horizon
t ∈ [0, 30]

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: none

Recommendation snapshot

Clean best: SolvSRK

Noisy best: SciPy BDF

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: Swarm Track Fusion N=20 dense straight (swarm-track-fusion-n-20-dense-straight)

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

#SolverSurvivalSCDnfevWallScore
1SolvSRK
100%
67,35142.89 s0.809
SciPy BDFSciPy
0%
SciPy RadauSciPy
0%
SciPy RK45SciPy
0%
SciPy LSODASciPy
0%
SciPy DOP853SciPy
0%
SciPy RK23SciPy
0%
CVODE BDFexternal
0%
CVODE Adamsexternal
0%
Tsit5external
0%

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 →

SolvScout · free

Profile your problem for free

This page shows one published benchmark cell. SolvScout fingerprints your ODE, compares it to the full corpus, and recommends a solver with the same survival / precision / speed ranking you see here — including when a SciPy arm wins.

SolvSRK · 30-day trial

Run the winner on your machine

SolvSRK is the stiffness-adaptive integrator behind the SolvSRK column in these tables. Create an account, activate a machine, and take a 30-day trial — same binary you'd ship after purchase.

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_swarm_track_fusion_n_20_dense_straight_2026,
  title        = {Resonix Evidence Portal: Swarm Track Fusion N=20 dense straight},
  author       = {{Resonix Labs (Canada) Inc.}},
  year         = {2026},
  howpublished = {\url{https://resonix.tech/evidence/problems/swarm-track-fusion-n-20-dense-straight}},
  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