如何在 Sympy 的方程中计算矩阵的幂?
How to factor powers of an matrix in a equation in Sympy?
我有一个表达来自
from sympy.physics.quantum import Commutator as cmm
x, t, A, V, W, D = sp.symbols('x t A V W D', commutative = False)
Q = sp.Function('Q', commutative = False)
F = (sp.diff(Q(x,t),x)+ cmm(W,Q(x,t)).doit() - sp.I*cmm(A,Q(x,t)+ cmm(W,Q(x,t)).doit()).doit())*(sp.diff(Q(x,t),x)+ cmm(W,Q(x,t)).doit() - sp.I*cmm(A,Q(x,t)+ cmm(W,Q(x,t)).doit()).doit())
F.expand()
这给了我一个表达式,其中元素在 W 中为零阶,在 W 中为一阶,在 W 中为二阶。我只想获得一阶 W。我尝试了因式分解程序,但由于没有换向,它似乎无法识别 W 的幂。它总是给我 0。有没有简单的方法可以做到这一点?我当然可以手工完成,但这不是我的目标。
谢谢
你可以通过在遍历 F 的参数时收集它们来获得 W 中的所有一阶项:
>>> from sympy import Add
>>> first_order_terms = []
>>> for i in Add.make_args(F.expand()):
... if i == W or i.is_Mul and i.has(W) and i.subs(W,y).as_independent(y)[1] == y:
... first_order_terms.append(i)
...
>>> Add(*first_order_terms)
-A*W*Q(x, t)*A*Q(x, t) - I*A*W*Q(x, t)*Derivative(Q(x, t), x) + A*W*Q(x, t)**2*A -
A*Q(x, t)*A*W*Q(x, t) + A*Q(x, t)*A*Q(x, t)*W + A*Q(x, t)*W*A*Q(x, t) - I*A*Q(x,
t)*W*Q(x, t) + I*A*Q(x, t)*W*Derivative(Q(x, t), x) + I*A*Q(x, t)**2*W - A*Q(x,
t)**2*W*A - I*W*Q(x, t)*A*Q(x, t) - W*Q(x, t)*A*Q(x, t)*A + I*W*Q(x,
t)*A*Derivative(Q(x, t), x) + W*Q(x, t)*A**2*Q(x, t) + W*Q(x, t)*Derivative(Q(x, t),
x) + I*W*Q(x, t)**2*A + I*Q(x, t)*A*W*Q(x, t) - Q(x, t)*A*W*Q(x, t)*A - I*Q(x,
t)*A*Q(x, t)*W + Q(x, t)*A*Q(x, t)*W*A + Q(x, t)*A**2*W*Q(x, t) - Q(x, t)*A**2*Q(x,
t)*W + I*Q(x, t)*W*A*Q(x, t) + Q(x, t)*W*A*Q(x, t)*A - I*Q(x, t)*W*A*Derivative(Q(x,
t), x) - Q(x, t)*W*A**2*Q(x, t) - I*Q(x, t)*W*Q(x, t)*A - Q(x, t)*W*Derivative(Q(x,
t), x) - I*Derivative(Q(x, t), x)*A*W*Q(x, t) + I*Derivative(Q(x, t), x)*A*Q(x, t)*W +
Derivative(Q(x, t), x)*W*Q(x, t) + I*Derivative(Q(x, t), x)*W*Q(x, t)*A -
Derivative(Q(x, t), x)*Q(x, t)*W - I*Derivative(Q(x, t), x)*Q(x, t)*W*A
一个更紧凑的方法,在扩展 F 之后,如下所示:
>>> Add(*[i for i in F.expand().atoms(Mul) if i.xreplace({W:z}).coeff(z) != 0])
如果 z
(在这种情况下)显示为线性因子,coeff
只会 return 一个非零值。当然,如果您只是将 F 中的 W
替换为 z
,这是行不通的,因为由于其不同的非交换因子而未取消的项将在替换后取消,因此您不会得到同样的结果。
我有一个表达来自
from sympy.physics.quantum import Commutator as cmm
x, t, A, V, W, D = sp.symbols('x t A V W D', commutative = False)
Q = sp.Function('Q', commutative = False)
F = (sp.diff(Q(x,t),x)+ cmm(W,Q(x,t)).doit() - sp.I*cmm(A,Q(x,t)+ cmm(W,Q(x,t)).doit()).doit())*(sp.diff(Q(x,t),x)+ cmm(W,Q(x,t)).doit() - sp.I*cmm(A,Q(x,t)+ cmm(W,Q(x,t)).doit()).doit())
F.expand()
这给了我一个表达式,其中元素在 W 中为零阶,在 W 中为一阶,在 W 中为二阶。我只想获得一阶 W。我尝试了因式分解程序,但由于没有换向,它似乎无法识别 W 的幂。它总是给我 0。有没有简单的方法可以做到这一点?我当然可以手工完成,但这不是我的目标。
谢谢
你可以通过在遍历 F 的参数时收集它们来获得 W 中的所有一阶项:
>>> from sympy import Add
>>> first_order_terms = []
>>> for i in Add.make_args(F.expand()):
... if i == W or i.is_Mul and i.has(W) and i.subs(W,y).as_independent(y)[1] == y:
... first_order_terms.append(i)
...
>>> Add(*first_order_terms)
-A*W*Q(x, t)*A*Q(x, t) - I*A*W*Q(x, t)*Derivative(Q(x, t), x) + A*W*Q(x, t)**2*A -
A*Q(x, t)*A*W*Q(x, t) + A*Q(x, t)*A*Q(x, t)*W + A*Q(x, t)*W*A*Q(x, t) - I*A*Q(x,
t)*W*Q(x, t) + I*A*Q(x, t)*W*Derivative(Q(x, t), x) + I*A*Q(x, t)**2*W - A*Q(x,
t)**2*W*A - I*W*Q(x, t)*A*Q(x, t) - W*Q(x, t)*A*Q(x, t)*A + I*W*Q(x,
t)*A*Derivative(Q(x, t), x) + W*Q(x, t)*A**2*Q(x, t) + W*Q(x, t)*Derivative(Q(x, t),
x) + I*W*Q(x, t)**2*A + I*Q(x, t)*A*W*Q(x, t) - Q(x, t)*A*W*Q(x, t)*A - I*Q(x,
t)*A*Q(x, t)*W + Q(x, t)*A*Q(x, t)*W*A + Q(x, t)*A**2*W*Q(x, t) - Q(x, t)*A**2*Q(x,
t)*W + I*Q(x, t)*W*A*Q(x, t) + Q(x, t)*W*A*Q(x, t)*A - I*Q(x, t)*W*A*Derivative(Q(x,
t), x) - Q(x, t)*W*A**2*Q(x, t) - I*Q(x, t)*W*Q(x, t)*A - Q(x, t)*W*Derivative(Q(x,
t), x) - I*Derivative(Q(x, t), x)*A*W*Q(x, t) + I*Derivative(Q(x, t), x)*A*Q(x, t)*W +
Derivative(Q(x, t), x)*W*Q(x, t) + I*Derivative(Q(x, t), x)*W*Q(x, t)*A -
Derivative(Q(x, t), x)*Q(x, t)*W - I*Derivative(Q(x, t), x)*Q(x, t)*W*A
一个更紧凑的方法,在扩展 F 之后,如下所示:
>>> Add(*[i for i in F.expand().atoms(Mul) if i.xreplace({W:z}).coeff(z) != 0])
如果 z
(在这种情况下)显示为线性因子,coeff
只会 return 一个非零值。当然,如果您只是将 F 中的 W
替换为 z
,这是行不通的,因为由于其不同的非交换因子而未取消的项将在替换后取消,因此您不会得到同样的结果。