use std::collections::HashMap;
use evalexpr_jit::Equation;
use ode_solvers::dopri5::*;
use ode_solvers::*;
type State = Vector2<f64>;
type Precision = f64;
struct MichaelisMenten {
vmax: f64, km: f64, equation: Equation, }
impl MichaelisMenten {
fn new(vmax: f64, km: f64) -> Self {
let var_map = HashMap::from([
("S".to_string(), 0), ("vmax".to_string(), 1), ("km".to_string(), 2), ]);
let equation = Equation::from_var_map("(vmax * S) / (km + S)".to_string(), &var_map)
.expect("Failed to create Michaelis-Menten equation");
Self { vmax, km, equation }
}
}
impl System<Precision, State> for MichaelisMenten {
fn system(&self, _t: f64, y: &State, dy: &mut State) {
let v = self
.equation
.eval(&[y[0], self.vmax, self.km])
.expect("Failed to evaluate equation");
dy[0] = -v; dy[1] = v; }
}
fn main() {
let vmax = 1.5; let km = 2.0;
let s0 = 10.0; let p0 = 0.0; let y0 = State::new(s0, p0);
let t0 = 0.0; let tf = 150.0; let dt = 0.01;
let system = MichaelisMenten::new(vmax, km);
let mut stepper = Dopri5::new(system, t0, tf, dt, y0, 1.0e-4, 1.0e-8);
let res = stepper.integrate();
match res {
Ok(stats) => {
println!("Simulation successful!");
println!("Number of evaluations: {}", stats.num_eval);
println!("Number of accepted steps: {}", stats.accepted_steps);
println!("Number of rejected steps: {}", stats.rejected_steps);
}
Err(e) => println!("An error occurred: {e}"),
}
}