ReplaceRepeated (//.) 在特定表头下失效
mathematica吧
全部回复
仅看楼主
level 9
最近在使用mathematica进行推导时出了一个想不明白的小问题
比如推导球坐标下的微元体积
eq =
Block[{$Assumptions = (Dt[r] | Dt[\[Theta]] | Dt[\[Phi]]) \[Element]
Vectors[d]},
TensorExpand@
TransformedField[ "Cartesian" -> "Spherical",
Dt[x]~TensorWedge~Dt[y]~TensorWedge~
Dt[z], {x, y, z} -> {r, \[Theta], \[Phi]}]]
我想要利用反对称直接化简 eq 却失败了, ReplaceRepeated 不起作用
eq //. TensorWedge[left___, k1_, k2_, right___] /;
Not@OrderedQ[{k1, k2}] :> (-1)*TensorWedge[left, k2, k1, right]
但是如果将 TensorWedge 改为临时的表头 h 就能使用 ReplaceRepeated 化简
eq /. TensorWedge -> h //.
h[left___, k1_, k2_, right___] /; Not@OrderedQ[{k1, k2}] :> (-1)*
h[left, k2, k1, right] /. h -> TensorWedge // Simplify
这是为什么呢?
2025年04月02日 10点04分 1
吧务
level 10
因为TensorWedge有Flat属性,导致总是有可匹配的,参见其文档第三个基本例子。另外建议直接一次计算出正负号而不是重复替换。
2025年04月03日 09点04分 2
的确如此, 非常感谢
2025年04月05日 12点04分
level 9
的确是因为函数的Flat属性
Attributes[TensorWedge]
SetAttributes[f, Flat];
f[e, b, c, d, a] //.
f[left___, x_, y_, right___] /; Not@OrderedQ[{x, y}] :> (-1)*
f[left, y, x, right]
ClearAttributes[f, Flat];
f[e, b, c, d, a] //.
f[left___, x_, y_, right___] /; Not@OrderedQ[{x, y}] :> (-1)*
f[left, y, x, right]
2025年04月05日 12点04分 3
1