Composable numerical methods for Rust.

ODEs, SDEs, DDEs, FDEs, IDEs, PDEs, and SPDEs in one library — with dense output, event detection, and adaptive integration that compose like Lego.

use numra::ode::{solve_ivp, Tsit5};
use numra::prelude::*;

// Lorenz system: dx/dt = σ(y - x), dy/dt = x(ρ - z) - y, dz/dt = xy - βz
let lorenz = |_t: f64, y: &[f64], dy: &mut [f64]| {
    let (s, r, b) = (10.0, 28.0, 8.0 / 3.0);
    dy[0] = s * (y[1] - y[0]);
    dy[1] = y[0] * (r - y[2]) - y[1];
    dy[2] = y[0] * y[1] - b * y[2];
};

let sol = solve_ivp(lorenz, (0.0, 40.0), &[1.0, 1.0, 1.0])
    .method(Tsit5::new())
    .rtol(1e-8)
    .atol(1e-10)
    .dense_output(true)
    .run()?;

One library, many equations.

Numra covers the full equation classes scientific computing depends on, with a unified API surface so you compose solvers instead of fighting them.

Composability in action.

Solvers in Numra are values, not frameworks. You wire them together. The output of one solver is the input of the next — with dense output, you can interpolate, integrate, transform, and reduce.

Performance and correctness.

Benchmarks

Correctness

Built for science.

Citable

DOI per release via Zenodo, BibTeX on /cite. Cite Numra in papers without hesitation.

Versioned

Stable MSRV, semver from 1.0, deprecation windows. See /stability.

Evidence-based

Every benchmark plot ships with its commit SHA, hardware, and a reproduction script.

License.

Numra is free for non-commercial academic and research use under the Numra Academic & Research License (Non-Commercial) v1.0. Commercial use requires a separate license.