Lie-Ableitung eines Skalarfeldes

LieScalar([l]):=block([f,h,x,k,Lfh],
    if (length(l)<3) or (length(l)>4) then 
       error ("Aufruf mit 3 oder 4 Argumenten."),
    f:l[1], /* Vektorfeld */
    h:l[2], /* Skalarfeld */
    x:l[3], /* Variable   */
    if length(l)=3 then k:1 else k:l[4],
    if not(nonnegintegerp(k)) then 
       error ("Ordnung k muss natürliche Zahl sein."),
    if k=0 then return(h)
    else 
        Lfh:jacobian([h],x).f,
        return(LieScalar(f,Lfh,x,k-1))
)$

Beobachtbarkeitsabbildung

ObservabilityMap(f,h,x):=block([i,n],
    n:length(x),
    makelist(LieScalar(f,h,x,i),i,0,n-1)
    )$

Beobachtbarkeitsmatrix

ObservabilityMatrix(f,h,x):=jacobian(ObservabilityMap(f,h,x),x)$

Beispiel: Eulersche Kreiselgleichungen

f:[λ1*x2*x3,λ2*x1*x3,λ3*x1*x2]$
x:[x1,x2,x3]$

Beobachtbarkeitsmatrix und deren Determinante

Q:factor(ObservabilityMatrix(f,x1,x));
d:factor(determinant(Q));

Beobachterverstärkung

invert(Q).[a2,a1,a0]$
k:ratsimp(%);