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],
    h:l[2],
    x:l[3],
    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)$

Lie-Klammer

LieBracket([l]):=block([f,g,x,k,Df,Dg,ad],
    if (length(l)<3) or (length(l)>4) then 
       error ("Aufruf mit 3 oder 4 Argumenten."),
    f:l[1],
    g:l[2],
    x:l[3],
    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(g)
    else 
        Df:jacobian(f,x),
        Dg:jacobian(g,x),
        ad:list_matrix_entries(Dg.f-Df.g),
        return(LieBracket(f,ad,x,k-1))
)$

Beispiel: Rössler-System

f:[-x2-x3,x1+a*x2,c+x3*(x1-b)];
h:log(x3);
x:[x1,x2,x3]$
n:length(x)$

Beobachtbarkeitsmatrix

Q:ratsimp(ObservabilityMatrix(f,h,x));

Startvektorfeld

v:col(invert(Q),n)$
v:list_matrix_entries(v);

Beobachterverstärkung k1

cp:a0+a1*s+a2*s^2+s^3$
k1:sum(coeff(cp,s,i)*LieBracket(-f,v,x,i),i,0,n)$
transpose(ratsimp(k1));