Skip to main content

nyquist/
nyquist.rs

1//! Nyquist plots and Bode diagrams of a PID controller with a double integrator, for gains scaled by
2//! 0.8 ..= 1.2, written to `out/nyquist/` and `out/bode/`.
3//!
4//! `cargo run --example nyquist`
5
6use dsmc::logger::DataStorage;
7use dsmc::{BodeDiagramPlotter, NyquistPlotter, TransferFunction};
8
9fn main() {
10
11    let omega = 300.0;
12
13    let kp = 3.0 * omega * omega;
14    let kd = 3.0 * omega;
15    let ki = omega* omega * omega;
16
17    let iter = 10;
18    for i in 0..=iter {
19        let alpha = 0.8 + 0.4 / iter as f64 * i as f64;
20
21        let mut storage_n = DataStorage::new(format!("./out/nyquist/nyquist_alpha_{:.02}.csv", alpha)).unwrap();
22        let mut storage_b = DataStorage::new(format!("./out/bode/bode_alpha_{:.02}.csv", alpha)).unwrap();
23
24        let plotter_n = NyquistPlotter::<f64>::new(10.0, 2000.0, 0.01);
25        let plotter_b = BodeDiagramPlotter::<f64>::new(0.1, 1000.0, 0.01, true);
26
27        let tf_main = TransferFunction::continuous(&[alpha * kd, alpha * kp, alpha * ki], &[1.0, 0.0]);
28        let tf_pl = TransferFunction::continuous(&[1.0], &[1.0, 0.0, 0.0]);
29        let tf = tf_main * tf_pl;
30        {
31            let responses = plotter_n.plot(&tf);
32            for res in responses {
33                storage_n.add(&res).unwrap();
34            }
35        }
36        {
37            let responses = plotter_b.frequency_response_s(&tf);
38            for res in responses {
39                storage_b.add(&res).unwrap();
40            }
41        }
42
43        storage_n.close().unwrap();
44        storage_b.close().unwrap();
45    }
46
47}