Anonymous
×
Create a new article
Write your page title here:
We currently have 105 articles on MOR Wiki. Type your article name above or click on one of the titles below and start writing!



MOR Wiki

Difference between revisions of "Synthetic parametric model"

 
(20 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 
[[Category:benchmark]]
 
[[Category:benchmark]]
[[Category:parametric system]]
+
[[Category:procedural]]
[[Category:linear system]]
+
[[Category:parametric]]
  +
[[Category:linear]]
 
[[Category:time invariant]]
 
[[Category:time invariant]]
[[Category:physical parameters]]
+
[[Category:Parametric]]
[[Category:one parameter]]
+
[[Category:first differential order]]
[[Category:first order system]]
+
[[Category:SISO]]
[[Category:synthetic model]]
+
[[Category:Sparse]]
   
  +
==Description==
   
  +
<figure id="fig1">[[File:synth_poles.png|600px|thumb|right|<caption>System poles for different parameter values.</caption>]]</figure>
== Introduction ==
 
On this page you will find a synthetic parametric model for which one can easily experiment with different system orders <math> n </math>, values of the parameter <math> \varepsilon </math>, as well as different poles and residues.
 
   
  +
On this page you will find a synthetic parametric model with one parameter for which one can easily experiment with different system orders, values of the parameter, as well as different poles and residues (see Fig.&nbsp;1).
Also, the decay of the Hankel singular values can be changed indirectly through the parameter <math> \varepsilon </math>.
 
  +
Also, the decay of the Hankel singular values can be changed indirectly through the parameter.
   
== Model description ==
+
===Model===
   
  +
We consider a dynamical system in the frequency domain given by its pole-residue form of the transfer function
The parameter <math>\varepsilon</math> scales the real part of the system poles, that is, <math>p_i=\varepsilon a_i+jb_i \, </math> with <math> j </math> the imaginary unit.
 
For a system in pole-residue form
 
   
  +
:<math>
  +
\begin{align}
  +
H(s,\varepsilon) & = \sum_{k=1}^{N}\frac{r_{k}}{s-p_{k}}\\
  +
& = \sum_{k=1}^{N}\frac{r_{k}}{s-(\varepsilon a_{k} + jb_{k})},
  +
\end{align}
  +
</math>
   
  +
with <math>p_{k} = \varepsilon a_{k} + jb_{k}</math> the poles of the system, <math>j</math> the imaginary unit, and <math>r_{k}</math> the residues.
:<math> H(s,\varepsilon) = \sum_{i=1}^{n}\frac{r_i}{s-p_i} = \sum_{i=1}^{n}\frac{r_i}{s-(\varepsilon a_i+jb_i)} </math>
 
  +
The parameter <math>\varepsilon</math> is used to scale the real part of the system poles.
  +
We can write down the state-space realization of the system's transfer function as
   
  +
:<math>
  +
\begin{align}
  +
H(s,\varepsilon) = \widehat{C}(sI_{N} - (\varepsilon \widehat{A}_{\varepsilon} + \widehat{A}_{0}))^{-1}\widehat{B},
  +
\end{align}
  +
</math>
   
  +
with the corresponding system matrices <math>\widehat{A}_{\varepsilon} \in \mathbb{R}^{N \times N}</math>, <math>\widehat{A}_{0} \in \mathbb{C}^{N \times N}</math>, <math>\widehat{B} \in \mathbb{R}^{N}</math>, and <math>\widehat{C}^{T} \in \mathbb{C}^{N}</math> given by
we can write down the state-space realization
 
   
  +
:<math>
  +
\begin{align}
  +
\varepsilon\widehat{A}_{\varepsilon} + \widehat{A}_{0}
  +
& = \varepsilon \begin{bmatrix} a_{1} & & \\ & \ddots & \\ & & a_{N} \end{bmatrix}
  +
+ \begin{bmatrix} jb_{1} & & \\ & \ddots & \\ & & jb_{N} \end{bmatrix},\\
  +
\widehat{B} & = \begin{bmatrix}1, & \ldots, & 1 \end{bmatrix}^{T},\\
  +
\widehat{C} & = \begin{bmatrix}r_{1}, & \ldots, & r_{n} \end{bmatrix}.
  +
\end{align}
  +
</math>
   
:<math> H(s,\varepsilon) = \widehat{C}\Big(sI-\varepsilon \widehat{A}_\varepsilon - \widehat{A}_0\Big)^{-1}\widehat{B}+D</math>
+
One notices that the system matrices <math>\widehat{A}_{0}</math> and <math>\widehat{C}</math> have complex entries.
  +
For rewriting the system with real matrices, we assume that <math>N</math> is even, <math>N=2m</math>, and that all system poles are complex and ordered in complex conjugate pairs, i.e.,
   
  +
:<math>
  +
\begin{align}
  +
p_{1} & = \varepsilon a_{1} + jb_{1},\\
  +
p_{2} & = \varepsilon a_{1} - jb_{1},\\
  +
& \ldots\\
  +
p_{N-1} & = \varepsilon a_{m} + jb_{m},\\
  +
p_{N} & = \varepsilon a_{m} - jb_{m}.
  +
\end{align}
  +
</math>
   
  +
Corresponding to the system poles, also the residues are written in complex conjugate pairs
with system matrices defined as
 
   
  +
:<math>
  +
\begin{align}
  +
r_{1} & = c_{1} + jd_{1},\\
  +
r_{2} & = c_{1} - jd_{1},\\
  +
& \ldots\\
  +
r_{N-1} & = c_{m} + jd_{m},\\
  +
r_N & = c_{m} - jd_{m}.
  +
\end{align}
  +
</math>
   
  +
Using this, the realization of the dynamical system can be written with matrices having real entries by
:<math>\varepsilon \widehat{A}_\varepsilon + \widehat{A}_0 = \varepsilon \left[\begin{array}{ccc} a_1 & & \\ & \ddots & \\ & & a_n\end{array}\right] +\left[\begin{array}{ccc} jb_1 & & \\ & \ddots & \\ & & jb_n\end{array}\right] ,</math>
 
   
  +
:<math>
:<math>\widehat{B} = [1,\ldots,1]^T,\quad \widehat{C} = [r_1,\ldots,r_n],\quad D = 0.</math>
 
  +
\begin{align}
  +
A_{\varepsilon} & = \begin{bmatrix} A_{\varepsilon, 1} & & \\ & \ddots & \\ & & A_{\varepsilon, m} \end{bmatrix}, &
  +
A_{0} & = \begin{bmatrix} A_{0, 1} & & \\ & \ddots & \\ & & A_{0, m} \end{bmatrix}, &
  +
B & = \begin{bmatrix} B_{1} \\ \vdots \\ B_{m} \end{bmatrix}, &
  +
C & = \begin{bmatrix} C_{1}, & \cdots, & C_{m} \end{bmatrix},
  +
\end{align}
  +
</math>
   
  +
with <math>A_{\varepsilon, k} = \begin{bmatrix} a_{k} & 0 \\ 0 & a_{k} \end{bmatrix}</math>, <math>A_{0, k} = \begin{bmatrix} 0 & b_{k} \\ -b_{k} & 0 \end{bmatrix}</math>, <math>B_{k} = \begin{bmatrix} 2 \\ 0 \end{bmatrix}</math>, <math>C_{k} = \begin{bmatrix} c_{k}, & d_{k} \end{bmatrix}</math>.
   
  +
<figure id="fig2">[[File:synth_freq_resp.png|600px|thumb|right|<caption>Frequency response of synthetic parametric system for different parameter values.</caption>]]</figure>
   
  +
===Numerical Values===
Notice that the system matrices have complex entries.
 
   
  +
<figure id="fig3">[[File:synth_hsv.png|600px|thumb|right|<caption>Hankel singular values of synthetic parametric system for different parameter values.</caption>]]</figure>
For simplicity, assume that <math> n </math> is even, <math> n=2k </math>, and that all system poles are complex and ordered in complex conjugate pairs, i.e.
 
   
  +
We construct a system of order <math>N = 100</math>.
:<math> p_1 = \varepsilon a_1+jb_1, p_2 = \varepsilon a_1-jb_1, \ldots, p_{n-1} = \varepsilon a_k+jb_k, p_n = \varepsilon a_k-jb_k, </math>
 
  +
The numerical values for the different variables are
   
  +
* <math>a_{k}</math> equally spaced in the interval <math>[-10^3, -10]</math>,
and the residues also form complex conjugate pairs
 
   
  +
* <math>b_{k}</math> equally spaced in the interval <math>[10, 10^3]</math>,
:<math> r_1 = c_1+jd_1, r_2 = c_1-jd_1, \ldots, r_{n-1} = c_k+jd_k, r_n = c_k-jd_k. </math>
 
   
  +
* <math>c_{k} = 1</math>,
Then a realization with matrices having real entries is given by
 
   
  +
* <math>d_{k} = 0</math>,
   
  +
* <math>\varepsilon \in \left[\frac{1}{50}, 1\right]</math>.
:<math> A_\varepsilon = \left[\begin{array}{ccc} A_{\varepsilon,1} & & \\ & \ddots & \\ & & A_{\varepsilon,k}\end{array}\right], \quad A_0 = \left[\begin{array}{ccc} A_{0,1} & & \\ & \ddots & \\ & & A_{0,k}\end{array}\right], \quad B = \left[\begin{array}{c} B_1 \\ \vdots \\ B_k\end{array}\right], \quad C = \left[\begin{array}{ccc} C_1 & \cdots & C_k\end{array}\right], \quad D = 0,</math>
 
   
   
  +
The frequency response of the transfer function <math>H(s,\varepsilon) = C(sI_{N}-(\varepsilon A_{\varepsilon} + A_{0}))^{-1}B</math> is plotted for parameter values <math>\varepsilon \in \left[\frac{1}{50}, \frac{1}{20}, \frac{1}{10}, \frac{1}{5}, \frac{1}{2}, 1\right]</math> in Fig.&nbsp;2.
with <math> A_{\varepsilon,i} = \left[\begin{array}{cc} a_i& 0 \\ 0 & a_i \end{array}\right] </math>,
 
<math> A_{0,i} = \left[\begin{array}{cc} 0& b_i \\ -b_i & 0 \end{array}\right] </math>,
 
<math> B_{i} = \left[\begin{array}{c} 2 \\ 0 \end{array}\right] </math>,
 
<math> C_{i} = \left[\begin{array}{cc} c_i& d_i\end{array}\right] </math>.
 
   
  +
Other interesting plots result for small values of the parameter <math>\varepsilon</math>.
== Numerical values ==
 
  +
For example, for <math>\varepsilon = \frac{1}{100}</math> or <math>\frac{1}{1000}</math>, the peaks in the frequency response become more pronounced, since the poles move closer to the imaginary axis.
   
  +
For <math>\varepsilon \in \left[\frac{1}{50}, \frac{1}{20}, \frac{1}{10}, \frac{1}{5}, \frac{1}{2}, 1\right]</math>, we also plotted the decay of the Hankel singular values in Fig.&nbsp;3.
We construct a system of order <math>n = 100</math>. The numerical values for the different variables are
 
  +
Notice that for small values of the parameter, the decay of the Hankel singular values is very slow.
   
  +
==Data and Scripts==
* <math>a_i </math> equally spaced in <math> [-10^3, -10]</math>,
 
   
  +
This benchmark includes one data set. The matrices can be downloaded in the [http://math.nist.gov/MatrixMarket/formats.html MatrixMarket] format:
* <math>b_i </math> equally spaced in <math>[10, 10^3]</math>,
 
  +
* [[Media:Synth_matrices.tar.gz|Synth_matrices.tar.gz]] (1.28 kB)
  +
The matrix name is used as an extension of the matrix file.
   
  +
System data of arbitrary even order <math>N</math> can be generated in MATLAB or Octave by the following script:
* <math> c_i = 1</math>,
 
   
  +
<syntaxhighlight lang="octave">
* <math> d_i = 0</math>,
 
  +
N = 100; % Order of the resulting system.
   
  +
% Set coefficients.
* <math>\varepsilon</math><math> \in [1/50,1]</math>.
 
  +
a = -linspace(1e1, 1e3, N/2).';
  +
b = linspace(1e1, 1e3, N/2).';
  +
c = ones(N/2, 1);
  +
d = zeros(N/2, 1);
   
  +
% Build 2x2 submatrices.
  +
aa(1:2:N-1, 1) = a;
  +
aa(2:2:N, 1) = a;
  +
bb(1:2:N-1, 1) = b;
  +
bb(2:2:N-2, 1) = 0;
   
In MATLAB, the system matrices are easily formed as follows:
+
% Set up system matrices.
  +
Ae = spdiags(aa, 0, N, N);
  +
A0 = spdiags([0; bb], 1, N, N) + spdiags(-bb, -1, N, N);
  +
B = 2 * sparse(mod(1:N, 2)).';
  +
C(1:2:N-1) = c.';
  +
C(2:2:N) = d.';
  +
C = sparse(C);
  +
</syntaxhighlight>
   
  +
or in Python:
<source lang="matlab">
 
n = 100;
 
a = -linspace(1e1,1e3,n/2).'; b = linspace(1e1,1e3,n/2).';
 
c = ones(n/2,1); d = zeros(n/2,1);
 
aa(1:2:n-1,1) = a; aa(2:2:n,1) = a;
 
bb(1:2:n-1,1) = b; bb(2:2:n-2,1) = 0;
 
Ae = spdiags(aa,0,n,n);
 
A0 = spdiags([0;bb],1,n,n) + spdiags(-bb,-1,n,n);
 
B = 2*sparse(mod([1:n],2)).';
 
C(1:2:n-1) = c.'; C(2:2:n) = d.'; C = sparse(C);
 
</source>
 
   
  +
<syntaxhighlight lang="python">
  +
import numpy as np
  +
import scipy.sparse as sps
   
  +
N = 100 # Order of the resulting system.
The above system matrices <math>A_\varepsilon, A_0, B, C</math> are also available in [http://math.nist.gov/MatrixMarket/formats.html MatrixMarket] format [[Media:Synth_matrices.tar.gz|Synth_matrices.tar.gz]].
 
   
  +
# Set coefficients.
== Plots ==
 
  +
a = -np.linspace(1e1, 1e3, N//2)
  +
b = np.linspace(1e1, 1e3, N//2)
  +
c = np.ones(N//2)
  +
d = np.zeros(N//2)
   
  +
# Build 2x2 submatrices.
We plot the frequency response <math>H(s,\varepsilon) = C\big(sI-\varepsilon A_\varepsilon - A_0\big)^{-1}B</math> and poles for parameter values <math>\varepsilon \in [1/50, 1/20, 1/10, 1/5, 1/2, 1] </math>.
 
  +
aa = np.empty(N)
  +
aa[::2] = a
  +
aa[1::2] = a
  +
bb = np.zeros(N)
  +
bb[::2] = b
   
  +
# Set up system matrices.
  +
Ae = sps.diags(aa, format='csc')
  +
A0 = sps.diags([bb, -bb], [1, -1], (N, N), format='csc')
  +
B = np.zeros((N, 1))
  +
B[::2, :] = 2
  +
C = np.empty((1, N))
  +
C[0, ::2] = c
  +
C[0, 1::2] = d
  +
</syntaxhighlight>
   
  +
Beside that, the plots in Fig.&nbsp;1 and Fig.&nbsp;2 can be generated in MATLAB and Octave using the following script:
:[[Image:synth_freq_resp.png|frame|border|left|Frequency response of synthetic parametric system, for parameter values 1/50 (blue), 1/20 (green), 1/10 (red), 1/5 (teal), 1/2 (purple), 1 (yellow).]]
 
[[Image:synth_poles.png|frame|center|border|Poles of synthetic parametric system, for parameter values 1/50 (blue), 1/20 (green), 1/10 (red), 1/5 (teal), 1/2 (purple), 1 (yellow).]]
 
   
  +
<syntaxhighlight lang="octave">
  +
% Get residues of the system.
  +
r(1:2:N-1, 1) = c + 1j * d;
  +
r(2:2:N, 1) = c - 1j * d;
   
  +
ep = [1/50; 1/20; 1/10; 1/5; 1/2; 1]; % Parameter epsilon.
In MATLAB, the plots are generated using the following commands:
 
  +
jw = 1j * linspace(0, 1.2e3, 5000).'; % Frequency grid.
   
  +
% Computations for all given parameter values.
<source lang="matlab">
 
  +
p = zeros(2 * length(a), length(ep));
r(1:2:n-1,1) = c+1j*d; r(2:2:n,1) = c-1j*d;
 
  +
Hjw = zeros(length(ep), 5000);
ep = [1/50; 1/20; 1/10; 1/5; 1/2; 1]; % parameter epsilon
 
  +
for k = 1:length(ep)
jw = 1j*linspace(0,1.2e3,5000).'; % frequency grid
 
  +
p(:, k) = [ep(k) * a + 1j * b; ep(k) * a - 1j * b]; % Poles.
for j = 1:length(ep)
 
  +
[jww, pp] = meshgrid(jw, p(:, k));
p(:,j) = [ep(j)*a+1j*b; ep(j)*a-1j*b]; % poles
 
  +
Hjw(k, :) = (r.') * (1 ./ (jww - pp)); % Frequency response.
[jww,pp] = meshgrid(jw,p(:,j));
 
  +
end
Hjw(j,:) = (r.')*(1./(jww-pp)); % freq. resp.
 
end
 
figure, loglog(imag(jw),abs(Hjw),'LineWidth',2)
 
axis tight, xlim([6 1200])
 
xlabel('frequency (rad/sec)')
 
ylabel('magnitude')
 
title('Frequency response for different \epsilon')
 
figure, plot(real(p),imag(p),'.')
 
title('Poles for different \epsilon')
 
</source>
 
   
  +
% Plot poles.
  +
figure;
  +
plot(real(p), imag(p), '.', 'MarkerSize', 12);
  +
xlabel('Re(p)');
  +
ylabel('Im(p)');
  +
legend( ...
  +
'\epsilon = 1/50', ...
  +
'\epsilon = 1/20', ...
  +
'\epsilon = 1/10', ...
  +
'\epsilon = 1/5', ...
  +
'\epsilon = 1/2', ...
  +
'\epsilon = 1');
   
  +
% Plot frequency response.
Other interesting plots result for small values of the parameter. For example, for <math>\varepsilon = 1/100, 1/1000 </math>, the peaks in the frequency response become more pronounced, since the poles move closer to the imaginary axis.
 
  +
figure;
  +
loglog(imag(jw), abs(Hjw), 'LineWidth', 2);
  +
axis tight;
  +
xlim([6 1200]);
  +
xlabel('frequency (rad/sec)');
  +
ylabel('magnitude');
  +
legend( ...
  +
'\epsilon = 1/50', ...
  +
'\epsilon = 1/20', ...
  +
'\epsilon = 1/10', ...
  +
'\epsilon = 1/5', ...
  +
'\epsilon = 1/2', ...
  +
'\epsilon = 1');
  +
</syntaxhighlight>
   
  +
or in Python:
   
  +
<syntaxhighlight lang="python">
Next, for <math>\varepsilon \in [1/50, 1/20, 1/10, 1/5, 1/2, 1] </math>, we also plot the decay of the Hankel singular values. Notice that for small values of the parameter, the decay of the Hankel singular values is very slow.
 
  +
import matplotlib.pyplot as plt
   
  +
# Get residues of the system.
[[Image:synth_hsv.png|frame|border|center|Hankel singular values of synthetic parametric system, for parameter values 1/50 (blue), 1/20 (green), 1/10 (red), 1/5 (teal), 1/2 (purple), 1 (yellow).]]
 
  +
r = np.empty(N, dtype=complex)
  +
r[::2] = c + 1j * d
  +
r[1::2] = c - 1j * d
   
  +
ep = [1/50, 1/20, 1/10, 1/5, 1/2, 1] # Parameter epsilon.
  +
jw = 1j * np.geomspace(6, 1.2e3, 5000) # Frequency grid.
   
  +
# Computations for all given parameter values.
  +
p = np.zeros((len(ep), N), dtype=complex)
  +
Hjw = np.zeros((len(ep), len(jw)), dtype=complex)
  +
for k, epk in enumerate(ep):
  +
# Poles.
  +
p[k, :N//2] = epk * a + 1j * b
  +
p[k, N//2:] = epk * a - 1j * b
  +
# Frequency response.
  +
Hjw[k, :] = (r / (jw[:, np.newaxis] - p[k])).sum(axis=1)
   
  +
# Plot poles.
Contact information:
 
  +
fig, ax = plt.subplots()
  +
for k, epk in enumerate(ep):
  +
ax.plot(p[k].real, p[k].imag, '.', label=fr'$\varepsilon$ = {epk}')
  +
ax.autoscale(tight=True)
  +
ax.set_xlabel('Re(p)')
  +
ax.set_ylabel('Im(p)')
  +
ax.legend()
   
  +
# Plot frequency response.
'' [[User:Ionita]] 14:38, 29 November 2011 (UTC) ''
 
  +
fig, ax = plt.subplots()
  +
for k, epk in enumerate(ep):
  +
ax.loglog(jw.imag, np.abs(Hjw[k]), label=fr'$\varepsilon$ = {epk}', linewidth=2)
  +
ax.autoscale(tight=True)
  +
ax.set_xlabel('frequency (rad/sec)')
  +
ax.set_ylabel('magnitude')
  +
ax.legend()
  +
</syntaxhighlight>
  +
  +
==Dimensions==
  +
  +
System structure:
  +
:<math>
  +
\begin{align}
  +
\dot{x}(t) &= (\varepsilon A_{\varepsilon} + A_{0})x(t) + Bu(t), \\
  +
y(t) &= Cx(t)
  +
\end{align}
  +
</math>
  +
  +
  +
System dimensions:
  +
  +
<math>A_{\varepsilon} \in \mathbb{R}^{N \times N}</math>,
  +
<math>A_{0} \in \mathbb{R}^{N \times N}</math>,
  +
<math>B \in \mathbb{R}^{N \times 1}</math>,
  +
<math>C \in \mathbb{R}^{1 \times N}</math>
  +
  +
  +
System variants:
  +
  +
<tt>Synth_matrices</tt>: <math>N = 100</math>,
  +
arbitrary even order <math>N</math> by using the [[#scr1|script]]
  +
  +
==Citation==
  +
  +
To cite this benchmark and its data:
  +
::The MORwiki Community, '''Synthetic parametric model'''. hosted at MORwiki - Model Order Reduction Wiki, 2005. https://modelreduction.org/morwiki/Synthetic_parametric_model
  +
  +
@MISC{morwiki_synth_pmodel,
  +
author = <nowiki>{{The MORwiki Community}}</nowiki>,
  +
title = {Synthetic parametric model},
  +
howpublished = {hosted at {MORwiki} -- Model Order Reduction Wiki},
  +
url = <nowiki>{https://modelreduction.org/morwiki/Synthetic_parametric_model}</nowiki>,
  +
year = 2005
  +
}
  +
  +
==Contact==
  +
  +
''[[User:Ionita]]''

Latest revision as of 07:40, 17 June 2025


Description

Figure 1: System poles for different parameter values.

On this page you will find a synthetic parametric model with one parameter for which one can easily experiment with different system orders, values of the parameter, as well as different poles and residues (see Fig. 1). Also, the decay of the Hankel singular values can be changed indirectly through the parameter.

Model

We consider a dynamical system in the frequency domain given by its pole-residue form of the transfer function


 \begin{align}
   H(s,\varepsilon) & = \sum_{k=1}^{N}\frac{r_{k}}{s-p_{k}}\\
   & = \sum_{k=1}^{N}\frac{r_{k}}{s-(\varepsilon a_{k} + jb_{k})},
 \end{align}

with p_{k} = \varepsilon a_{k} + jb_{k} the poles of the system, j the imaginary unit, and r_{k} the residues. The parameter \varepsilon is used to scale the real part of the system poles. We can write down the state-space realization of the system's transfer function as


 \begin{align}
   H(s,\varepsilon) = \widehat{C}(sI_{N} - (\varepsilon \widehat{A}_{\varepsilon} + \widehat{A}_{0}))^{-1}\widehat{B},
 \end{align}

with the corresponding system matrices \widehat{A}_{\varepsilon} \in \mathbb{R}^{N \times N}, \widehat{A}_{0} \in \mathbb{C}^{N \times N}, \widehat{B} \in \mathbb{R}^{N}, and \widehat{C}^{T} \in \mathbb{C}^{N} given by


 \begin{align}
   \varepsilon\widehat{A}_{\varepsilon} + \widehat{A}_{0}
     & = \varepsilon \begin{bmatrix} a_{1} & & \\ & \ddots & \\ & & a_{N} \end{bmatrix}
     + \begin{bmatrix} jb_{1} & & \\ & \ddots & \\ & & jb_{N} \end{bmatrix},\\
   \widehat{B} & = \begin{bmatrix}1, & \ldots, & 1 \end{bmatrix}^{T},\\
   \widehat{C} & = \begin{bmatrix}r_{1}, & \ldots, & r_{n} \end{bmatrix}.
 \end{align}

One notices that the system matrices \widehat{A}_{0} and \widehat{C} have complex entries. For rewriting the system with real matrices, we assume that N is even, N=2m, and that all system poles are complex and ordered in complex conjugate pairs, i.e.,


 \begin{align}
   p_{1} & = \varepsilon a_{1} + jb_{1},\\
   p_{2} & = \varepsilon a_{1} - jb_{1},\\
   & \ldots\\
   p_{N-1} & = \varepsilon a_{m} + jb_{m},\\
   p_{N} & = \varepsilon a_{m} - jb_{m}.
 \end{align}

Corresponding to the system poles, also the residues are written in complex conjugate pairs


\begin{align}
  r_{1} & = c_{1} + jd_{1},\\
  r_{2} & = c_{1} - jd_{1},\\
  & \ldots\\
  r_{N-1} & = c_{m} + jd_{m},\\
  r_N & = c_{m} - jd_{m}.
\end{align}

Using this, the realization of the dynamical system can be written with matrices having real entries by


\begin{align}
  A_{\varepsilon} & = \begin{bmatrix} A_{\varepsilon, 1} & & \\ & \ddots & \\ & & A_{\varepsilon, m} \end{bmatrix}, &
  A_{0} & = \begin{bmatrix} A_{0, 1} & & \\ & \ddots & \\ & & A_{0, m} \end{bmatrix}, &
  B & = \begin{bmatrix} B_{1} \\ \vdots \\ B_{m} \end{bmatrix}, &
  C & = \begin{bmatrix} C_{1}, & \cdots, & C_{m} \end{bmatrix},
\end{align}

with A_{\varepsilon, k} = \begin{bmatrix} a_{k} & 0  \\ 0 & a_{k} \end{bmatrix}, A_{0, k} = \begin{bmatrix} 0 & b_{k} \\ -b_{k} & 0 \end{bmatrix}, B_{k} = \begin{bmatrix} 2 \\ 0 \end{bmatrix}, C_{k} = \begin{bmatrix} c_{k}, & d_{k} \end{bmatrix}.

Figure 2: Frequency response of synthetic parametric system for different parameter values.

Numerical Values

Figure 3: Hankel singular values of synthetic parametric system for different parameter values.

We construct a system of order N = 100. The numerical values for the different variables are

  • a_{k} equally spaced in the interval [-10^3, -10],
  • b_{k} equally spaced in the interval [10, 10^3],
  • c_{k} = 1,
  • d_{k} = 0,
  • \varepsilon \in \left[\frac{1}{50}, 1\right].


The frequency response of the transfer function H(s,\varepsilon) = C(sI_{N}-(\varepsilon A_{\varepsilon} + A_{0}))^{-1}B is plotted for parameter values \varepsilon \in \left[\frac{1}{50}, \frac{1}{20}, \frac{1}{10}, \frac{1}{5}, \frac{1}{2}, 1\right] in Fig. 2.

Other interesting plots result for small values of the parameter \varepsilon. For example, for \varepsilon = \frac{1}{100} or \frac{1}{1000}, the peaks in the frequency response become more pronounced, since the poles move closer to the imaginary axis.

For \varepsilon \in \left[\frac{1}{50}, \frac{1}{20}, \frac{1}{10}, \frac{1}{5}, \frac{1}{2}, 1\right], we also plotted the decay of the Hankel singular values in Fig. 3. Notice that for small values of the parameter, the decay of the Hankel singular values is very slow.

Data and Scripts

This benchmark includes one data set. The matrices can be downloaded in the MatrixMarket format:

The matrix name is used as an extension of the matrix file.

System data of arbitrary even order N can be generated in MATLAB or Octave by the following script:

N = 100; % Order of the resulting system.

% Set coefficients.
a = -linspace(1e1, 1e3, N/2).';
b =  linspace(1e1, 1e3, N/2).';
c = ones(N/2, 1);
d = zeros(N/2, 1);

% Build 2x2 submatrices.
aa(1:2:N-1, 1) = a;
aa(2:2:N, 1)   = a;
bb(1:2:N-1, 1) = b;
bb(2:2:N-2, 1) = 0;

% Set up system matrices.
Ae = spdiags(aa, 0, N, N);
A0 = spdiags([0; bb], 1, N, N) + spdiags(-bb, -1, N, N);
B  = 2 * sparse(mod(1:N, 2)).';
C(1:2:N-1) = c.';
C(2:2:N)   = d.';
C          = sparse(C);

or in Python:

import numpy as np
import scipy.sparse as sps

N = 100  # Order of the resulting system.

# Set coefficients.
a = -np.linspace(1e1, 1e3, N//2)
b = np.linspace(1e1, 1e3, N//2)
c = np.ones(N//2)
d = np.zeros(N//2)

# Build 2x2 submatrices.
aa = np.empty(N)
aa[::2] = a
aa[1::2] = a
bb = np.zeros(N)
bb[::2] = b

# Set up system matrices.
Ae = sps.diags(aa, format='csc')
A0 = sps.diags([bb, -bb], [1, -1], (N, N), format='csc')
B = np.zeros((N, 1))
B[::2, :] = 2
C = np.empty((1, N))
C[0, ::2] = c
C[0, 1::2] = d

Beside that, the plots in Fig. 1 and Fig. 2 can be generated in MATLAB and Octave using the following script:

% Get residues of the system.
r(1:2:N-1, 1) = c + 1j * d;
r(2:2:N, 1)   = c - 1j * d;

ep = [1/50; 1/20; 1/10; 1/5; 1/2; 1]; % Parameter epsilon.
jw = 1j * linspace(0, 1.2e3, 5000).'; % Frequency grid.

% Computations for all given parameter values.
p   = zeros(2 * length(a), length(ep));
Hjw = zeros(length(ep), 5000);
for k = 1:length(ep)
    p(:, k)   = [ep(k) * a + 1j * b; ep(k) * a - 1j * b]; % Poles.
    [jww, pp] = meshgrid(jw, p(:, k));
    Hjw(k, :) = (r.') * (1 ./ (jww - pp)); % Frequency response.
end

% Plot poles.
figure;
plot(real(p), imag(p), '.', 'MarkerSize', 12);
xlabel('Re(p)');
ylabel('Im(p)');
legend( ...
    '\epsilon = 1/50', ...
    '\epsilon = 1/20', ...
    '\epsilon = 1/10', ...
    '\epsilon = 1/5', ...
    '\epsilon = 1/2', ...
    '\epsilon = 1');

% Plot frequency response.
figure;
loglog(imag(jw), abs(Hjw), 'LineWidth', 2);
axis tight;
xlim([6 1200]);
xlabel('frequency (rad/sec)');
ylabel('magnitude');
legend( ...
    '\epsilon = 1/50', ...
    '\epsilon = 1/20', ...
    '\epsilon = 1/10', ...
    '\epsilon = 1/5', ...
    '\epsilon = 1/2', ...
    '\epsilon = 1');

or in Python:

import matplotlib.pyplot as plt

# Get residues of the system.
r = np.empty(N, dtype=complex)
r[::2] = c + 1j * d
r[1::2] = c - 1j * d

ep = [1/50, 1/20, 1/10, 1/5, 1/2, 1]  # Parameter epsilon.
jw = 1j * np.geomspace(6, 1.2e3, 5000)  # Frequency grid.

# Computations for all given parameter values.
p = np.zeros((len(ep), N), dtype=complex)
Hjw = np.zeros((len(ep), len(jw)), dtype=complex)
for k, epk in enumerate(ep):
    # Poles.
    p[k, :N//2] = epk * a + 1j * b
    p[k, N//2:] = epk * a - 1j * b
    # Frequency response.
    Hjw[k, :] = (r / (jw[:, np.newaxis] - p[k])).sum(axis=1)

# Plot poles.
fig, ax = plt.subplots()
for k, epk in enumerate(ep):
    ax.plot(p[k].real, p[k].imag, '.', label=fr'$\varepsilon$ = {epk}')
ax.autoscale(tight=True)
ax.set_xlabel('Re(p)')
ax.set_ylabel('Im(p)')
ax.legend()

# Plot frequency response.
fig, ax = plt.subplots()
for k, epk in enumerate(ep):
    ax.loglog(jw.imag, np.abs(Hjw[k]), label=fr'$\varepsilon$ = {epk}', linewidth=2)
ax.autoscale(tight=True)
ax.set_xlabel('frequency (rad/sec)')
ax.set_ylabel('magnitude')
ax.legend()

Dimensions

System structure:


\begin{align}
\dot{x}(t) &= (\varepsilon A_{\varepsilon} + A_{0})x(t) + Bu(t), \\
y(t) &= Cx(t)
\end{align}


System dimensions:

A_{\varepsilon} \in \mathbb{R}^{N \times N}, A_{0} \in \mathbb{R}^{N \times N}, B \in \mathbb{R}^{N \times 1}, C \in \mathbb{R}^{1 \times N}


System variants:

Synth_matrices: N = 100, arbitrary even order N by using the script

Citation

To cite this benchmark and its data:

The MORwiki Community, Synthetic parametric model. hosted at MORwiki - Model Order Reduction Wiki, 2005. https://modelreduction.org/morwiki/Synthetic_parametric_model
@MISC{morwiki_synth_pmodel,
  author =       {{The MORwiki Community}},
  title =        {Synthetic parametric model},
  howpublished = {hosted at {MORwiki} -- Model Order Reduction Wiki},
  url =          {https://modelreduction.org/morwiki/Synthetic_parametric_model},
  year =         2005
}

Contact

Antonio Cosmin Ionita