Предотвратить переупорядочение в производной продукции? - PullRequest
5 голосов
/ 24 декабря 2011

A В недавнем сообщении в блоге 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 дает:

enter image description here

Не нарушая общих возможностей pdConv, может ли кто-нибудь изменить его, чтобы поддерживать заданный порядок переменных, создавая вывод, показанный ниже? (конечно, это чисто по эстетическим соображениям, облегчая для человека деривации)

enter image description here

Я подозреваю, что это будет нетривиально реализовать - если кто-то не знает о волшебной опции Global, которая может быть временно отменена в Block.

Для чего стоит, эти вопросы SO могут быть связаны:

Ответы [ 3 ]

4 голосов
/ 24 декабря 2011

Вероятно, есть более чистый способ сделать 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}]

equations in right order

По сути, это решение временно заменяет список переменных vv списком фиктивных переменных в правильном лексикографическом порядке, применяет преобразование, а затем заменяет фиктивные переменные исходными переменными, сохраняя при этом желаемый порядок, заключив преобразованное выражение в HoldForm.

1 голос
/ 24 декабря 2011

Пересмотрено после просмотра гораздо более совершенного метода Хайке. Надеюсь, не сломав его.

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
0 голосов
/ 24 декабря 2011

Я понял, что 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
...