Source code for rtdpy.zusatz
import numpy as np
from rtdpy.rtd import RTD, RTDInputError
[docs]class Zusatz(RTD):
"""
Create Zusatz Residence Time Distribution (RTD) model. [1]_
Parameter a is chosen such that the integral is 1.
.. math::
E(t) = a t^{-c-1} b^{c+1}
\\text{exp}\\left[\\left(b^c t^{-c} -1\\right)\\frac{-c-1}{c}\\right]
\\\\a = \\frac{1+c}{b\\, \\text{exp}\\left[1+1/c\\right]}
Parameters
----------
b : scalar
b Zusatz parameter. ``b>0``
c : scalar
c Zusatz parameter. ``c>0``
Mean residence time only defined for ``c>1``.
Variance only defined for ``c>2``.
dt : scalar
Time step for RTD. ``dt>0``
time_end : scalar
End time for RTD. ``time_end>0``
References
----------
.. [1] Poulesquen A., et al. (2003) A study of residence time distribution
in co-rotating twin-screw extruders. Part II: Experimental
validation. "Polymer Engineering and Science", 43(12), 1849-1862.
Examples
--------
>>> import matplotlib.pyplot as plt
>>> import rtdpy
>>> for c in [3, 7]:
>>> a = rtdpy.Zusatz(b=25, c=c, dt=.01, time_end=100)
>>> plt.plot(a.time, a.exitage, label=f"c={c}")
>>> plt.xlabel('Time')
>>> plt.ylabel('Exit Age Function')
>>> plt.legend()
>>> plt.show()
"""
def __init__(self, b, c, dt, time_end):
super().__init__(dt, time_end)
if b <= 0:
raise RTDInputError("b less than zero")
self._b = b
if c <= 0:
raise RTDInputError("c less than zero")
self._c = c
self._a = self._calc_a()
self._exitage = self._calc_exitage()
def _calc_exitage(self):
"""equation for exit age function"""
time_safe = np.clip(self.time, np.finfo(float).eps, None)
output = self.a * time_safe**(-self.c-1) \
* self.b**(self.c + 1) \
* np.exp((self.b**self.c * time_safe**(-1 * self.c) - 1)
* (-self.c - 1) / self.c)
return output
def _calc_a(self):
"""Calculate a to normalize rtd"""
return (1 + self.c) / (self.b * np.exp(1 + 1 / self.c))
@property
def a(self):
"""a parameter that normalizes RTD to 1"""
return self._a
@property
def b(self):
"""b parameter"""
return self._b
@property
def c(self):
"""c parameter"""
return self._c
def __repr__(self):
"""Returns representation of object"""
return ("Zusatz(b={}, c={}, dt={}, time_end={})".format(
self.b, self.c, self.dt, self.time_end))