scipy 1.8.0 Pypi GitHub Homepage
Other Docs
NotesParametersReturnsBackRef
cont2discrete(system, dt, method='zoh', alpha=None)

Notes

By default, the routine uses a Zero-Order Hold (zoh) method to perform the transformation. Alternatively, a generalized bilinear transformation may be used, which includes the common Tustin's bilinear approximation, an Euler's method technique, or a backwards differencing technique.

The Zero-Order Hold (zoh) method is based on , the generalized bilinear approximation is based on and , the First-Order Hold (foh) method is based on .

Parameters

system : a tuple describing the system or an instance of `lti`

The following gives the number of elements in the tuple and the interpretation:

  • 1: (instance of lti )

  • 2: (num, den)

  • 3: (zeros, poles, gain)

  • 4: (A, B, C, D)

dt : float

The discretization time step.

method : str, optional

Which method to use:

  • gbt: generalized bilinear transformation

  • bilinear: Tustin's approximation ("gbt" with alpha=0.5)

  • euler: Euler (or forward differencing) method ("gbt" with alpha=0)

  • backward_diff: Backwards differencing ("gbt" with alpha=1.0)

  • zoh: zero-order hold (default)

  • foh: first-order hold (versionadded: 1.3.0)

  • impulse: equivalent impulse response (versionadded: 1.3.0)

alpha : float within [0, 1], optional

The generalized bilinear transformation weighting parameter, which should only be specified with method="gbt", and is ignored otherwise

Returns

sysd : tuple containing the discrete system

Based on the input type, the output will be of the form

  • (num, den, dt) for transfer function input

  • (zeros, poles, gain, dt) for zeros-poles-gain input

  • (A, B, C, D, dt) for state-space system input

Transform a continuous to a discrete state-space system.

Examples

We can transform a continuous state-space system to a discrete one:

>>> import matplotlib.pyplot as plt
... from scipy.signal import cont2discrete, lti, dlti, dstep

Define a continuous state-space system.

>>> A = np.array([[0, 1],[-10., -3]])
... B = np.array([[0],[10.]])
... C = np.array([[1., 0]])
... D = np.array([[0.]])
... l_system = lti(A, B, C, D)
... t, x = l_system.step(T=np.linspace(0, 5, 100))
... fig, ax = plt.subplots()
... ax.plot(t, x, label='Continuous', linewidth=3)

Transform it to a discrete state-space system using several methods.

>>> dt = 0.1
... for method in ['zoh', 'bilinear', 'euler', 'backward_diff', 'foh', 'impulse']:
...  d_system = cont2discrete((A, B, C, D), dt, method=method)
...  s, x_d = dstep(d_system)
...  ax.step(s, np.squeeze(x_d), label=method, where='post')
... ax.axis([t[0], t[-1], x[0], 1.4])
... ax.legend(loc='best')
... fig.tight_layout()
... plt.show()
See :

Back References

The following pages refer to to this document either explicitly or contain code examples using this.

scipy.signal._ltisys.StateSpaceContinuous.to_discrete scipy.signal._ltisys.dstep scipy.signal._ltisys.ZerosPolesGainContinuous.to_discrete scipy.signal._ltisys.lti.to_discrete scipy.signal._ltisys.TransferFunctionContinuous.to_discrete scipy.signal._ltisys.dimpulse scipy.signal._lti_conversion.cont2discrete scipy.signal._ltisys.dlsim

Local connectivity graph

Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.

Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)

SVG is more flexible but power hungry; and does not scale well to 50 + nodes.

All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them


GitHub : /scipy/signal/_lti_conversion.py#335
type: <class 'function'>
Commit: