dsmc 0.1.2

Digitalservo Motion Control Library
Documentation
use dsmc::{dka_method, vieta_formula};

#[test]
fn test_roots_plot() {
    use num_complex::Complex;
    use dsmc::Polynomial;
    use dsmc::logger::DataStorage;

    let omega_c = -300.0;

    let roots: Vec<Complex<f64>> = vec![
        Complex::new(omega_c, 0.0),
        Complex::new(omega_c, 0.0),
        Complex::new(omega_c, 0.0),
    ];

    let coeffs = vieta_formula(&roots);

    let gains = coeffs.0[1..]
        .iter()
        .map(|x| x.re)
        .collect::<Vec<_>>();

    let iter = 20;
    for i in 0..=iter {
        let alpha = 0.8 + 0.4 / iter as f64 * i as f64;
        let gains_fluctuated = gains.iter().map(|x| x * alpha).collect::<Vec<_>>();

        let mut coeffs = vec![1.0];
        coeffs.extend_from_slice(&gains_fluctuated);
        let coeffs = coeffs
            .into_iter()
            .map(|x| Complex::new(x, 0.0))
            .collect::<Vec<_>>();

        let coeffs = Polynomial(coeffs);

        let roots = dka_method(&coeffs);
        println!("alpha: {:.2}, Roots: {:#.2?}", alpha, roots);

        let mut storage = DataStorage::new(format!("./out/roots_locus/roots_locus_alpha_{:.02}.csv", alpha), ',', false).unwrap();
        if let Some(roots) = roots {
            for root in roots {
                storage.add(&[root.re, root.im]).unwrap();
            }
            storage.close().unwrap();
        }
    }
}



#[test]
fn test_roots_plot_2order() {
    use num_complex::Complex;
    use dsmc::Polynomial;
    use dsmc::logger::DataStorage;

    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 coeffs = vec![1.0, 2.0 * zeta * omega_c, omega_c * omega_c];

        let coeffs = coeffs
            .into_iter()
            .map(|x| Complex::new(x, 0.0))
            .collect::<Vec<_>>();

        let coeffs = Polynomial(coeffs);

        let roots = dka_method(&coeffs);
        println!("zeta: {:.2}, Roots: {:#.2?}", zeta, roots);

        let mut storage = DataStorage::new(format!("./out/roots_locus_2order/roots_locus_zeta_{:.01}.csv", zeta), ',', false).unwrap();
        if let Some(roots) = roots {
            for root in roots {
                storage.add(&[root.re, root.im]).unwrap();
            }
            storage.close().unwrap();
        }
    }
}