防止衍生产品的重新排序?

时间:2011-12-24 11:47:23

标签: wolfram-mathematica typesetting differentiation

recent post on the Wolfram Blog提供了以下函数,以更传统的方式格式化衍生物。

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给出:

enter image description here

如果不打破pdConv的一般功能,有人可以改变它以维持给定的变量顺序,产生如下所示的输出吗? (当然这纯粹是出于个人原因,使人类更容易进行推导)

enter image description here

我怀疑实施起来会非常重要 - 除非有人知道可以在Global内暂时覆盖的神奇Block选项。

对于它的价值,这些SO问题可能是相关的:

3 个答案:

答案 0 :(得分:4)

可能有一种更简洁的方法,但如果纯粹出于演示目的,你可以做类似的事情

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

equations in right order

基本上,这个解决方案的作用是暂时将变量列表vv替换为正确的字典顺序的虚拟变量列表,应用转换,然后用原始变量替换虚拟变量通过将转换后的表达式包装在HoldForm中来保留所需的顺序。

答案 1 :(得分:1)

在看到Heike的优势方法后进行了修改。希望不破坏它。

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

答案 2 :(得分: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