automatica 0.10.1

Automatic control systems library
Documentation
extern crate automatica;

use num_complex::Complex;
use num_traits::One;

use automatica::{
    plots::bode::Bode,
    poly,
    units::{RadiansPerSecond, ToDecibel},
    Poly, Tf, Tfz,
};

#[allow(clippy::non_ascii_literal)]
fn main() {
    let tf = Tf::new(Poly::<f64>::one(), Poly::new_from_roots(&[-1.]));

    println!("T:\n{}", tf);

    let c = tf.eval(&Complex::new(0., 1.));
    println!("\nEvaluation at i:");
    println!(
        "{} = {:.3}dB, {:.3}°",
        c,
        c.norm().to_db(),
        c.arg().to_degrees()
    );

    println!("\nBode Plot:");
    let b = Bode::new(tf, RadiansPerSecond(0.1), RadiansPerSecond(10.0), 0.1);
    for g in b.into_iter().into_db_deg() {
        println!(
            "f: {:.3} rad/s, m: {:.3} dB, f: {:.1} °",
            g.angular_frequency(),
            g.magnitude(),
            g.phase()
        );
    }

    let k = 0.5;
    let tfz = Tfz::new(poly!(1. - k), poly!(-k, 1.));
    println!("\nDiscrete function T:\n{}\n", tfz);
    let pz = Bode::new_discrete(tfz, RadiansPerSecond(0.01), 0.1);
    for g in pz.into_iter().into_db_deg() {
        println!(
            "f: {:.3} rad/s, m: {:.3} dB, f: {:.1} °",
            g.angular_frequency(),
            g.magnitude(),
            g.phase()
        );
    }
}