2011-12-24 10 views
5

A 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, кто-то может изменить его для поддержания заданного порядка переменных, производя результат, показанный ниже? (Конечно, это чисто по asthetic причинам, что делает выкладок проще для человека, чтобы следовать)

enter image description here

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

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

+0

Интересный вопрос. Не могли бы вы быть более конкретными, когда говорите * данный порядок [из] переменных *? –

+1

@ 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]. (вы, ребята, похоже, поняли это ниже ... не хотели, чтобы у вас был вопрос, висящий.) – telefunkenvf14

ответ

4

Существует, вероятно, уборщик способ сделать с, но если это чисто для целей представления , вы могли бы сделать что-то вроде

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

+0

Ты избил меня! И это, вероятно, работает лучше. –

+0

@ Mr.Wizard Я предполагаю, что есть первое для всего ;-) – Heike

+0

Могу ли я заимствовать вашу идею замещения и реализовать ее в своем собственном стиле, или вы бы предпочли, чтобы я этого не сделал? –

1

Пересмотрено после просмотра Heike's far superior method. Надеюсь, не нарушив его.

ClearAll[pdConv] 

pdConv[order_List][f_] := 
    With[{R = Thread[order -> [email protected]]}, 
    [email protected]@# /. Reverse[R, 2] &[ 
    f /. R /. Derivative[inds__][g_][vars__] :> 
     ([email protected][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 : [email protected][email protected]__] := 
    With[{R = Thread[{syms} -> [email protected]{syms}]}, 
    [email protected]@# /. Reverse[R, 2] &[ 
    f /. R /. Derivative[inds__][g_][vars__] :> 
     ([email protected][g[vars], ##] & @@ Pick[{vars}, {inds}, 1])] 
    ] 

Использование:

Dt[d[x, a, c, b]] // pdConvAuto 
+0

Ты быстро! Я буду играть с ним и отчитаюсь. Также можно проверить некоторые другие примеры из сообщения блога Wolfram (чтобы подтвердить, что они все еще работают). – telefunkenvf14

0

Я понял, что Dt[d[x, a, c, b]] уже дает упорядоченный вывод, как раз наоборот.Вероятно, я неправильно понимаю ситуацию, но в некоторых случаях этого оказалось достаточно:

ClearAll[pdConv] 

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

Dt[d[x, a, r, c, b]] // pdConv