我刚刚开始使用Mathematica,我已经得到了关于进行替换的一个非常基本的问题,但我无法让它工作。
我想找到函数phi [x,y]的函数的欧拉 - 拉格朗日方程,然后替换函数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}
]
我得到了
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 :(得分: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]}
如果Derivative
具有Default
属性(将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]
假设符号var
的变体sym
较小。当然,你需要做的是围绕var=0
扩展系列,只保留线性部分。然后在具有var
的导数的任何项上使用按部分的积分。所有这些都应该包含在上面的模块中。
答案 1 :(得分: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)我在定义a
和x
时使用double underscore,它将匹配序列中的一个或多个项目。
当然,这不是解决问题的最令人满意的方法,因为每次希望进行这种替换时都需要编写两条规则。事实证明,一个更通用的方法难以实现,我将不得不回复你。
修改:这需要双重替换,如下所示
<result> /. phi -> phi0 + psi /. a_[b__][c__] :> Through[Distribute[a[b]][c]]
Distribute
确保导数与Plus
一起正常工作,而Through
对函数args c
执行相同操作。关键是Head
的{{1}}是Derivative[2, 0][phi][x, y]
,因此规则中有几个方括号。