#polynomial #calibration #problem #fit #solution #fitting #iso-ts

polycal

methods for fitting and using polynomial calibration functions following ISO/TS 28038

8 releases

new 0.1.7 Dec 17, 2024
0.1.6 Dec 12, 2024
0.1.5 Nov 29, 2024

#578 in Math

Download history 246/week @ 2024-11-04 193/week @ 2024-11-11 36/week @ 2024-11-18 203/week @ 2024-11-25 56/week @ 2024-12-02 292/week @ 2024-12-09

601 downloads per month
Used in calibrator

MIT license

345KB
3.5K SLoC

codecov

Polycal


Methods for determining, verifying and using polynomial calibration curves. The methods used conform as closely as possible to ISO/TS 28038.

Usage

To use the crate we first build a Problem, using known calibration data. We then then solve for the best fit solution:

use ndarray::Array1;
use polycal::ProblemBuilder;

a = 1.;
b = 2.;
stimulus: Array1<f64> = Array1::range(0., 10., 0.5);
num_data_points = stimulus.len();
response: Array1<f64> = stimulus
    .iter()
    .map(|x| a + b * x)
    .collect();
let dependent_uncertainty: Array1<f64> = response
    .iter()
    .map(|x| x / 1000.0)
    .collect();

let problem = ProblemBuilder::new(stimulus.view(), response.view())
    .unwrap()
    .with_dependent_variance(dependent_uncertainty.view())
    .unwrap()
    .build();

let maximum_degree = 5;

let best_fit = problem.solve(maximum_degree).unwrap();

for (expected, actual) in response.into_iter().zip(stimulus.into_iter().map(|x|
    best_fit.certain_response(x).unwrap())).skip(1).take(num_data_points-2) {
        assert!((expected - actual).abs() < 1e-5);;
}

We can either reconstruct unknown response from known stimulus values:

use polycal::{AbsUncertainty, Uncertainty};

let known_stimulus = AbsUncertainty::new(1.0, 0.01);
let estimated_response = best_fit.response(known_stimulus);

or calculate unknown stimulus from a known response

use polycal::{AbsUncertainty, Uncertainty};

let known_stimulus = AbsUncertainty::new(1.0, 0.01);
let initial_guess = None;
let max_iter = Some(100);
let estimated_stimulus = best_fit.stimulus(
    known_response,
    initial_guess,
    max_iter
);
let estimated_stimulus = best_fit.stimulus(known_response);

Dependencies

~75MB
~1M SLoC