Små exempel med BasicGeo-paketet

Erik Frisk

SetDirectory["/home/fs/frisk/Diagnos/Nonlinegeo/Work"];
Needs["BasicGeo`"];
?BasicGeo`*

Enkla grundexempel för användning av funktionerna

Definierar vilka variabler som används samt några funktioner, vektorfält samt kovektorfält att testa funktonerna på. Notera att radvektorer och kolumnvektorer representeras på samma sätt, med en enkel lista av elementen.

vars = {x1, x2, x3};

    λ = x1 x2 Sin[x3];   

    f = {x1,  x1 x2,  2};   

    g = {2,  3,  x3};    

    w = {x1, x2 - 1/(x1 + 1), x1 x2};

Beräkna differentialen/gradienten av funktionen λ

Diff[λ, vars]

Beräkna Lie-derivatan av funktionen λ längs vektorfältet f

LieDerivative[λ,  f,  vars]

Beräkna Lie-derivatan av kovektorfältet w längs vektorfältet f. Notera att funktionen heter exakt lika som för Lie-derivatan ovan.  Jag har gjort så att Mathematica själv känner av vilken sorts derivata som ska beräknas.  Se implementationen för detaljer.

LieDerivative[w, f, vars]

Beräkna Lie-klammer/produkt mellan vektorfälten foch g.

LieProduct[f, g, vars]

En liten mer avancerad operation: verifiera att formel (1.11) sid 10 i boken stämmer i det här fallet.

Simplify[
      LieDerivative[Diff[λ, vars], f, vars] - 
        Diff[LieDerivative[λ, f, vars], vars]]

Jakobianen av ett vektorfält beräknas genom

JacobianMatrix[f, vars] // MatrixForm

Koordinatbyte

Illustrerar med exemplet från första föreläsningen

vars = {x1, x2};
f = {(((x2/x1))^2), (((x2/x1))^3) - 
            x2};
g = {x1, x2};
h = x1 x2;

Definierar transformationen som en omskrivningsregel

Φ = {z1 -> x1, z2 -> x2/x1};

Utför transformationen

newsys = 
        ChangeCoordinates[f, g, h, Φ, 
          vars];
\(\(f\&~ = newsys[\([1]\)];\)\)
\(\(g\&~ = newsys[\([2]\)];\)\)
\(\(h\&~ = newsys[\([3]\)];\)\)

Visa resultatet

\(f\&~ // MatrixForm\)
\(g\&~ // MatrixForm\)
\(h\&~\)

Funktioner relaterade till Frobenius

Jag har implementerat ett antal funktioner för att automatiskt hitta lösningarna till de PDE:er som studerats. Metoden är exakt den som beskrivs i Isidori.

Obs! Funktionerna är att betrakta som väldigt experimentella. Ingen fel eller rimlighetskoll görs utan funktionerna kör bara på och hoppas på det bästa.

Använder Exempel 1.4.3 sid 30 i Isidori för att illustrera hur funktionerna används.

vars = {x1, x2, x3};
f1 = {2 x3, -1, 0};
f2 = {-x1, -2 x2, x3};

"Fyller ut" enligt exemplet och beräknar en determinant som hjälper oss att välja arbetspunkt.

f3 = {1, 0, 0};
Det[{f1, f2, f3}]

Funktionen FrobSolve[F,x0,vars,d] hittar (förhoppningsvis) n-d stycken λ(x) så att span {d(Subscript[λ, 1]),  ... , 
            d(Subscript[λ, n - d])} = (Δ^ ⊥) .

x0 = {x1 -> 0, 
          x2 -> 0, x3 -> 1}; 

    λ = 
        FrobSolve[{f1, f2, f3}, vars /. x0, vars, 2];

Simplify[λ[[1]]]

Verifiera att det verkligen är en lösning

Simplify[{Diff[λ[[1]], vars]} . Transpose[{f1, f2}]] // 
      MatrixForm

En hjälpfunktion som kan vara användbar är Flow[f,t,x0,vars], som räknar ut flödet för vektorfältet f, med oberoende variabel t och startar i x0

Flow[f1, t, {x10, x20, x30}, vars]

Ytterligare en funktion är FrobeniusInverse[F,x0,origvars,newvars] som räknar ut flödena och följer dem för att beräkna inversen

FrobeniusInverse[{f1, f2, f3}, vars /. x0, 
      vars, {z1, z2, z3}]