(remove preliminary warning) |
(Fixes, Python code, N->n) |
||
Line 12: | Line 12: | ||
For an all-pass system, the transfer function has the property <math>g(s)g(-s) = \sigma^2</math>, <math>\sigma > 0</math>, |
For an all-pass system, the transfer function has the property <math>g(s)g(-s) = \sigma^2</math>, <math>\sigma > 0</math>, |
||
or (equivalently) the controllability and observability Gramians are quasi inverse to each other: <math>W_C W_O = \sigma I</math>, |
or (equivalently) the controllability and observability Gramians are quasi inverse to each other: <math>W_C W_O = \sigma I</math>, |
||
− | which means this system has a |
+ | which means this system has a single Hankel singular value of multiplicity of the system's order. |
− | The system matrices are |
+ | The system matrices are constructed based on the scheme: |
:<math> |
:<math> |
||
\begin{align} |
\begin{align} |
||
+ | A &= |
||
⚫ | |||
+ | \begin{pmatrix} |
||
⚫ | |||
⚫ | |||
− | & \ddots & \ddots & \ddots \\ |
||
⚫ | |||
− | & & \alpha_{N-1} & 0 & -\alpha_{N-1} \end{pmatrix}, \\ |
||
− | + | & \alpha_2 & 0 & \ddots \\ |
|
− | + | & & \ddots & \ddots & -\alpha_{N-1} \\ |
|
+ | & & & \alpha_{N-1} & 0 |
||
+ | \end{pmatrix}, \\ |
||
+ | B &= |
||
+ | \begin{pmatrix} |
||
+ | b_1 \\ |
||
+ | 0 \\ |
||
+ | \vdots \\ |
||
+ | 0 |
||
+ | \end{pmatrix}, \\ |
||
+ | C &= |
||
+ | \begin{pmatrix} |
||
+ | s_1 b_1 & 0 & \cdots & 0 |
||
+ | \end{pmatrix}, \\ |
||
D &= -s_1 \sigma. |
D &= -s_1 \sigma. |
||
\end{align} |
\end{align} |
||
</math> |
</math> |
||
− | We choose <math>s_1 \in \{-1,1\}</math> |
+ | We choose <math>s_1 \in \{-1,1\}</math> to be <math>s_1 \equiv -1</math>, as this makes the system state-space-anti-symmetric. |
− | Furthermore, <math>b_1 = 1</math> and <math>\ |
+ | Furthermore, <math>b_1 = 1</math> and <math>\sigma = 1</math>, which makes <math>a_{1,1} = -\frac{b_1^2}{2 \sigma} = -\frac{1}{2}</math>. |
==Data== |
==Data== |
||
Line 36: | Line 49: | ||
<!-- TODO add unbalancing transformation --> |
<!-- TODO add unbalancing transformation --> |
||
⚫ | |||
− | |||
⚫ | |||
− | <div class="thumbinner" style="width:20%;text-align:left;"><!--[[Media:allpass.m|--> |
||
⚫ | |||
− | |||
⚫ | |||
% allpass (all-pass system) |
% allpass (all-pass system) |
||
% by Christian Himpe, 2020 |
% by Christian Himpe, 2020 |
||
Line 46: | Line 56: | ||
%* |
%* |
||
− | A = gallery('tridiag', |
+ | A = gallery('tridiag',n,-1,0,1); |
A(1,1) = -0.5; |
A(1,1) = -0.5; |
||
− | B = sparse(1,1,1, |
+ | B = sparse(1,1,1,n,1); |
C = -B'; |
C = -B'; |
||
D = 1; |
D = 1; |
||
end |
end |
||
</source> |
</source> |
||
− | <!--]]--></div> |
||
− | The function call requires one argument; the number of states <math> |
+ | The function call requires one argument; the number of states <math>n</math>. |
The return value consists of four matrices; the system matrix <math>A</math>, the input matrix <math>B</math>, the output matrix <math>C</math>, and the feed-through matrix <math>D</math>. |
The return value consists of four matrices; the system matrix <math>A</math>, the input matrix <math>B</math>, the output matrix <math>C</math>, and the feed-through matrix <math>D</math>. |
||
:<source lang="matlab"> |
:<source lang="matlab"> |
||
− | [A,B,C,D] = allpass( |
+ | [A,B,C,D] = allpass(n); |
</source> |
</source> |
||
+ | An equivalent [https://www.python.org/ Python] code is |
||
⚫ | |||
+ | :<source lang="python"> |
||
+ | from scipy.sparse import diags, lil_matrix |
||
+ | |||
+ | def allpass(n): |
||
+ | A = diags([-1, 0, 1], offsets=[-1, 0, 1], shape=(n, n), format='lil') |
||
+ | A[0, 0] = -0.5 |
||
+ | A = A.tocsc() |
||
+ | B = lil_matrix((n, 1)) |
||
+ | B[0, 0] = 1 |
||
+ | B = B.tocsc() |
||
+ | C = -B.T |
||
+ | D = 1 |
||
+ | return A, B, C, D |
||
+ | </source> |
||
+ | |||
⚫ | |||
:<math> |
:<math> |
||
− | \begin{ |
+ | \begin{align} |
− | \dot{x}(t) &= |
+ | \dot{x}(t) &= Ax(t) + Bu(t) \\ |
− | y(t) &= |
+ | y(t) &= Cx(t) + Du(t) |
− | \end{ |
+ | \end{align} |
</math> |
</math> |
||
System dimensions: |
System dimensions: |
||
− | <math>A \in \mathbb{R}^{ |
+ | <math>A \in \mathbb{R}^{n \times n}</math>, |
− | <math>B \in \mathbb{R}^{ |
+ | <math>B \in \mathbb{R}^{n \times 1}</math>, |
− | <math>C \in \mathbb{R}^{1 \times |
+ | <math>C \in \mathbb{R}^{1 \times n}</math>, |
<math>D \in \mathbb{R}</math>. |
<math>D \in \mathbb{R}</math>. |
||
Revision as of 03:00, 29 August 2023
Description
This procedural benchmark generates an all-pass SISO system based on [1].
For an all-pass system, the transfer function has the property ,
,
or (equivalently) the controllability and observability Gramians are quasi inverse to each other:
,
which means this system has a single Hankel singular value of multiplicity of the system's order.
The system matrices are constructed based on the scheme:
We choose to be
, as this makes the system state-space-anti-symmetric.
Furthermore,
and
, which makes
.
Data
This benchmark is procedural and the state dimensions can be chosen. Use the following MATLAB code to generate a random system as described above:
function [A,B,C,D] = allpass(n) % allpass (all-pass system) % by Christian Himpe, 2020 % released under BSD 2-Clause License %* A = gallery('tridiag',n,-1,0,1); A(1,1) = -0.5; B = sparse(1,1,1,n,1); C = -B'; D = 1; end
The function call requires one argument; the number of states .
The return value consists of four matrices; the system matrix
, the input matrix
, the output matrix
, and the feed-through matrix
.
[A,B,C,D] = allpass(n);
An equivalent Python code is
from scipy.sparse import diags, lil_matrix def allpass(n): A = diags([-1, 0, 1], offsets=[-1, 0, 1], shape=(n, n), format='lil') A[0, 0] = -0.5 A = A.tocsc() B = lil_matrix((n, 1)) B[0, 0] = 1 B = B.tocsc() C = -B.T D = 1 return A, B, C, D
Dimensions
System dimensions:
,
,
,
.
Citation
To cite this benchmark, use the following references:
- For the benchmark itself and its data:
- The MORwiki Community, All-Pass System. MORwiki - Model Order Reduction Wiki, 2020. http://modelreduction.org/index.php/All_pass_system
@MISC{morwiki_allpass, author = {{The MORwiki Community}}, title = {All-Pass System}, howpublished = {{MORwiki} -- Model Order Reduction Wiki}, url = {http://modelreduction.org/index.php/All_pass_system}, year = {2020} }
References
- ↑ R.J. Ober. "Asymptotically Stable All-Pass Transfer Functions: Canonical Form, Parametrization and Realization", IFAC Proceedings Volumes, 20(5): 181--185, 1987.