Skip to content

Commit a69085a

Browse files
committed
display tf and ss
1 parent 1868c3b commit a69085a

3 files changed

Lines changed: 75 additions & 9 deletions

File tree

src/systems/polynom.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,32 @@ impl<T> RationalFunction<T>
332332
where
333333
T: Zero + fmt::Display,
334334
{
335-
pub fn to_string_variable(&self, var_name: &str) -> String {
336-
let num_str = self.num.to_string_variable(var_name);
337-
let den_str = self.den.to_string_variable(var_name);
335+
pub fn display_with_var_name(
336+
&self,
337+
formatter: &mut std::fmt::Formatter<'_>,
338+
var_name: &str,
339+
) -> std::fmt::Result {
340+
let mut num_str = self.numerator().to_string_variable(var_name);
341+
let mut den_str = self.denominator().to_string_variable(var_name);
342+
let max_len = num_str.len().max(den_str.len());
343+
let dash_line = "\u{2500}".repeat(max_len);
344+
345+
let center_pad_fn = |s: &str| -> String {
346+
let padding = max_len.saturating_sub(s.len()) / 2;
347+
format!("{}{}", " ".repeat(padding), s)
348+
};
349+
350+
num_str = center_pad_fn(&num_str);
351+
den_str = center_pad_fn(&den_str);
338352

339-
let dash_line = "\u{2500}".repeat(num_str.len().max(den_str.len()));
353+
assert!(num_str.len() <= max_len);
354+
assert!(den_str.len() <= max_len);
340355

341-
num_str + "\n" + &dash_line + "\n" + &den_str
356+
write!(
357+
formatter,
358+
"\n {}\n {}\n {}\n\n",
359+
num_str, dash_line, den_str
360+
)
342361
}
343362
}
344363

@@ -347,7 +366,7 @@ where
347366
T: Zero + fmt::Display,
348367
{
349368
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
350-
write!(f, "{}", self.to_string_variable("x"))
369+
self.display_with_var_name(f, "x")
351370
}
352371
}
353372

src/systems/state_space.rs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
use std::{
2+
any::TypeId,
23
error::Error,
4+
fmt,
35
marker::PhantomData,
46
ops::{
57
Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign,
68
},
79
};
810

9-
use crate::utils::traits::Time;
11+
use crate::{Continuous, Discrete, utils::traits::Time};
1012
extern crate nalgebra as na;
1113
use na::DMatrix;
1214

@@ -593,6 +595,27 @@ macro_rules! impl_scalar_math_operator_ss {
593595

594596
impl_scalar_math_operator_ss!([(Add, add), (Sub, sub), (Mul, mul), (Div, div)]);
595597

598+
impl<U: Time + 'static> fmt::Display for Ss<U> {
599+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
600+
write!(
601+
f,
602+
"\nA = {} B = {} C = {} D = {}",
603+
self.a(),
604+
self.b(),
605+
self.c(),
606+
self.d()
607+
)?;
608+
let time_domain = if TypeId::of::<U>() == TypeId::of::<Continuous>() {
609+
"Continuous"
610+
} else if TypeId::of::<U>() == TypeId::of::<Discrete>() {
611+
"Discrete"
612+
} else {
613+
"Unknown"
614+
};
615+
write!(f, "{}-time state-space model\n\n", time_domain)
616+
}
617+
}
618+
596619
#[cfg(test)]
597620
mod tests {
598621
use core::f64;
@@ -857,4 +880,18 @@ mod tests {
857880
assert_abs_diff_eq!(tf_fb, ss_fb, epsilon = 1e-1);
858881
}
859882
}
883+
884+
#[test]
885+
fn ss_display() {
886+
let sys = (1.0 / Tf::s()).to_ss().unwrap();
887+
println!("1: {}", sys);
888+
889+
let sys = Ss::<Discrete>::new_from_scalar(2.0);
890+
println!("2: {}", sys);
891+
892+
let sys = ((1.0 + Tf::s()) / ((Tf::s() - 1.0) * Tf::s()).powi(2))
893+
.to_ss()
894+
.unwrap();
895+
println!("3: {}after", sys);
896+
}
860897
}

src/systems/transfer_function.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,7 @@ where
175175
} else {
176176
"x"
177177
};
178-
let rf_str = self.rf.to_string_variable(var_name);
179-
write!(f, "{}", rf_str)
178+
self.rf.display_with_var_name(f, var_name)
180179
}
181180
}
182181

@@ -579,4 +578,15 @@ mod tests {
579578
let tf_series = tf1.clone().series(tf2.clone());
580579
assert_eq!(tf_series, tf_mul);
581580
}
581+
582+
#[test]
583+
fn tf_display() {
584+
let tf = 1.0 / Tf::s();
585+
println!("1: {}", tf);
586+
let tf = 1.0 / Tf::s().powi(5) * (Tf::s() + 1.0);
587+
println!("2: {}", tf);
588+
let tf =
589+
2.1 / Tf::s() * (Tf::s() - 1.2).powi(5) / (Tf::s() + 1.0).powi(3);
590+
println!("3: {}", tf);
591+
}
582592
}

0 commit comments

Comments
 (0)