use scirs2_signal::lti::design::tf;
use scirs2_signal::lti::system::*;
use scirs2_signal::lti::{bode, LtiSystem};
#[allow(dead_code)]
fn main() {
println!("LTI System Interconnection Example");
println!("===================================\n");
println!("1. Series Connection");
println!("-------------------");
let g1 = tf(vec![5.0], vec![1.0, 2.0], None).unwrap();
println!("G1(s) = 5 / (s + 2)");
let g2 = tf(vec![1.0], vec![1.0, 5.0], None).unwrap();
println!("G2(s) = 1 / (s + 5)");
let series_sys = series(&g1, &g2).unwrap();
println!("Series H(s) = G2(s) * G1(s)");
println!("Numerator coefficients: {:?}", series_sys.num);
println!("Denominator coefficients: {:?}", series_sys.den);
println!("\n\n2. Parallel Connection");
println!("---------------------");
let g1_par = tf(vec![3.0], vec![1.0, 1.0], None).unwrap();
println!("G1(s) = 3 / (s + 1)");
let g2_par = tf(vec![2.0], vec![1.0, 4.0], None).unwrap();
println!("G2(s) = 2 / (s + 4)");
let parallel_sys = parallel(&g1_par, &g2_par).unwrap();
println!("Parallel H(s) = G1(s) + G2(s)");
println!("Numerator coefficients: {:?}", parallel_sys.num);
println!("Denominator coefficients: {:?}", parallel_sys.den);
println!("\n\n3. Unity Feedback Control System");
println!("--------------------------------");
let plant = tf(vec![10.0], vec![1.0, 1.0, 0.0], None).unwrap();
println!("Plant G(s) = 10 / (s(s + 1))");
let closed_loop = feedback(&plant, None, 1).unwrap();
println!("Closed-loop T(s) = G(s) / (1 + G(s))");
println!("Numerator coefficients: {:?}", closed_loop.num);
println!("Denominator coefficients: {:?}", closed_loop.den);
match closed_loop.is_stable() {
Ok(stable) => println!("Closed-loop system is stable: {}", stable),
Err(_) => println!("Could not determine stability"),
}
println!("\n\n4. Feedback with PID Controller");
println!("-------------------------------");
let plant_pid = tf(vec![1.0], vec![1.0, 3.0, 2.0], None).unwrap();
println!("Plant G(s) = 1 / ((s + 1)(s + 2))");
let controller = tf(vec![2.0, 10.0, 5.0], vec![1.0, 0.0], None).unwrap();
println!("PID Controller C(s) = (2s^2 + 10s + 5) / s");
let forward_path = series(&controller, &plant_pid).unwrap();
println!("Forward path = C(s) * G(s)");
let pid_closed_loop = feedback(&forward_path, None, 1).unwrap();
println!("PID Closed-loop system:");
println!("Numerator coefficients: {:?}", pid_closed_loop.num);
println!("Denominator coefficients: {:?}", pid_closed_loop.den);
println!("\n\n5. Sensitivity Functions");
println!("------------------------");
let sens = sensitivity(&plant, None).unwrap();
let comp_sens = complementary_sensitivity(&plant, None).unwrap();
println!("Sensitivity S(s) = 1 / (1 + G(s)):");
println!("Numerator coefficients: {:?}", sens.num);
println!("Denominator coefficients: {:?}", sens.den);
println!("Complementary Sensitivity T(s) = G(s) / (1 + G(s)):");
println!("Numerator coefficients: {:?}", comp_sens.num);
println!("Denominator coefficients: {:?}", comp_sens.den);
let sum_st = parallel(&sens, &comp_sens).unwrap();
println!("S(s) + T(s) verification:");
println!("Numerator coefficients: {:?}", sum_st.num);
println!("Denominator coefficients: {:?}", sum_st.den);
println!("\n\n6. Frequency Response Analysis");
println!("------------------------------");
let freqs = vec![0.1, 1.0, 10.0, 100.0];
println!("Frequency response comparison (|H(jω)| in dB):");
println!("Frequency (rad/s) | Open-loop | Closed-loop");
println!("------------------|-----------|------------");
for &freq in &freqs {
let open_loop_resp = plant.frequency_response(&[freq]).unwrap();
let closed_loop_resp = closed_loop.frequency_response(&[freq]).unwrap();
let open_loop_mag = 20.0 * open_loop_resp[0].norm().log10();
let closed_loop_mag = 20.0 * closed_loop_resp[0].norm().log10();
println!(
"{:16.1} | {:8.2} | {:10.2}",
freq, open_loop_mag, closed_loop_mag
);
}
println!("\n\n7. Bode Plot Data");
println!("-----------------");
let bode_freqs = vec![0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0, 50.0];
let (w, mag, phase) = bode(&closed_loop, Some(&bode_freqs)).unwrap();
println!("Closed-loop Bode plot data:");
println!("Frequency (rad/s) | Magnitude (dB) | Phase (deg)");
println!("------------------|----------------|------------");
for ((freq, magnitude), ph) in w.iter().zip(mag.iter()).zip(phase.iter()) {
println!("{:16.1} | {:13.2} | {:10.2}", freq, magnitude, ph);
}
println!("\n\n8. Multi-stage System Design");
println!("----------------------------");
let prefilter = tf(vec![1.0], vec![0.1, 1.0], None).unwrap();
println!("Prefilter F(s) = 1 / (0.1s + 1)");
let prop_controller = tf(vec![5.0], vec![1.0], None).unwrap();
println!("Controller C(s) = 5");
let simple_plant = tf(vec![1.0], vec![1.0, 1.0], None).unwrap();
println!("Plant G(s) = 1 / (s + 1)");
let controller_plant = series(&prop_controller, &simple_plant).unwrap();
let closed_inner = feedback(&controller_plant, None, 1).unwrap();
let complete_system = series(&prefilter, &closed_inner).unwrap();
println!("Complete system T(s) = F(s) * (C(s)*G(s))/(1 + C(s)*G(s)):");
println!("Numerator coefficients: {:?}", complete_system.num);
println!("Denominator coefficients: {:?}", complete_system.den);
println!("\n\nSystem interconnection allows for:");
println!("- Building complex control systems from simple components");
println!("- Analyzing system properties (stability, performance)");
println!("- Designing controllers and compensators");
println!("- Computing sensitivity functions for robustness analysis");
}