2011-12-24 13 views
5

A recent post on the Wolfram Blog oferuje następującą funkcję formatowania pochodnych w bardziej tradycyjny sposób.Zapobieganie zmianie kolejności w wyjściach pochodnych?

pdConv[f_] := 
TraditionalForm[ 
    f /. Derivative[inds__][g_][vars__] :> 
    Apply[Defer[D[g[vars], ##]] &, 
    Transpose[{{vars}, {inds}}] /. {{var_, 0} :> 
     Sequence[], {var_, 1} :> {var}}] 
] 

Przykładem wykorzystania, Dt[d[x, a]] // pdConv daje:

enter image description here

bez zerwania ogólne możliwości pdConv, może ktoś go zmieniać, aby utrzymać daną kolejność zmiennych, produkujących wyjście pokazany poniżej? (Oczywiście jest to wyłącznie ze względów asthetic, dzięki pozyskiwaniu łatwiejsze dla człowieka do naśladowania)

enter image description here

I podejrzewam, że będzie nietrywialna wdrożyć --- chyba że ktoś wie o magicznym Global opcji, które mogą być tymczasowo zastąpione przez Block.

Na co warto, te tak pytania mogą być związane:

+0

Interesujące pytanie. Mógłbyś być bardziej konkretny, gdy powiesz * podaną kolejność [z] zmiennych *? –

+1

@ Mr.Wizard - Aby wyjaśnić, czy f [b, a] jest funkcją podawaną Dt, to chciałbym, aby całkowite zróżnicowanie było wyprowadzane jako Dt [b] * D [f, b] + Dt [a] * D [f, a], zamiast sortowania danych wyjściowych do Dt [a] * D [f, a] + Dt [b] * D [f, b]. (wydaje się, że to zrozumieliście poniżej ... nie chcecie zostawić, że pytacie wisi.) – telefunkenvf14

Odpowiedz

4

Prawdopodobnie jest czystszy sposób zrobić s, ale jeśli jest to wyłącznie do celów prezentacyjnych możesz zrobić coś takiego, jak

W tym miejscu dodatkowy parametr vv jest listą zmiennych w f w kolejności, w której mają się pojawić pochodne częściowe. Aby korzystać z tej funkcji, by zrobić coś podobnego

pdConv[Dt[d[x, c]], {x, c}] 

equations in right order

Zasadniczo co to rozwiązanie nie jest tymczasowo zastąpić listę zmiennych vv z listą zmiennych binarnych, które są we właściwym porządku leksykograficznym, zastosuj transformację, a następnie zastąp zmienne obojętne oryginalnymi zmiennymi, zachowując pożądaną kolejność, zawijając przekształcone wyrażenie w HoldForm.

+0

Pokonaliście mnie! I pewnie też działa lepiej. –

+0

@ Mr.Wizard Domyślam się, że jest pierwszy na wszystko ;-) – Heike

+0

Czy mogę pożyczyć twój pomysł na zastąpienie i wprowadzić go w moim własnym stylu, czy wolałbyś, żebym nie? –

1

Zmieniona po zobaczeniu daleko lepszej metody Heike'a. Mam nadzieję, że go nie zepsuje.

ClearAll[pdConv] 

pdConv[order_List][f_] := 
    With[{R = Thread[order -> [email protected]]}, 
    [email protected]@# /. Reverse[R, 2] &[ 
    f /. R /. Derivative[inds__][g_][vars__] :> 
     ([email protected][g[vars], ##] & @@ Pick[{vars}, {inds}, 1])] 
    ] 

Zastosowanie:

Dt[d[x, a]] // pdConv[{x, a}] 

Dt[d[x, a, c, b]] // pdConv[{x, a, c, b}] 

Automatyczne zamawianie wąskim przypadku:

ClearAll[pdConvAuto] 
SetAttributes[pdConvAuto, HoldFirst] 

pdConvAuto[f : [email protected][email protected]__] := 
    With[{R = Thread[{syms} -> [email protected]{syms}]}, 
    [email protected]@# /. Reverse[R, 2] &[ 
    f /. R /. Derivative[inds__][g_][vars__] :> 
     ([email protected][g[vars], ##] & @@ Pick[{vars}, {inds}, 1])] 
    ] 

Zastosowanie:

Dt[d[x, a, c, b]] // pdConvAuto 
+0

Jesteś szybki! Będę się z tym bawić i odpowiem. Można również sprawdzić niektóre inne przykłady z posta na blogu Wolfram (aby potwierdzić, że nadal działają). – telefunkenvf14

0

Zrozumiałem, że Dt[d[x, a, c, b]] daje już uporządkowane wyjście, tylko w odwrotnej kolejności.Prawdopodobnie nie rozumiem tej sytuacji, ale w niektórych przypadkach wydaje się to wystarczające:

ClearAll[pdConv] 

pdConv[f_] := 
Apply[Plus, [email protected]@#, {2}] &[ 
    Reverse[List @@ f] /. Derivative[inds__][g_][vars__] :> 
    ([email protected][g[vars], ##] & @@ Pick[{vars}, {inds}, 1]) 
    ] 

Dt[d[x, a, r, c, b]] // pdConv 
Powiązane problemy