Source code for pymordemos.parametric_delay

#!/usr/bin/env python
# This file is part of the pyMOR project (http://www.pymor.org).
# Copyright 2013-2020 pyMOR developers and contributors. All rights reserved.
# License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)


import matplotlib.pyplot as plt
import numpy as np
from typer import Argument, run

from pymor.models.iosys import TransferFunction
from pymor.reductors.h2 import TFIRKAReductor


[docs]def main(r: int = Argument(10, help='Order of the TF-IRKA ROM.')): """Parametric delay demo.""" # Model def H(s, mu): tau = mu['tau'][0] return np.array([[np.exp(-s) / (tau * s + 1)]]) def dH(s, mu): tau = mu['tau'][0] return np.array([[-(tau * s + tau + 1) * np.exp(-s) / (tau * s + 1) ** 2]]) fom = TransferFunction(1, 1, H, dH, parameters={'tau': 1}) # Magnitude plot mu_list = [0.01, 0.1, 1] w = np.logspace(-2, 4, 100) fig, ax = plt.subplots() for mu in mu_list: fom.mag_plot(w, ax=ax, mu=mu, label=fr'$\tau = {mu}$') ax.legend() plt.show() # TF-IRKA roms_tf_irka = [] for mu in mu_list: tf_irka = TFIRKAReductor(fom, mu=mu) rom = tf_irka.reduce(r, conv_crit='h2', maxit=1000, num_prev=5) roms_tf_irka.append(rom) fig, ax = plt.subplots() for mu, rom in zip(mu_list, roms_tf_irka): poles = rom.poles() ax.plot(poles.real, poles.imag, '.', label=fr'$\tau = {mu}$') ax.set_title("Poles of TF-IRKA's ROMs") ax.legend() plt.show() fig, ax = plt.subplots() for mu, rom in zip(mu_list, roms_tf_irka): rom.mag_plot(w, ax=ax, label=fr'$\tau = {mu}$') ax.set_title("Magnitude plot of TF-IRKA's ROMs") ax.legend() plt.show() fig, ax = plt.subplots() for mu, rom in zip(mu_list, roms_tf_irka): (fom - rom).mag_plot(w, ax=ax, mu=mu, label=fr'$\tau = {mu}$') ax.set_title("Magnitude plot of error systems") ax.legend() plt.show()
if __name__ == "__main__": run(main)