2011-12-24 16 views
5

A recent post on the Wolfram Blog cung cấp chức năng sau để định dạng các dẫn xuất theo cách truyền thống hơn.Ngăn chặn sắp xếp lại trong đầu ra phái sinh?

pdConv[f_] := 
TraditionalForm[ 
    f /. Derivative[inds__][g_][vars__] :> 
    Apply[Defer[D[g[vars], ##]] &, 
    Transpose[{{vars}, {inds}}] /. {{var_, 0} :> 
     Sequence[], {var_, 1} :> {var}}] 
] 

Một sử dụng Ví dụ, Dt[d[x, a]] // pdConv cho:

enter image description here

Nếu không phá vỡ khả năng chung của pdConv, ai đó có thể thay đổi nó để duy trì trật tự nhất định của các biến, sản xuất sản lượng hiển thị dưới đây? (Của khóa học này là hoàn toàn vì lý do asthetic, làm cho Mục từ dễ dàng hơn cho một con người để làm theo)

enter image description here

Tôi nghi ngờ điều này sẽ không tầm thường để thực hiện --- trừ khi ai đó biết của một Global tùy chọn huyền diệu có thể được tạm thời bị ghi đè trong một số Block.

Đối với những gì nó có giá trị, những câu hỏi này SO có thể liên quan:

+0

Câu hỏi thú vị. Bạn có thể cụ thể hơn một chút khi nói * thứ tự [biến] nhất định *? –

+1

@ Mr.Wizard - Để làm rõ, nếu f [b, a] là hàm được nạp cho Dt, thì tôi muốn tổng sự khác biệt được xuất ra dưới dạng Dt [b] * D [f, b] + Dt [a] * D [f, a], thay vì phân loại đầu ra thành Dt [a] * D [f, a] + Dt [b] * D [f, b]. (các bạn dường như đã tìm ra điều này bên dưới ... không muốn để lại câu hỏi của bạn treo.) – telefunkenvf14

Trả lời

4

Có lẽ là một cách sạch hơn để làm s, nhưng nếu nó hoàn toàn là vì mục đích trình bày , bạn có thể làm điều gì đó như

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

Ở đây, tham số bổ sung vv là danh sách các biến trong f theo thứ tự bạn muốn các dẫn xuất từng phần xuất hiện. Để sử dụng chức năng này, bạn sẽ làm điều gì đó như

pdConv[Dt[d[x, c]], {x, c}] 

equations in right order

Về cơ bản những gì giải pháp này có tác dụng tạm thời thay thế danh sách các biến vv với một danh sách các biến giả, đều trong cùng thứ tự từ điển đúng, áp dụng phép biến đổi, và sau đó thay thế các biến giả bằng các biến gốc trong khi vẫn giữ thứ tự mong muốn bằng cách gói biểu thức được chuyển đổi trong HoldForm.

+0

Bạn đánh bại tôi! Và nó có thể hoạt động tốt hơn. –

+0

@ Mr.Wizard Tôi đoán có một đầu tiên cho tất cả mọi thứ ;-) – Heike

+0

Tôi có thể mượn ý tưởng thay thế của bạn và thực hiện nó theo phong cách riêng của tôi, hoặc bạn sẽ thích rằng tôi không? –

1

Được sửa đổi sau khi nhìn thấy phương pháp vượt trội của Heike. Hy vọng rằng không phá vỡ nó.

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

Sử dụng:

Dt[d[x, a]] // pdConv[{x, a}] 

Dt[d[x, a, c, b]] // pdConv[{x, a, c, b}] 

tự động đặt hàng cho một trường hợp hẹp:

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

Sử dụng:

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

Bạn đang nhanh chóng! Tôi sẽ chơi với nó và sẽ báo cáo lại. Cũng có thể kiểm tra một số ví dụ khác từ bài đăng trên blog Wolfram (để xác nhận chúng vẫn hoạt động). – telefunkenvf14

0

Tôi nhận ra rằng Dt[d[x, a, c, b]] đã cho ra kết quả đặt hàng, ngược lại.Tôi có thể hiểu lầm tình hình, nhưng đối với một số trường hợp, điều này dường như là đủ:

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