Simulation with observer based state feedback of the reaction-convection-diffusion equation

Implementation of the approximation scheme presented in [RW2018b]. The system

\begin{align*}
    \dot x(z,t) &= a_2 x''(z,t) + a_1 x'(z,t) + a_0 x(z,t) \\
    x'(0,t) &= \alpha x(0,t) \\
    x'(1,t) &= -\beta x(1,t) + u(t) \\
\end{align*}

and the observer

\begin{align*}
    \dot{\hat{x}}(z,t) &= a_2 \hat x''(z,t) + a_1 \hat x'(z,t)
                    + a_0 \hat x(z,t) + l(z) \tilde y(t)\\
    \hat x'(0,t) &= \alpha \hat x(0,t) + l_0 \tilde y(t) \\
    \hat x'(1,t) &= -\beta \hat x(1,t) + u(t) \\
\end{align*}

are approximated with LagrangeFirstOrder (FEM) shapefunctions and the backstepping controller and observer are approximated with the eigenfunctions respectively the adjoint eigenfunction of the system operator, see [RW2018b].

Note

For now, only a0 = 0 and a0_t_o = 0 are supported, because of some limitations of the automatic observer gain transformation, see evaluate_transformations() docstring.

References

RW2018b(1,2)

Marcus Riesmeier and Frank Woittennek; On approximation of backstepping observers for parabolic systems with robin boundary conditions; In: Proceedings of the 57th IEEE, International Conference on Decision and Control (CDC), Miami, Florida, USA, December 17-19, 2018.

class ReversedRobinEigenfunction(om, param, l, scale=1, max_der_order=2)

Bases: pyinduct.SecondOrderRobinEigenfunction

This class provides an eigenfunction \varphi(z) to the eigenvalue problem given by

a_2\varphi''(z) + a_1&\varphi'(z) + a_0\varphi(z) = \lambda\varphi(z)

\varphi'(0) &= \alpha \varphi(0)

\varphi'(l) &= -\beta \varphi(l) .

The eigenfrequency \omega = \sqrt{-\frac{a_1^2}{4a_2^2}+\frac{a_0-\lambda}{a_2}} must be provided (for example with the eigfreq_eigval_hint() of this class).

Parameters
  • om (numbers.Number) – eigenfrequency \omega

  • param (array_like) – \Big( a_2, a_1, a_0, \alpha, \beta \Big)^T

  • l (numbers.Number) – End of the domain z\in [0,l].

  • scale (numbers.Number) – Factor to scale the eigenfunctions (corresponds to \varphi(0)=\text{phi\_0}).

  • max_der_order (int) – Number of derivative handles that are needed.

static eigfreq_eigval_hint(param, l, n_roots, show_plot=False)

Return the first n_roots eigenfrequencies \omega and eigenvalues \lambda.

\omega_i = \sqrt{
- \frac{a_1^2}{4a_2^2}
+ \frac{a_0 - \lambda_i}{a_2}}
\quad i = 1, \dotsc, \text{n\_roots}

to the considered eigenvalue problem.

Parameters
  • param (array_like) – Parameters \big( a_2, a_1, a_0, \alpha, \beta \big)^T

  • l (numbers.Number) – Right boundary value of the domain [0,l]\ni z.

  • n_roots (int) – Amount of eigenfrequencies to compute.

  • show_plot (bool) – Show a plot window of the characteristic equation.

Returns

\Big(\big[\omega_1, \dotsc, \omega_{\text{n\_roots}}\Big],
\Big[\lambda_1, \dotsc, \lambda_{\text{n\_roots}}\big]\Big)

Return type

tuple –> booth tuple elements are numpy.ndarrays of length nroots

function_handle_factory(self, old_handle, l, der_order=0)
approximate_observer(obs_params, sys_params, sys_domain, sys_lbl, obs_sys_lbl, test_lbl, tar_test_lbl, system_input)
run(show_plots)