关于Mathematica表达式替换的问题
mathematica吧
全部回复
仅看楼主
level 1
ClearAll["Global`*"]
PoissonBracket[f_,g_,coords_List,moms_List]:=Total[MapThread[D[f,
#1]*D[g,#
2]-D[f,
#2]*D[g,#
1]&,{coords,moms}]];
q={qx,qy,qz};
p={px,py,pz};
A={Ax[qx,qy,qz],Ay[qx,qy,qz],Az[qx,qy,qz]};
v=(1/m)*(p-e*A);
H=1/2*m*(v.v)+e*\[Phi][qx,qy,qz];
rules={D[Az,qy]-D[Ay,qz]->Bx,
D[Ax,qz]-D[Az,qx]->By,
D[Ay,qx]-D[Ax,qy]->Bz,
D[Ay,qz]-D[Az,qy]->-Bx,
D[Az,qx]-D[Ax,qz]->-By,
D[Ax,qy]-D[Ay,qx]->-Bz};
我在计算带电粒子在电磁场中运动的泊松括号时,定义了磁矢势与磁场的替换规则,但是在实际计算的时候Mathematica并没有运用这套规则,请问这个问题该如何解决呢?
2025年12月28日 08点12分 1
吧务
level 15
……
1. 你把rules后面的分号去掉观察一下输出,想对此话题有全面了解的话,请参考精品区《为什么y=y[x]会出错?你分得清函数关系和函数吗?》(我已经顶上来了,请看一下首页。)
2. ReplaceAll(/.)执行的并不是智能替换,想对此话题有全面了解的话,请参考精品区《为什么 a^4 /. a^2 -> b 不输出 b^2 ?说说语义式匹配》(我已经顶上来了,请看一下首页。)
3. 你最后一行代码的文本没贴,这次就算了。
对于你这个特定的例子,最简改法大概是:
With[{Ax = Ax[qx, qy, qz], Ay = Ay[qx, qy, qz], Az = Az[qx, qy, qz]},
rules = {D[Az, qy] - D[Ay, qz] -> Bx, D[Ax, qz] - D[Az, qx] -> By,
D[Ay, qx] - D[Ax, qy] -> Bz, D[Ay, qz] - D[Az, qy] -> -Bx,
D[Az, qx] - D[Ax, qz] -> -By, D[Ax, qy] - D[Ay, qx] -> -Bz}]
Factor@PoissonBracket[v[[1]], v[[2]], q, p] /. rules
不过对于更复杂的情形,这么改多半是不够的。
2025年12月28日 13点12分 2
吧务
level 15
更一般的改法:
(* 注意 rules 要使用2楼更正过的定义 *)
newrules =
Solve[Equal @璐村惂鐢ㄦ埛_053SRMK馃惥 rules,
Cases[rules, _[_, _, _], Infinity] // Union][[1]]
PoissonBracket[v[[1]], v[[2]], q, p] /. newrules // Simplify
2025年12月28日 13点12分 3
……注意这个 @璐村惂鐢ㄦ埛_053SRMK馃惥 应该是3个连写的@ 。
2025年12月28日 13点12分
好的,感谢
2026年01月01日 16点01分
1