state_space/
lib.rs

1pub mod state_space;
2
3pub use state_space::*;
4
5#[cfg(test)]
6mod tests {
7    use array_matrix::{MAdd, MMul};
8
9    use crate::StateSpace;
10
11    #[test]
12    fn step()
13    {
14        let ss = StateSpace::new_control_canonical_form([10.0, 2.0], [0.0, 1.0]);
15
16        let mut x = [[0.0]; 2];
17        let mut y = vec![];
18        let mut u = 0.0;
19
20        const FS: f64 = 100.0;
21        const T: f64 = 20.0;
22        const N: usize = (T*FS) as usize;
23        let dt = 1.0/FS;
24
25        for _ in 0..N
26        {
27            y.push(ss.y(x, u));
28            x = x.add(ss.dxdt(x, u).mul(dt));
29            u = 1.0;
30        }
31
32        let y_str: Vec<String> = y.iter().map(|yn| yn.to_string()).collect();
33
34        println!("{}", y_str.join(", "));
35    }
36
37    #[test]
38    fn steady_state_error()
39    {
40        let ss = StateSpace::new_control_canonical_form([10.0, 1.0], [0.0, 1.0]);
41        
42        let mut x = [[0.0]; 2];
43        let mut u = 0.0;
44
45        const FS: f64 = 100.0;
46        const T: f64 = 200.0;
47        const N: usize = (T*FS) as usize;
48        let dt = 1.0/FS;
49
50        for _ in 0..N
51        {
52            x = x.add(ss.dxdt(x, u).mul(dt));
53            u = 1.0;
54        }
55        let y_ss = ss.y(x, u);
56        // Steady state error:
57        let e_ss = y_ss - u;
58        println!("{}", e_ss)
59    }
60}