如何在SymPy中扩展矩阵表达式?

2024-03-28 14:56:10 发布

您现在位置:Python中文网/ 问答频道 /正文

在SymPy中,我试图执行一个矩阵乘法,然后将其展开。然而,矩阵的展开似乎并不支持。例如,矩阵的四阶龙格库塔(RK4):

from sympy import init_session
init_session()
from sympy import *

A = MatrixSymbol('A', 3, 3)
x = MatrixSymbol('x', 3, 1)
dt = symbols('dt')

k1 = A*x
k2 = A*(x + S(1)/2*k1*dt)
k3 = A*(x + S(1)/2*k2*dt)
k4 = A*(x + k3*dt)
final = dt*S(1)/6*(k1 + 2*k2 + 2*k3 + k4)
final.expand()

从而产生结果

^{pr2}$

我希望表达式可以像标量变量一样进行扩展:

A,x,dt = symbols('A x dt')
k1 = A*x
k2 = A*(x+k1*dt*S(1)/2)
k3 = A*(x+k2*dt*S(1)/2)
k4 = A*(x+k3*dt)
final = x+dt*(S(1)/6)*(k1+k2+k3+k4)
collect(expand((final)),x)

结果是:

x*(A**4*dt**4/24 + A**3*dt**3/8 + A**2*dt**2/3 + 2*A*dt/3 + 1)

有可能同样地改变矩阵表达式吗?在

尼科瓜罗的回答消除了错误,但将整个表达式扩展为一个矩阵。正如标量示例所示,不是我要找的。在


Tags: fromimportinit表达式sessiondt矩阵k2
2条回答

我认为你可以扩展矩阵表达式。但是你得到的不是矩阵,而是两个符号矩阵(Matsymbols)的乘法。如果你把你的表达式变成一个矩阵,你就可以得到你想要的展开式。请参阅下面的附加行

from sympy import init_session
init_session()
from sympy import *

A = MatrixSymbol('A', 3, 3)
x = MatrixSymbol('x', 3, 1)
dt = symbols('dt')

k1 = A*x
k2 = A*(x + S(1)/2*k1*dt)
k3 = A*(x + S(1)/2*k2*dt)
k4 = A*(x + k3*dt)
final = dt*S(1)/6*(k1 + k2 + k3 + k4)
Matrix(final).expand()

Matrix(final)创建和显式矩阵与您的个别方程。将它们保留在矩阵中可能比较方便,这样您对一个条目所做的任何操作都可以对所有条目执行。为此,请将要执行的操作定义为applyfunc的函数参数:

>>> ex = Matrix(final)
>>> ex = ex.applyfunc(expand)
>>> ex = ex.applyfunc(lambda i: collect(i, dt))
...

对于打印经济,我使用带有紧凑符号项的矩阵来计算相同的值,然后在简化的矩阵上运行cse得到:

^{pr2}$

对非对易表达式的有限支持也可用,在这种情况下可以帮助:

>>> A, x = symbols("A x", commutative=False)
>>> dt = symbols('dt')
>>> k1 = A*x
>>> k2 = A*(x + S(1)/2*k1*dt)
>>> k3 = A*(x + S(1)/2*k2*dt)
>>> k4 = A*(x + k3*dt)
>>> final = dt*S(1)/6*(k1 + 2*k2 + 2*k3 + k4)
>>> final.expand()
dt**4*A**4*x/24 + dt**3*A**3*x/6 + dt**2*A**2*x/2 + dt*A*x
>>> factor(_)
dt*A*(dt**3*A**3/24 + dt**2*A**2/6 + dt*A/2 + 1)*x

但并非所有的简化例程都能识别nc(这是一个已知的问题):

>>> collect(final,x)
Traceback (most recent call last):
...
AttributeError: Can not collect noncommutative symbol

相关问题 更多 >