Crates.io | polycal |
lib.rs | polycal |
version | 0.1.3 |
source | src |
created_at | 2024-11-05 17:15:18.639252 |
updated_at | 2024-11-15 18:44:13.274485 |
description | methods for fitting and using polynomial calibration functions following ISO/TS 28038 |
homepage | |
repository | https://github.com/sensoriumtl/polycal |
max_upload_size | |
id | 1436830 |
size | 1,207,700 |
Methods for determining, verifying and using polynomial calibration curves. The methods used conform as closely as possible to ISO/TS 28038.
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);