sharpy.linear.src.lingebm.newmark_ss(M, C, K, dt, num_damp=0.0001, M_is_SPD=False)[source]

Produces a discrete-time state-space model of the 2nd order ordinary differential equation (ODE) given by:

\[\mathbf{M}\mathbf{\ddot{q}} + \mathbf{C}\mathbf{\dot{q}} + \mathbf{K}\mathbf{q} = \mathbf{f(t)}\]

This ODE is discretized based on the Newmark-\(\beta\) integration scheme.

The output state-space model has the form:

\[\begin{split}\mathbf{x}_{n+1} &= \mathbf{A_{ss}}\mathbf{x}_n + \mathbf{B_{ss}}\mathbf{f}_n \\ \mathbf{y}_n &= \mathbf{C_{ss}}\mathbf{x}_n + \mathbf{D_{ss}}\mathbf{f}_n\end{split}\]

where \(\mathbf{y} = \begin{Bmatrix} \mathbf{q} \\ \mathbf{\dot{q}} \end{Bmatrix}\)

Note that as the state-space representation only requires the input force \(\mathbf{f}\) to be evaluated at time-step \(n\), thus the pass-through matrix \(\mathbf{D_{ss}}\) is not zero.

This function retuns a tuple with the discrete state-space matrices \((\mathbf{A_{ss},B_{ss},C_{ss},D_{ss}})\).


The following steps describe how to apply the Newmark-\(\beta\) scheme to the ODE in order to generate the discrete time-state space-model. It folows the development of [1].


Bold upper case letters represent matrices, bold lower case letters represent vectors. Non-bold symbols are scalars. Curly brackets indicate (block) vectors and square brackets indicate (block) matrices.

Evaluating the ODE to the time steps \(t_n\) and \(t_{n+1}\) and isolating the acceleration term:

\[\begin{split}\mathbf{\ddot q}_{n} &= - \mathbf{M}^{-1}\mathbf{C}\mathbf{\dot{q}}_{n} - \mathbf{M}^{-1}\mathbf{K}\mathbf{q}_{n} + \mathbf{M}^{-1}\mathbf{f}_{n} \\ \mathbf{\ddot q}_{n+1} &= - \mathbf{M}^{-1}\mathbf{C}\mathbf{\dot{q}}_{n+1} - \mathbf{M}^{-1}\mathbf{K}\mathbf{q}_{n+1} + \mathbf{M}^{-1}\mathbf{f}_{n+1} \\\end{split}\]

The update equations of the Newmark-beta scheme are [1]:

\[\begin{split}\mathbf{q}_{n+1} &= \mathbf{q}_n + \mathbf{\dot q}_n\Delta t + (1/2-\beta)\mathbf{\ddot q}_n \Delta t^2 + \beta \mathbf{\ddot q}_{n+1} \Delta t^2 + O(\Delta t^3) \\ \mathbf{\dot q}_{n+1} &= \mathbf{\dot q}_n + (1-\gamma)\mathbf{\ddot q}_n \Delta t + \gamma \mathbf{\ddot q}_{n+1} \Delta t + O(\Delta t^3)\end{split}\]

where \(\Delta t = t_{n+1} - t_n\).

The stencil is unconditionally stable if the tuning parameters \(\gamma\) and \(\beta\) are chosen as:

\[\begin{split}\gamma &= \frac{1}{2} + \alpha \\ \beta &= \frac{(1+\alpha)^2}{4} = \frac{(1/2+\gamma)^2}{4} = \frac{1}{16} + \frac{1}{4}(\gamma + \gamma^2)\end{split}\]

where \(\alpha>0\) accounts for small positive algorithmic damping (\(\alpha\) is num_damp in the code).

Substituting the former relations onto the later ones, rearranging terms, and writing it in state-space form:

\[\begin{split}\mathbf{A_{ss1}} \begin{Bmatrix} \mathbf{q}_{n+1} \\ \mathbf{\dot q}_{n+1} \end{Bmatrix} = \mathbf{A_{ss0}} \begin{Bmatrix} \mathbf{q}_{n} \\ \mathbf{\dot q}_{n} \end{Bmatrix} + \mathbf{B_{ss0}} \mathbf{f}_n + \mathbf{B_{ss1}} \mathbf{f}_{n+1}\end{split}\]


