如何在Mathematica中进行替换?

时间:2010-12-14 20:21:51

标签: wolfram-mathematica

我刚刚开始使用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],它会替换所有多项式项,但不能用于导数项。

如何强制替换这些功能?

2 个答案:

答案 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)我在定义ax时使用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],因此规则中有几个方括号。