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
给出:
如果不打破pdConv
的一般功能,有人可以改变它以维持给定的变量顺序,产生如下所示的输出吗? (当然这纯粹是出于个人原因,使人类更容易进行推导)
我怀疑实施起来会非常重要 - 除非有人知道可以在Global
内暂时覆盖的神奇Block
选项。
对于它的价值,这些SO问题可能是相关的:
答案 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}]
基本上,这个解决方案的作用是暂时将变量列表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