dsmc 0.18.0

Digitalservo Motion Control Library
Documentation
//! Second-order systems with damping ratios 0 ..= 2: their Bode diagrams (`out/bode_2order/`) and
//! step responses simulated with a zero-order hold (`out/simulator_2order/`).
//!
//! `cargo run --example simulator`

fn main() {

    use dsmc::logger::DataStorage;
    use dsmc::{BodeDiagramPlotter, DiscreteSystem, StateSpace, TransferFunction, discretize::Zoh};


    let ts = 1e-4;
    let omega_c = 300.0;

    let iter = 20;
    for i in 0..=iter {
        let zeta = 0.0 + 2.0 / iter as f64 * i as f64;

        let system = TransferFunction::continuous(&[omega_c * omega_c], &[1.0, 2.0 * zeta * omega_c, omega_c * omega_c]);
        let mut system_d = DiscreteSystem::from(StateSpace::try_from(&system).unwrap().discretize(Zoh, ts).unwrap());

        let bode_plotter = BodeDiagramPlotter::<f64>::new(0.0, 10000.0 / (2.0 * std::f64::consts::PI), 0.1, true);
        let frequency_response = bode_plotter.frequency_response_s(&system);

        let mut storage_bode = DataStorage::new(format!("./out/bode_2order/bode_zeta_{:.01}.csv", zeta)).unwrap();
        let mut storage_res = DataStorage::new(format!("./out/simulator_2order/response_zeta_{:.01}.csv", zeta)).unwrap();

        for res in frequency_response {
            storage_bode.add(&res).unwrap();
        }

        for i in 0..2000 {
            let t = i as f64 * ts;
            let r = if i > 400 { 1.0 } else { 0.0 };
            let y = system_d.update(&[r]).unwrap();

            storage_res.add(&[t, r, y[0]]).unwrap();
        }

        storage_bode.close().unwrap();
        storage_res.close().unwrap();
    }
}