2010-12-14 5 views
3

私はちょうどMathematicaを使い始めています。置き換えについてはかなり基本的な質問でなければなりませんが、動作させることはできません。Mathematicaでこの置換をどうやって行うのですか?

私は、関数PHI [X、Y]の機能のためのオイラー・ラグランジュ方程式を見つけた後、私が入力した場合、次の関数ファイの置換[のX、Y]

をしたいのですが:私は% /. phi[x,y] -> phi0[x,y] + psi[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]]]] 

は今では全ての多項式の代わりになり得る

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

デリバティブの条件ではない。

どのように置換を強制するのですか?

+0

+1私はこれを達成するための単純で一般的な方法を思いつくために苦労しています。 – rcollyer

+0

これは物理学者にとっては明白かもしれませんが、[Derivative [0,2]φ[x、y] 'termの代わりにあなたは何をしようとしていますか? –

+1

@ Yaro phi [x、y] - > phi0 [x、y] + psi [x、y] ...おそらく彼はいくつかの摂動解析を行っています。その後、最も重要な用語はpsiだけを維持します。 ODEが常にあなたにハーモニックオシレーター...またはカオスを与える方法です。それは物理学です:) –

答えて

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[]のようなものでなければなりませんが、残念ながらパターンマッチングでうまくいきません。

あなたの質問に戻って取得する、あなたはおそらく、シンボルsymの変動varが小さいと仮定されて

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] 

のようなものを定義したいです。もちろん、あなたがしなければならないことは、系列がvar=0の周りに広がり、線形部分だけを保持することです。次に、導関数がvarである任意の項の部分積分を使用します。これらはすべて上記のモジュールに含まれていなければなりません。

+1

+1、面白い答え。私の答えは不透明ですが、私は関数の合計で代用する必要があるたびに特別なルールを作成する必要性に反対します。私はむしろ変更せずに使うことができるルールを持っていますが、それぞれ独自のルールを持っています。あなたのルールは、私の頭の上から手を伸ばす方が簡単です。 – rcollyer

+0

私の答えの副作用の可能性については、パターン 'a_ [b __] [c __]'は二つ以上の大括弧がある頭部にのみ一致します。さらに 'Distribute [a [b]]'は、 'b'が' Plus'を含んでいれば、実際には物事を並べ替えるだけで、 'f [a、x + y、b]'になります'f [a、x、b] + f [a、y、b]' 'f [a、g [x + y]、b]'は影響を受けません。 'Through [a b [x]]が評価されていないという点で唯一の潜在的な問題の子であるので、パターンを少し改善することができます。 – rcollyer

2

最初に、]を2次の派生語句に間違えた場合は、ではなく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] 

のルールを追加することです。 3つの注意点:1)私はReplaceDelayedを使用して、両方のタイプの派生物が複数のルールを書かずにマッチする、2)パターンを使うことができるので、ルールのRHSでそれらを参照できるように名前を付けました。 )axを定義するときには、シーケンス内の1つ以上の項目に一致するdouble underscoreを使用しました。

もちろん、これは問題解決に最も満足できる方法ではありません。この種の置き換えを行うたびに2つのルールを書く必要があります。それはより一般的なアプローチが驚くほど達成することが困難であることが判明し、私はあなたにそれに戻る必要があります。

編集

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

Distributeを次のようにこれは、二重の交換が必要誘導体はPlusで正しく動作することを保証し、Throughは、関数引数cと同じことを行います。鍵はHeadDerivative[2, 0][phi][x, y]であることです。つまり、規則内に複数のレベルの角括弧があります。Derivative[2, 0][phi]です。

+0

答えをありがとう。それは動作しますが、私はまだそれを解析する上でいくつかの問題を抱えています。どのパターンa_ [b __] [c__]が一致していますか?私は、a_がDerivative、b__は[2,0]、c__は[phi0 + psi]と一致する可能性があります。したがって、RuleDelayedのrhsはThrough [Distribute [Derivative [2,0]] [phi0 + psi]になります。間違ったかっこや操作の順序が間違っていると解釈しなければなりませんが、Distribute関数にはDerivativeを配布するものがないようです。多分スルー機能が最初に評価されているのでなければ? – 2daaa

+0

@Ranjit、それは難しいものでした。このパターン[a_ [b __] [c __] 'は右から左へ読みやすくなります。' [c __] 'は最後に大括弧で囲まれたものと一致し、' [b __] 'は二番目から最後の角括弧に一致します。 'a_'は他のすべてと一致します。したがって、a_:> Derivative [2,0] '' 'b__:> phi0 + psi''と' c__:> Sequence [x、y] 'です。次に、「派生物」の目的は「派生物[2,0]」と「プラス」を交換することであり、「スルー」は各派生物に「[x、y]」を付けることです。 – rcollyer

関連する問題