Name

h8invsyslin — Stable inverse with (approximately) infimal H-infinity norm.

Calling Sequence

SYSG = h8invsyslin(SYSH [,opts])

Parameters

SYSH

Discrete- or continuous-time state-space realization of H(λ) (a syslin list). The matrix SYSH.D has to be of full rank. The initial state SYSH.x0 may be non-zero.

SYSG

Discrete- or continuous-time state-space realization of G(λ) (a syslin list).

opts

A scilab struct which may contain additional options. Optional parameter, default value is struct().

opts.tol

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

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

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.

Description

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.

Examples

// 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));