Sensitivity Analysis
Sensitivity analysis answers: “Which parameters matter most?” Given a function , it quantifies how much the output changes when each parameter is perturbed.
Computing Sensitivities
Section titled “Computing Sensitivities”Numra computes sensitivities via central finite differences:
use numra::uncertainty::compute_sensitivities;
// A model: output = a^2 * sin(b) + clet f = |p: &[f64]| p[0] * p[0] * p[1].sin() + p[2];let params = [3.0, 1.5, 10.0];let names = ["a", "b", "c"];
let result = compute_sensitivities(f, ¶ms, &names, None);
println!("Output: {:.4}", result.output);for s in &result.sensitivities { println!("{}: coeff={:.4}, normalized={:.4}", s.name, s.coefficient, s.normalized);}Sensitivity Metrics
Section titled “Sensitivity Metrics”Each parameter gets two metrics:
| Metric | Formula | Meaning |
|---|---|---|
| Coefficient | Absolute rate of change | |
| Normalized | Relative (elasticity) |
The normalized sensitivity tells you: “A 1% change in causes approximately a (normalized)% change in the output.”
Finding the Most Important Parameter
Section titled “Finding the Most Important Parameter”let most = result.most_sensitive().unwrap();println!("Most sensitive: {} (normalized: {:.4})", most.name, most.normalized);Uncertainty Propagation from Sensitivities
Section titled “Uncertainty Propagation from Sensitivities”Combine sensitivities with parameter uncertainties to predict output uncertainty:
let param_variances = [0.1, 0.05, 1.0]; // Var(a), Var(b), Var(c)let output_variance = result.propagate_uncertainty(¶m_variances);println!("Output std: {:.4}", output_variance.sqrt());Sensitivity with ODE Models
Section titled “Sensitivity with ODE Models”For ODE models, combine sensitivity analysis with parameter estimation:
use numra::ocp::forward_sensitivity;
// Forward sensitivity: compute dx/dp alongside the statelet sens_result = forward_sensitivity( |t, x, dxdt, p| { dxdt[0] = -p[0] * x[0]; }, 1, // n_states 1, // n_params 0.0, 10.0, // time span &[1.0], // x0 &[0.5], // params).unwrap();
// sens_result contains dx/dp at each time stepFor many parameters, use the adjoint method instead (see Adjoint Methods).
Finite Difference Step Size
Section titled “Finite Difference Step Size”The default step size is . Override for specific problems:
let result = compute_sensitivities(f, ¶ms, &names, Some(1e-5));Smaller steps give more accurate derivatives but are more susceptible to floating-point cancellation. The relative step adapts to the parameter scale.