pub struct FopdtModel<T> { /* private fields */ }Expand description
First-Order Plus Dead Time (FOPDT) process model.
Models a process as:
G(s) = K · e^(-Ls) / (τs + 1)where K is the static gain, τ is the time constant, and L is the
dead time (transport delay).
§Example
use numeris::control::FopdtModel;
let model = FopdtModel::new(2.5_f64, 3.0, 0.5).unwrap();
assert_eq!(model.gain(), 2.5);
assert_eq!(model.tau(), 3.0);
assert_eq!(model.delay(), 0.5);Implementations§
Source§impl<T: FloatScalar> FopdtModel<T>
impl<T: FloatScalar> FopdtModel<T>
Sourcepub fn new(gain: T, tau: T, delay: T) -> Result<Self, ControlError>
pub fn new(gain: T, tau: T, delay: T) -> Result<Self, ControlError>
Sourcepub fn ziegler_nichols(&self) -> PidGains<T>
pub fn ziegler_nichols(&self) -> PidGains<T>
Ziegler-Nichols open-loop tuning (reaction curve method).
Based on the process reaction curve (step response). Gives aggressive tuning with ~25% overshoot.
§Panics
Panics if L == 0 (Ziegler-Nichols requires non-zero dead time).
§Example
use numeris::control::FopdtModel;
let model = FopdtModel::new(1.0_f64, 1.0, 0.2).unwrap();
let gains = model.ziegler_nichols();
// Kp = 1.2·τ/(K·L), Ti = 2L, Td = L/2
assert!((gains.kp - 6.0).abs() < 1e-10);Sourcepub fn cohen_coon(&self) -> PidGains<T>
pub fn cohen_coon(&self) -> PidGains<T>
Cohen-Coon tuning rule.
Better than Ziegler-Nichols for processes with large dead time (L/τ > 0.5). Targets quarter-decay ratio.
§Panics
Panics if L == 0.
§Example
use numeris::control::FopdtModel;
let model = FopdtModel::new(1.0_f64, 1.0, 0.5).unwrap();
let gains = model.cohen_coon();
assert!(gains.kp > 0.0);
assert!(gains.ki > 0.0);
assert!(gains.kd > 0.0);Sourcepub fn simc(&self, tau_c: T) -> PidGains<T>
pub fn simc(&self, tau_c: T) -> PidGains<T>
SIMC (Skogestad Internal Model Control) tuning rule.
Provides a good balance between performance and robustness.
The tau_c parameter controls the closed-loop time constant:
larger values give more conservative (robust) tuning.
A common starting point is tau_c = L (aggressive) or tau_c = τ
(conservative).
§Parameters
tau_c: desired closed-loop time constant (positive)
§Panics
Panics if tau_c <= 0.
§Example
use numeris::control::FopdtModel;
let model = FopdtModel::new(1.0_f64, 2.0, 0.3).unwrap();
let gains = model.simc(0.3); // tau_c = L (aggressive)
assert!(gains.kp > 0.0);Trait Implementations§
Source§impl<T: Clone> Clone for FopdtModel<T>
impl<T: Clone> Clone for FopdtModel<T>
Source§fn clone(&self) -> FopdtModel<T>
fn clone(&self) -> FopdtModel<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: Debug> Debug for FopdtModel<T>
impl<T: Debug> Debug for FopdtModel<T>
impl<T: Copy> Copy for FopdtModel<T>
Auto Trait Implementations§
impl<T> Freeze for FopdtModel<T>where
T: Freeze,
impl<T> RefUnwindSafe for FopdtModel<T>where
T: RefUnwindSafe,
impl<T> Send for FopdtModel<T>where
T: Send,
impl<T> Sync for FopdtModel<T>where
T: Sync,
impl<T> Unpin for FopdtModel<T>where
T: Unpin,
impl<T> UnsafeUnpin for FopdtModel<T>where
T: UnsafeUnpin,
impl<T> UnwindSafe for FopdtModel<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.