Sei $\mathcal{M}\subseteq\mathbb{R}^n$ offen. Zu der von den Vektorfeldern $f_1,\ldots,f_r:\mathcal{M}\to\mathbb{R}^n$ aufgespannten Distribution

\[\Delta=\operatorname{span} \lbrace f_1,\ldots,f_r \rbrace\]

wird der involutive Abschluss $\operatorname{inv}(\Delta)$ berechnet.

Berechnung mit Maxima

Die die Distribution aufspannenden Vektorfelder sind als Liste zu übergeben,

InvolutiveClosure(L,x):=block([flag,F,G,i,j,r,n],
    F:apply('matrix,L),
    F:transpose(F),
    flag:true,
    while flag do (
        flag:false,
        [n,r]:matrix_size(F),
        for i:1 thru r do 
            for j:i+1 thru r do block([f1,f2],
                f1:list_matrix_entries(col(F,i)),
                f2:list_matrix_entries(col(F,j)),
                G:addcol(F,LieBracket(f1,f2,x)),
                if rank(F)<rank(G) then (
                    F:copy(G),
                    flag:true
                )       
        )
    ),
    makelist(makelist(F[i,j],i,1,n),j,1,r)
)$

Aufruf:

InvolutiveClosure([f1,...,fr],x)

Klaus Röbenack: Nichtlineare Regelungssysteme - Theorie und Anwendung der exakten Linearisierung.
Springer Vieweg, 2017, S. 94, Algorithmus 3.5.