Wolfram mathematica 我如何在Mathematica中进行替换?

Wolfram mathematica 我如何在Mathematica中进行替换?,wolfram-mathematica,Wolfram Mathematica,我刚刚开始学习Mathematica,我有一个关于替换的基本问题,但我不能让它工作 我想找到函数phi[x,y]的泛函的Euler-Lagrange方程,然后替换函数phi[x,y] 如果我输入以下内容: 变量D[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}] 我明白了 现在,如果我尝试%/。phi[x,y]->phi0[x,y]+psi[x,y]它替换

我刚刚开始学习Mathematica,我有一个关于替换的基本问题,但我不能让它工作

我想找到函数phi[x,y]的泛函的Euler-Lagrange方程,然后替换函数phi[x,y]

如果我输入以下内容:

变量D[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}
]

我明白了

现在,如果我尝试
%/。phi[x,y]->phi0[x,y]+psi[x,y]
它替换所有多项式项,但不替换导数项


如何将替换强制到这些函数中?

首先,您在二阶导数项中错误地放置了一个
]
,它应该是
D[phi[x,y],{{x,y}]]
而不是
D[phi[x,y,{x,y}]]

这就是说,Mathematica中的替换可能很棘手,正如其他文章所指出的那样。这并不是说这是不可能的,只是需要一些工作。在这种情况下,问题在于
phi[x,y]
不同于
导数[2,0][phi][x,y]
。所以,你的模式与导数项不匹配。最简单的方法是添加规则

Derivative[a__][phi][x__]:> Derivative[a][phi0][x] + Derivative[a][psi][x]
到您的替换规则列表。需要注意的三件事:1)我使用
ReplaceDelayed
,这样两种类型的衍生工具都可以匹配,而无需编写多个规则;2)因为我可以使用模式,所以我将它们命名为模式,以便我可以在规则的右侧引用它们;3)我在定义
a
x
时使用a,它们将匹配序列中的一个或多个项目

当然,这并不是解决问题的最令人满意的方法,因为每次您希望进行此类替换时,都需要编写两条规则。事实证明,一个更通用的方法是出人意料地难以实现的,我将不得不就此与您取得联系

编辑:这需要双重替换,如下所示

<result> /. phi -> phi0 + psi /. a_[b__][c__] :> Through[Distribute[a[b]][c]]
/。φ->φ0+psi/。通过[分发[a[b]][c]:>通过[分发[a[b]][c]]
确保衍生工具与
Plus
一起正确工作,并与函数args
c
一起正确工作。关键是
导数[2,0][phi][x,y]
头是
导数[2,0][phi]
,因此规则中有几个方括号。

我同意所有的说法,但我认为他的最终解决方案可能有点不透明

我能想到的最简单的规则(基本上与rcollyer的相同)是

或者是一些副作用较少的东西

{phi[x__] :> phi0[x] + psi[x], Derivative[n__][phi][x__] :> Derivative[n][phi0][x] + Derivative[n][psi][x]}
如果
衍生工具
具有
默认
属性(将
默认[时间]
默认[衍生工具]
进行比较),则会容易得多。它应该类似于
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,这让我很难想出一个简单、通用的方法来实现这一点。这对物理学家来说可能是显而易见的,但是你想用什么来代替导数[0,2][phi][x,y]
项?@Yaro phi[x,y]>phi0[x,y]+psi[x,y]。。。可能他正在做一些微扰分析。在此之后,您只保留最重要的术语是psi。这就是ODE总是给你一个谐振子的方式。。。或者混乱。这就是物理学:)+1,有趣的答案。我的答案是不透明的,但我反对每次需要替换函数和时都需要创建一个特殊规则。我宁愿有一个规则,我可以使用没有修改,但每个人自己的。你的规则更容易在我的脑海中构思出来。至于你对我的答案可能产生的副作用的观点,模式
a_u[b_uuuu][c_uuu]
只会匹配那些有两个或更多方括号的头部。此外,
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
是唯一的潜在问题,因为
Through[AB[x]]
未被评估,因此模式可以稍微改进。感谢您的回答。它可以工作,但我在解析它时仍然遇到一些问题。模式a[b_uuuuuuu][c_uuuuuu]匹配的具体内容是什么?我猜,例如a可以匹配导数,b可以匹配[2,0],c可以匹配[phi0+psi]。因此,规则的rhs将通过[Distribute[导数[2,0]][phi0+psi]]进行延迟。我一定是把括号解释错了,或者操作顺序解释错了,但在我看来,分布函数没有任何东西可以分布导数。除非可能是先对Through函数求值?@Ranjit,这是个困难的问题。这种模式,
a[b][c][u][c][u][code>从右到左更容易阅读:
[c][u][c][code>匹配末尾带有方括号的任何内容,
[b][u][u][code>然后匹配从第二个方括号到最后一个方括号,因此
a
匹配所有其他内容。所以,
a:>导数[2,0]
b:>phi0+psi
,和
c:>序列[x,y]
。然后,
分发
的目的是交换
衍生工具[2,0]
加上
,并且
通过
[x,y]
附加到每个衍生工具上。
{phi[x__] :> phi0[x] + psi[x], Derivative[n__][phi][x__] :> Derivative[n][phi0][x] + Derivative[n][psi][x]}
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]