5

Wolfram ブログの最近の投稿では、より伝統的な方法で導関数をフォーマットする次の関数が提供されました。

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

使用例Dt[d[x, a]] // pdConvは次のとおりです。

ここに画像の説明を入力

の一般的な機能を壊すことなくpdConv、誰かがそれを変更して変数の順序を維持し、以下に示す出力を生成できますか? (もちろん、これは純粋に審美的な理由によるもので、人間が簡単に派生をたどることができます)

ここに画像の説明を入力

これを実装するのは自明ではないと思います---Global内で一時的にオーバーライドできる魔法のオプションを誰かが知らない限りBlock

価値があるのは、これらの SO の質問が関連している可能性があることです。

4

3 に答える 3

4

s を実行するためのよりクリーンな方法がおそらくありますが、それが純粋にプレゼンテーションの目的である場合は、次のようにすることができます

pdConv[f_, vv_] :=
 Module[{v},
  (HoldForm[
       Evaluate@
        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]}]]

ここで、余分なパラメーターは、偏導関数を表示する順序vvの変数のリストです。fこの関数を使用するには、次のようにします。

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

正しい順序で方程式

基本的に、このソリューションが行うことは、変数のリストを一時的にvv正しい辞書順のダミー変数のリストに置き換え、変換を適用してから、変換された変数をラップすることで目的の順序を維持しながら、ダミー変数を元の変数に置き換えることです。での表現HoldForm

于 2011-12-24T12:37:43.007 に答える
1

平家のはるかに優れた方法を見て改訂。うまくいけば、それを壊すことなく。

ClearAll[pdConv]

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

使用する:

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

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

狭いケースの自動順序付け:

ClearAll[pdConvAuto]
SetAttributes[pdConvAuto, HoldFirst]

pdConvAuto[f : Dt@_@syms__] :=
  With[{R = Thread[{syms} -> Sort@{syms}]},
    HoldForm@TraditionalForm@# /. Reverse[R, 2] &[
     f /. R /. Derivative[inds__][g_][vars__] :>
        (Defer@D[g[vars], ##] & @@ Pick[{vars}, {inds}, 1])]
  ]

使用する:

Dt[d[x, a, c, b]] // pdConvAuto
于 2011-12-24T12:38:41.700 に答える
0

Dt[d[x, a, c, b]]逆に、すでに順序付けられた出力が得られていることに気付きました。私はおそらく状況を誤解していますが、場合によってはこれで十分なようです:

ClearAll[pdConv]

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

Dt[d[x, a, r, c, b]] // pdConv
于 2011-12-24T14:42:42.953 に答える