Stable inverse with (approximately) infimal H-infinity norm.
SYSG = h8invsyslin(SYSH [,opts])
Discrete- or continuous-time state-space realization of H(λ) (a list). The matrix SYSH.D has to be of full rank. The initial state SYSH.x0 may be non-zero.
Discrete- or continuous-time state-space realization of G(λ) (a list).
A scilab which may contain additional options. Optional parameter, default value is struct().
opts.tol>0 (a float) is an upper bound on how much larger than optimal the norm of the inverse is allowed to be. Determines the duration of the γ-iteration. Warning: too low tolerances will be neutralized by numerical inaccuracies. Optional parameter, default value is 1e-2.
opts.test_tol≥0 (a float) controls the tolerance of th numerical tests in the γ-iteration. Optional parameter, default value is 1e-8.
opts.verbose (a boolean) determines whether online information on the progress of the γ-iteration, which approximates the optimal achivable norm via bisection, should be displayed. Optional parameter, default value is %t.
This routine computes a stable state-space system SYSG such that its
transfer function G(λ) satisfies
G(λ)H(λ)=I
and ||G||≈min
,
where λ=z for discrete-time systems and λ=s for
continuous-time systems.
Assumptions: H(λ) should have full normal rank. The finite zeros of SYSH, i.e., the complex λ where the rank of the matrix pencil [SYSH.A-λ*eye() SYSH.B;SYSH.C SYSH.D] drops below its normal rank, must either be located inside the unit circle |z|<1 (discrete-time) or in the open left half-plane Re(s)<0 (continuous-time). There should be no zero at infinity, i.e., the matrix SYSH.D should be of full rank.
Note that if H(λ) is wide and not tall, optimal right-inverses
are computed instead of left-inverses, i.e.,
H(λ)*G(λ)=I
.
// Example 1: Infimal norm left inverse of the // transfer function [1/z;1-1/z] z = poly(0,"z"); // define symbolic "z" variable H = [1/z ; 1-1/z]; // define transfer function SYSH = tf2ss(H); // convert to state-space SYSH.dt = "d"; // mark as discrete-time SYSG = h8invsyslin(SYSH); // compute left inverse G = ss2tf(SYSG); // convert into rational matrix disp("Left Inverse G of H"); disp(clean(G)); // show results disp("G*H:"); disp(clean(G*H)); | ![]() | ![]() |