use control_systems_torbox::{
BodePlot, BodePlotData, BodePlotOptions, Continuous, FrequencyResponse,
NyquistPlot, NyquistPlotData, NyquistPlotOptions, Plot, Tf,
};
fn get_nominal_model() -> Tf<f64, Continuous> {
let j_el = 0.38;
let a1 = 0.167;
let damp1 = 0.025;
let freq1 = 754.0;
let a2 = 0.615;
let damp2 = 0.032;
let freq2 = 1073.0;
let time_delay = 2.5e-3;
let res1 = a1 * Tf::s().powi(2)
/ (Tf::s().powi(2) + 2. * damp1 * freq1 * Tf::s() + freq1.powi(2));
let res2 = a2 * Tf::s().powi(2)
/ (Tf::s().powi(2) + 2. * damp2 * freq2 * Tf::s() + freq2.powi(2));
let mut model = (1.0 / j_el + res1 + res2) * 1.0 / Tf::s();
model *= Tf::pade(time_delay, 3);
model
}
fn main() {
let plant = get_nominal_model();
let controller =
Tf::new(&[10. * 10. * 10., 10. * 10., 10.], &[0., 0., 1.0]);
let sys_tf = controller.series(plant);
let sys_ss = sys_tf.to_ss().unwrap();
let mut bode_plot = BodePlot::new(BodePlotOptions::default());
let mut ss_data: BodePlotData = sys_ss.bode(6.0, 6.0 * 500.0).into();
ss_data = ss_data.set_name("Ss");
bode_plot.add_system(ss_data);
let mut tf_data: BodePlotData = sys_tf.bode(6.0, 6.0 * 500.0).into();
tf_data = tf_data.set_name("Tf");
bode_plot.add_system(tf_data);
bode_plot.show(600, 400, "Test").unwrap();
let mut nyq_plot = NyquistPlot::new(NyquistPlotOptions::default());
let mut ss_data: NyquistPlotData =
sys_ss.nyquist(6.0 * 1., 6.0 * 1000.0).into();
ss_data = ss_data.set_name("Ss");
nyq_plot.add_system(ss_data);
let mut tf_data: NyquistPlotData =
sys_tf.nyquist(6.0 * 1., 6.0 * 1000.0).into();
tf_data = tf_data.set_name("Tf");
nyq_plot.add_system(tf_data);
nyq_plot.show(400, 400, "Test").unwrap();
}