Temat: Zmiana zmiennych w wyrażeniu zawierającym pochodne cząstkowe
Podniże znajduje się zbiór funkcji pozwalający na zamianę zmiennych w prostych (niefunkcyjnych) wyrażeniach zawierających pochodne cząstkowe dowolnego rzędu i w dowolnym wymiarze. Jest to wersja pozbawiona kontroli błędów, więc proszę używać na własne ryzyko. Funkcja nie wymaga podawania funkcji odwrotnej do funkcji definiującej zamianę zmiennych. Sposób użycia to np:
spherical = {# Cos[#3] Sin[#2] &, # Sin[#3] Sin[#2] &, # Cos[#2] &};
rules=ChangeVariable[f, {x, y, z}, spherical, {r, th, ph}, g];
f[x, y, z] + D[f[x, y, z], x, x] + D[f[x, y, z], y, y] +
D[f[x, y, z], z, z] /.rules // Simplify
"f" to nagłówek funkcji zastępowanej, {x,y,z} to nazwy dotychczasowych zmiennych, w miejscu "spherical" należy wstawić listę funkcji definiujących stare współrzędne ({x(r,th,ph),y(r,th,ph),...}), dalej nazwy nowych współrzędnych (np. {r,th,phi}) a na końcu nagłówek funkcji nowych zmiennych (może to być właściwie dowolny niezdefiniowany symbol).
Clear[Grad, Jac, InvJacGrad, ChangeVariable];
Grad[f_, args_] := Module[{IdM},
IdM = IdentityMatrix[Length[args]];
Evaluate[Derivative[Sequence @@ #][f]] @@ args & /@ IdM
]
Jac[yOf_, args_] := Module[{IdM},
IdM = IdentityMatrix[Length[args]];
Transpose[
Outer[Derivative[Sequence @@ #][#2] @@ args &, IdM, yOf, 1]]
]
InvJacGrad[f_, x_, args_, l_] := Module[{ytemp},
If[Length[l] == 0, f,
ytemp = Unique[args];
Function[
Evaluate[ytemp],
Evaluate[(
Transpose[Inverse[Jac[x, ytemp]]].Grad[
InvJacGrad[f, x, ytemp, Rest[l]],
ytemp](*Inverse Jacobian used!*)
)[[First[l]]]
]]
]
]
ChangeVariable[f_, args_, xOf_, newArgs_, g_] := Module[{},
{
Derivative[l__][f] @@ args :> Module[{k = List[l]},
InvJacGrad[g, xOf, newArgs,
Flatten[ConstantArray[#, k[[#]]] &
/@ Range[Length[k]]]] @@ newArgs
],
f @@ args -> g @@ newArgs,
Sequence @@ Thread[args -> Through[xOf @@ newArgs]]
}
]
Ostatnio edytowany przez pawel.biernat (2009-10-14 09:20:28)