Wolfram mathematica 防止在衍生产品输出中重新排序?

Wolfram mathematica 防止在衍生产品输出中重新排序?,wolfram-mathematica,typesetting,differentiation,Wolfram Mathematica,Typesetting,Differentiation,A提供了以下函数以更传统的方式格式化衍生工具 pdConv[f_] := TraditionalForm[ f /. Derivative[inds__][g_][vars__] :> Apply[Defer[D[g[vars], ##]] &, Transpose[{{vars}, {inds}}] /. {{var_, 0} :> Sequence[], {var_, 1} :> {var}}] ] 例如,Dt[d

A提供了以下函数以更传统的方式格式化衍生工具

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
的一般功能的情况下,是否有人可以修改它以保持给定的变量顺序,从而产生如下所示的输出?(当然,这纯粹是因为哮喘的原因,使得人类更容易遵循推导)

我怀疑这对实现来说是不寻常的——除非有人知道一个神奇的
全局
选项可以在
中临时覆盖

值得一提的是,这些问题可能是相关的:


可能有一种更干净的方法来进行演示,但如果纯粹是为了演示目的,您可以执行以下操作

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]}]]
pdConv[Dt[d[x, c]], {x, c}]
这里,额外的参数
vv
f
中变量的列表,其顺序是希望偏导数出现的顺序。要使用此函数,您可以执行以下操作

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]}]]
pdConv[Dt[d[x, c]], {x, c}]


基本上,这个解决方案所做的是临时用一个按正确字典顺序排列的伪变量列表替换变量列表
vv
,应用转换,然后用原始变量替换虚拟变量,同时保留所需的顺序,方法是将转换后的表达式包装在
HoldForm

中,在看到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])]
  ]
使用:


窄箱自动订购:

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]
已经给出了有序的输出,正好相反。我可能误解了情况,但在某些情况下,这似乎足够了:

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

有趣的问题。当你说变量的给定顺序时,你能更具体一点吗?@Mr.Wizard-为了澄清,如果f[b,a]是馈送给Dt的函数,那么我希望总微分输出为Dt[b]*d[f,b]+Dt[a]*d[f,a],而不是将输出排序为Dt[a]*d[f,a]+Dt[b]*d[f,b]。(你们似乎已经在下面找到了答案……不想让你们的问题悬而未决。)@Wizard先生,我想一切都是第一次;-)我可以借用你的替代思想并以我自己的方式实施它吗?或者你更愿意我不这样做吗?@Heike我想你的想法很管用。。。改进的想法是保持输入函数(通过属性)并使用Level自动获取变量的顺序。也就是说,我不确定这是否会打乱原始博文中给出的其他示例。@telefunken我将尝试实现这一点,我将让您来处理结果。您太快了!我会玩它,然后回来汇报。还可以查看Wolfram博客文章中的一些其他示例(以确认它们仍然有效)。