首页 文章

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

提问于
浏览
7

在SymPy中,我试图执行矩阵乘法并在之后展开它 . 但是,SymPy似乎不支持矩阵表达式的扩展 . 例如,这是矩阵的4阶Runge-Kutta(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()

产生结果

Traceback (most recent call last)
<ipython-input-38-b3ff67883c61> in <module>()
     12 final = dt*1/6*(k1+2*k2+2*k3+k4)
     13 
---> 14 final.expand()

AttributeError: 'MatMul' object has no attribute 'expand'

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

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)

是否有可能同样改变矩阵表达式?

nicoguaro的答案消除了错误,但将整个表达式扩展为一个矩阵 . 正如标量示例所示,不是我正在寻找的 .

1 回答

  • 0

    我认为您可以扩展Matrix表达式 . 但你拥有的不是矩阵,而是两个符号矩阵(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()
    

相关问题