2010-12-14 50 views
3

我剛剛開始使用Mathematica,並且我已經得到了關於進行替換的一個非常基本的問題,但是我無法實現它。如何在Mathematica中進行替換?

我想找到用於功能的功能披[X,Y]的歐拉 - 拉格朗日方程,然後使該函數披取代[X,Y]

如果我輸入以下:

VariationalD[tau*phi[x, y]^2 - 2*phi[x, y]^4 + phi[x, y]^6 + Dot[D[phi[x, y], {{x, y}}], D[phi[x, y, {{x, y}}]]], phi[x, y], {x, y}]

我得到

Plus[Times[2,tau,phi[x,y]],Times[-8,Power[phi[x,y],3]],Times[6,Power[phi[x,y],5]],Times[-2,Plus[Derivative[0,2][phi][x,y],Derivative[2,0][phi][x,y]]]] 

現在,如果我嘗試% /. phi[x,y] -> phi0[x,y] + psi[x,y]它使替代所有的多項式條款,但不包括衍生條款。

如何強制替換爲這些功能?

+0

+1,讓我很難想出一個簡單的,通用的方式來實現這一點。 – rcollyer 2010-12-14 21:38:23

+0

這對物理學家來說可能是顯而易見的,但是你對「導數[0,2] [phi] [x,y]」術語要做什麼樣的替換? – 2010-12-14 23:09:40

+1

@Yaro phi [x,y] - > phi0 [x,y] + psi [x,y] ...可能他正在做一些攝動分析。之後,您只保留最重要的術語是psi。這就是ODE總是給你一個諧波振盪器......或混沌的方式。這是物理:) – 2010-12-15 00:10:49

回答

5

我同意所有的rcollyer說,但我認爲他的最終解決方案可能有點不透明。

,我能想出(這是基本相同rcollyer的)最簡單的規則是

{phi[x__] :> phi0[x] + psi[x], f_[phi][x__] :> f[phi0][x] + f[psi][x]} 

或可能出現的副作用少的東西是

{phi[x__] :> phi0[x] + psi[x], Derivative[n__][phi][x__] :> Derivative[n][phi0][x] + Derivative[n][psi][x]} 

這將是一個如果DerivativeDefault屬性(比較Default[Times]Default[Derivative])更容易。它應該類似Default[Derivative] := Sequence[],但不幸的是,對於模式匹配不太好。

再回到你的問題,你可能要定義像

VariationalD[expr_, sym_, var_] := Module[{ 
    vRule = {sym[x__] :> sym[x] + var[x], 
    Derivative[n__][sym][x__] :> Derivative[n][sym][x] + Derivative[n][var][x]}}, 
    (expr /. vRule) - expr] 

其中符號sym的變化var被認爲是小東西。當然,你需要做的是圍繞var=0進行系列擴展,只保留線性部分。然後使用任何具有var衍生產品的術語,按部件進行整合。所有這些都應該包含在上面的模塊中。

+1

+1,有趣的答案。我的回答是不透明的,但是我反對需要在每次需要替換函數總和時創建一個特殊規則。我寧願有一條規則,我可以不加修改地使用,但是對於他們自己的規則。你的規則將會更容易被打破我的頭頂。 – rcollyer 2010-12-15 03:08:41

+0

至於你對我答案可能產生的副作用的觀點,模式'a_ [b __] [c __]'只會匹配那些有兩組或多組方括號的頭。此外,如果'b'包含'Plus','Distribute [a [b]]'只會實際上重新排列事物,並且它可以不超過一級,即'f [a,x + y,b]'變成'f [a,x,b] + f [a,y,b]'但是'f [a,g [x + y],b]'不受影響。 「通過」是唯一潛在的問題,因爲「通過[a b [x]]」未被評估,因此該模式可以稍微改進。 – rcollyer 2010-12-16 22:23:11

2

首先,您錯誤地在您的二階導數中放置了],它應該爲D[phi[x, y], {{x, y}}]]而不是D[phi[x, y, {{x, y}}]]]

也就是說,在Mathematica中的替換可能會非常棘手,正如在其他questions中已經指出的那樣。這並不是說這是不可能的,只需要一些工作。在這種情況下,問題出在phi[x,y]不同於Derivative[2, 0][phi][x, y]。所以,你的模式不符合派生詞。最簡單的做法是將規則

Derivative[a__][phi][x__]:> Derivative[a][phi0][x] + Derivative[a][psi][x] 

添加到您的替換規則列表中。需要注意的三件事:1)我使用ReplaceDelayed,這樣兩種類型的衍生產品都會匹配而不需要編寫多個規則,2)因爲我可以使用模式,所以我給它們命名以便我們可以在規則的RHS上引用它們,3 )當定義ax時,我使用了double underscore,它將匹配序列中的一個或多個項目。

當然,這不是解決問題的最令人滿意的方式,因爲每次希望這種替換時都需要您編寫兩條規則。事實證明,更普遍的方法令人驚訝地難以完成,我必須回到你身上。

編輯:這需要一個雙置換,如下

<result> /. phi -> phi0 + psi /. a_[b__][c__] :> Through[Distribute[a[b]][c]] 

Distribute確保衍生物與Plus正常運行,並且Through確實與函數參數c相同。關鍵是Derivative[2, 0][phi][x, y]HeadDerivative[2, 0][phi],因此規則中有幾個方括號。

+0

感謝您的答案。它的工作原理,但我解析它仍然有一些麻煩。模式a_ [b __] [c__]匹配的究竟是什麼?例如,我想a_可以匹配Derivative,b__可以匹配[2,0],並且c__可以匹配[phi0 + psi]。那麼RuleDelayed的rhs將通過[Distribute [Derivative [2,0]] [phi0 + psi]]。我必須解釋括號錯誤或者操作順序錯誤,但是在我看來,Distribute函數沒有任何東西來分配Derivative。除非可能首先評估Through函數? – 2daaa 2010-12-16 01:42:18

+0

@Ranjit,那是很難的一個。這種模式'a_ [b __] [c __]'從右到左更容易閱讀:'[c __]'在末尾與方括號相匹配,'[b __]'與第二到最後一個方括號匹配,所以'a_'匹配其他所有內容。因此,'a_:> Derivative [2,0]','b__:> phi0 + psi'和'c__:> Sequence [x,y]'。然後,'Distribute'的目的是將'Derivative [2,0]'和'Plus',以及'Through'連接到每個導數[x,y]'。 – rcollyer 2010-12-16 02:47:47

相關問題