\[\begin{split}\mathbf{A_{ss1}} &= \begin{bmatrix} \mathbf{I} + \beta\Delta t^2 \mathbf{M}^{-1}\mathbf{K} & \beta\Delta t^2 \mathbf{M}^{-1}\mathbf{C} \\ \gamma \Delta t \mathbf{M}^{-1}\mathbf{K} & \mathbf{I}+ \gamma \Delta t \mathbf{M}^{-1}\mathbf{C} \end{bmatrix} \\ \mathbf{A_{ss0}} &= \begin{bmatrix} \mathbf{I} - \Delta t^2(1/2-\beta)\mathbf{M}^{-1}\mathbf{K} & \Delta t \mathbf{I} - (1/2-\beta)\Delta t^2 \mathbf{M}^{-1}\mathbf{C} \\ -(1-\gamma)\Delta t \mathbf{M}^{-1}\mathbf{K} & \mathbf{I} - (1-\gamma)\Delta t \mathbf{M}^{-1}\mathbf{C} \end{bmatrix} \\ \mathbf{B_{ss0}} &= \begin{bmatrix} (\Delta t^2(1/2-\beta) \mathbf{M}^{-1} \\ (1-\gamma)\Delta t \mathbf{M}^{-1} \end{bmatrix} \\ \mathbf{B_{ss1}} &= \begin{bmatrix} (\beta \Delta t^2) \mathbf{M}^{-1}\\ (\gamma \Delta t) \mathbf{M}^{-1} \end{bmatrix}\end{split}\]

This is not in standard space-state form because the state update equation depends of the input at \(t_{n+1}\). This term can be eliminated by defining the state

\[\begin{split}\mathbf{x}_n = \begin{Bmatrix} \mathbf{q}_{n} \\ \mathbf{\dot q}_{n} \end{Bmatrix} - \mathbf{A}_{\mathbf{ss1}}^{-1}\mathbf{B_{ss1}} \mathbf{f}_n\end{split}\]


\[\begin{split}\mathbf{x}_{n+1} &= \mathbf{A}_{\mathbf{ss1}}^{-1}[ \mathbf{A_{ss0}} \mathbf{x}_n + ( \mathbf{A_{ss0}}\mathbf{A}_{\mathbf{ss1}}^{-1}\mathbf{B_{ss1}} + \mathbf{B_{ss0}} ) \mathbf{f}_n ] \\ \begin{Bmatrix} \mathbf{q}_{n} \\ \mathbf{\dot q}_{n} \end{Bmatrix} &= \mathbf{x}_n + \mathbf{A}_{\mathbf{ss1}}^{-1}\mathbf{B_{ss1}} \mathbf{f}_n\end{split}\]

See also sharpy.linear.src.libss.SSconv() for more details on the elimination of the term multiplying \(\mathbf{f}_{n+1}\) in the state equation.

This system is identified with a standard discrete-time state-space model

\[\begin{split}\mathbf{x}_{n+1} &= \mathbf{A_{ss}} \mathbf{x}_n + \mathbf{B_{ss}} \mathbf{f}_n \\ \mathbf{y_n} &= \mathbf{C_{ss}} \mathbf{x}_n + \mathbf{D_{ss}} \mathbf{f}_n\end{split}\]


\[\begin{split}\mathbf{A_{ss}} &= \mathbf{A}_{\mathbf{ss1}}^{-1}\mathbf{A_{ss0}} \\ \mathbf{B_{ss}} &= \mathbf{A_{\mathbf{ss1}}^{-1}(\mathbf{B_{ss0}} + \mathbf{A_{ss0}}\mathbf{A_{\mathbf{ss1}}^{-1}\mathbf{B_{ss1}}) \\ \mathbf{C_{ss}} &= \mathbf{I} \\ \mathbf{D_{ss}} &= \mathbf{A_{\mathbf{ss1}}^{-1}\mathbf{B_{ss1}}\end{split}\]

Notation is used in the code

\[\begin{split}\texttt{th1} &= \gamma \\ \texttt{th2} &= \beta \\ \texttt{a0} &= (1/2 -\beta) \Delta t^2 \\ \texttt{b0} &= (1 -\gamma) \Delta t \\ \texttt{a1} &= \beta \Delta t^2 \\ \texttt{b1} &= \gamma \Delta t \\\end{split}\]
param M:

Mass matrix \(\mathbf{M}\)

type M:


param C:

Damping matrix \(\mathbf{C}\)

type C:


param K:

Stiffness matrix \(\mathbf{K}\)

type K:


param dt:

Timestep increment

type dt:


param num_damp:

Numerical damping. Default 1e-4

type num_damp:


param M_is_SPD:

whether to factorized M using Cholesky (only works for SPD matrices) or LU decomposition. Default: False

type M_is_SPD:



with the \((\mathbf{A_{ss},B_{ss},C_{ss},D_{ss}})\) matrices of the discrete-time state-space representation




[1] - Geradin M., Rixen D. - Mechanical Vibrations: Theory and application to structural dynamics