use num_traits::Float;
pub fn lorenz_system<T: Float>(
sigma: T,
beta: T,
rho: T,
sampling_len: usize,
dt: T,
) -> Vec<(T, T, T)> {
let mut x = T::one();
let mut y = T::zero();
let mut z = T::zero();
let mut out = vec![(T::zero(), T::zero(), T::zero()); sampling_len];
for out in out.iter_mut().take(sampling_len) {
*out = (x, y, z);
x = x + (sigma * (y - x)) * dt;
y = y + (x * (rho - z) - y) * dt;
z = z + (x * y - beta * z) * dt;
}
out
}
#[cfg(test)]
mod test {
use crate::plot::{plot_2d, plot_3d, Series3D};
use super::*;
#[test]
fn plot_lorenz_system_3d() {
let series = lorenz_system(10.0, 2.667, 28.0, 5000, 0.01);
println!("series: {series:?}");
plot_3d(&Series3D(series), "img/lorenz_system_3d.png", (1024, 1024)).unwrap();
}
#[test]
fn plot_lorenz_system_2d() {
use std::iter::FromIterator;
let series = lorenz_system(10.0, 2.667, 28.0, 5000, 0.01);
let xs = Vec::from_iter(series.iter().map(|v| v.0));
plot_2d(xs, "img/lorenz_system_x.png").unwrap();
}
}