2011-12-24 14 views
5

A recent post on the Wolfram Blog è stata offerta la seguente funzione per formattare le derivate in modo più tradizionale.Previene il riordino nell'output derivativo?

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

Un esempio di utilizzo, Dt[d[x, a]] // pdConv dà:

enter image description here

Senza rompere le capacità generali di pdConv, qualcuno può modificarlo per mantenere l'ordine dato delle variabili, producendo l'output mostrato di seguito? (Ovviamente questo è puramente per motivi asthetic, rendendo derivazioni più facile per un essere umano da seguire)

enter image description here

ho il sospetto che questo sarà banale da implementare --- a meno che qualcuno sa di una magica Global opzione che può essere temporaneamente sovrascritto in un Block.

Per quel che vale, queste domande in modo possono essere correlati:

+0

Interessante domanda. Potresti essere un po 'più specifico quando dici * l'ordine dato [delle] variabili *? –

+1

@ Mr.Wizard - Per chiarire, se f [b, a] è la funzione inviata a Dt, allora mi piacerebbe che la differenziazione totale fosse emessa come Dt [b] * D [f, b] + Dt [a] * D [f, a], piuttosto che ordinare l'output a Dt [a] * D [f, a] + Dt [b] * D [f, b]. (voi ragazzi sembrate aver capito questo di seguito ... non volevo lasciarvi in ​​sospeso la domanda.) – telefunkenvf14

risposta

4

C'è probabilmente un modo più pulito per fare s, ma se è puramente a scopo di presentazione , potresti fare qualcosa come

pdConv[f_, vv_] := 
Module[{v}, 
    (HoldForm[ 
     [email protected] 
     TraditionalForm[((f /. Thread[vv -> #]) /. 
      Derivative[inds__][g_][vars__] :> 
      Apply[Defer[D[g[vars], ##]] &, 
      Transpose[{{vars}, {inds}}] /. {{var_, 0} :> 
       Sequence[], {var_, 1} :> {var}}])]] /. 
     Thread[# -> vv]) &@ Table[Unique[v], {Length[vv]}]] 

Qui, il parametro aggiuntivo vv è un elenco delle variabili in f nell'ordine in cui si desidera visualizzare le derivate parziali. Per utilizzare questa funzione, si potrebbe fare qualcosa di simile

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

equations in right order

Fondamentalmente ciò che questa soluzione non è quella di sostituire temporaneamente l'elenco delle variabili vv con un elenco di variabili dummy che sono nell'ordine lessicografico destra, applicare la trasformazione e quindi sostituire le variabili dummy con le variabili originali mantenendo l'ordine desiderato avvolgendo l'espressione trasformata in HoldForm.

+0

Mi hai battuto! E probabilmente funziona anche meglio. –

+0

@ Mr.Wizard Immagino che ci sia un primo per tutto ;-) – Heike

+0

Posso prendere in prestito la tua idea di sostituzione e implementarla nel mio stile, o preferiresti che io non lo facessi? –

1

Revisionato dopo aver visto il metodo di gran lunga superiore di Heike. Speriamo senza romperlo.

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])] 
    ] 

Usa:

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

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

ordinamento automatico per un caso stretto:

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])] 
    ] 

Usa:

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

Sei veloce! Ci giocherò e riferirò. Può anche controllare alcuni degli altri esempi dal post del blog di Wolfram (per confermare che funzionano ancora). – telefunkenvf14

0

Ho capito che Dt[d[x, a, c, b]] fornisce già l'output ordinato, solo al contrario.Probabilmente fraintendo la situazione, ma per alcuni casi questo sembra essere sufficiente:

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