Skip to content

Commit 48606a4

Browse files
committed
fixes #46 and inconsistency
1 parent fd30e22 commit 48606a4

2 files changed

Lines changed: 21 additions & 5 deletions

File tree

src/analysis/frequency_response.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@ fn freq_response_ss_mat(
195195
assert_eq!(m, 1, "Function is only tested for SISO systems");
196196
assert_eq!(p, 1, "Function is only tested for SISO systems");
197197

198+
if n == 0 {
199+
let res = DMatrix::from_iterator(p, m, d.iter().map(|&x| c64(x, 0.0)));
200+
return Ok(res);
201+
}
202+
198203
let baleig = CString::new("A").unwrap(); // balance A and compute condition number
199204
let inita = CString::new("G").unwrap(); // general A matrix
200205

@@ -272,7 +277,7 @@ fn freq_response_ss_mat(
272277

273278
#[cfg(test)]
274279
mod tests {
275-
use crate::{FrequencyResponse, Tf};
280+
use crate::{Continuous, FrequencyResponse, Ss, Tf, utils::traits::Mag2Db};
276281

277282
use super::log_space;
278283
use approx::assert_abs_diff_eq;
@@ -317,4 +322,15 @@ mod tests {
317322
assert_abs_diff_eq!(res_tf.im, res_tf.im, epsilon = 1e-3);
318323
}
319324
}
325+
326+
#[test]
327+
fn ss_freq_resp_edge_cases() {
328+
let gain = 3.0;
329+
let ss = Ss::<Continuous>::new_from_scalar(gain);
330+
let mag_phase_freq = ss.bode(0.1, 10.);
331+
for [mag, phase, _] in mag_phase_freq {
332+
assert_abs_diff_eq!(mag, gain.mag2db(), epsilon = 1e-6);
333+
assert_abs_diff_eq!(phase, 0.);
334+
}
335+
}
320336
}

src/systems/state_space.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ impl<U: Time + 'static> Ss<U> {
394394
/// # Panics
395395
/// This function will panic if the input-output dimensions of `self` and
396396
/// `sys2` do not match.
397-
pub fn feedback(self, sys2: Self) -> Self {
397+
pub fn feedback(self, sys2: &Self) -> Self {
398398
assert_eq!(self.ninputs(), sys2.noutputs());
399399
assert_eq!(self.noutputs(), sys2.ninputs());
400400
self.assert_valid();
@@ -960,12 +960,12 @@ mod tests {
960960
let ss1 = (Tf::s() / (Tf::s() + 1.0)).to_ss().unwrap();
961961
let ss2 = (1.0 / Tf::s()).to_ss().unwrap();
962962

963-
let ss_fb = ss1.clone().feedback(ss2.clone());
963+
let ss_fb = ss1.clone().feedback(&ss2);
964964
let tf_fb = ss_fb.to_tf().unwrap();
965965
assert_abs_diff_eq!(tf_fb, Tf::s() / (Tf::s() + 2.0));
966966

967967
let ss2 = Ss::<Continuous>::new_from_scalar(1.0);
968-
let ss_fb = ss1.clone().feedback(ss2.clone());
968+
let ss_fb = ss1.clone().feedback(&ss2);
969969
let tf_fb = ss_fb.to_tf().unwrap();
970970
assert_abs_diff_eq!(tf_fb, 0.5 * Tf::s() / (Tf::s() + 0.5));
971971

@@ -989,7 +989,7 @@ mod tests {
989989
let ss1 = tf1.to_ss_method(ControllableCF).unwrap();
990990
let ss2 = tf2.to_ss_method(ObservableCF).unwrap();
991991

992-
let ss_fb = ss1.feedback(ss2);
992+
let ss_fb = ss1.feedback(&ss2);
993993
let ss_fb = ss_fb.to_tf().unwrap();
994994
let tf_fb = tf1.feedback(&tf2);
995995

0 commit comments

Comments
 (0)