我有以下代码用于符号矩阵计算
from sympy import *
A = MatrixSymbol( 'A', 3, 3 )
B = MatrixSymbol( 'B', 3, 3 )
C = MatrixSymbol( 'C', 3, 3 )
Z = A * ( A + B ) * C.inverse() * ( A + B ).transpose()
Z.expand()
这给了我以下结果
A( A + B ) C^-1 ( A^T + B^T )
但是我想要扩展结果
A * A * C^-1 * A^T + A * B C^-1 * A^T + A * A C^-1 * B^T + A * B C^-1 * B^T
我能问你们怎么做吗?非常感谢
答案 0 :(得分:1)
当前,没有办法在sympy中扩展矩阵运算。上面结果中的表达式是查看结果的唯一方法。 Expansion functions available in sympy包括expand()
,expand_trig()
,expand_power_exp()
,expand_power_base()
,expand_log()
,expand_func()
和hyperexpand()
,都没有似乎适合您的矩阵表达式。
如果我们想评估您想要的输出以与simplify
的sympy输出进行比较,Z
函数似乎也不起作用
simplify(A*A*C.inverse()*A.transpose() + A*A*C.inverse()*B.transpose() + A*B*C.inverse()*A.transpose() + A*B*C.inverse()*B.transpose())
>>> A*A*C^-1*A.T + A*A*C^-1*B.T + A*B*C^-1*A.T + A*B*C^-1*B.T
显然与Z
的sympy表达式格式不同。
即使只是针对sympy的输出测试所需的输出,您仍然会得到False的结果
Z == A * A * C.inverse() * A.transpose() + A * B*C.inverse() * A.transpose() + A * A*C.inverse() * B.transpose() + A * B*C.inverse() * B.transpose()
>>> False
我们无法定义每个索引具有已知值的矩阵A
,B
和C
,然后评估上面的表达式以比较它们的输出,因为MutableDenseMatrix
对象没有inverse
属性。
如果要实际比较两个表达式是否相等,则可以使用numpy并将两个表达式与已知矩阵值进行比较。这相当复杂,不适用于非常复杂的表达式,但确实适用于简单表达式。
例如
import numpy as np
# define 3 numpy arrays
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
B = np.array([[0,0.1,-4],[19,0.67,6],[-1,99,5]])
C = np.array([[1,2,-1],[4,5,6],[-2,2,0]])
# sympy expression, compute iteratively
Z1 = np.dot(A, A + B)
Z1 = np.dot(Z1, np.linalg.inv(C))
Z1 = np.dot(Z1, A.T + B.T)
print(Z1)
>>>[[ 143.22088889 -672.5076 -100.24 ]
[-239.47685185 4558.45416667 3597.5 ]
[ 65.1457037 -94.81393333 519.56 ]]
# desired expression
p1 = np.dot(A, A)
p1 = np.dot(p1, np.linalg.inv(C))
p1 = np.dot(p1, A.T)
p2 = np.dot(A, B)
p2 = np.dot(p2, np.linalg.inv(C))
p2 = np.dot(p2, A.T)
p3 = np.dot(A, A)
p3 = np.dot(p3, np.linalg.inv(C))
p3 = np.dot(p3, B.T)
p4 = np.dot(A, B)
p4 = np.dot(p4, np.linalg.inv(C))
p4 = np.dot(p4, B.T)
Z2 = p1 + p2 + p3 + p4
print(Z2)
>>>[[ 143.22088889 -672.5076 -100.24 ]
[-239.47685185 4558.45416667 3597.5 ]
[ 65.1457037 -94.81393333 519.56 ]]
np.isclose(Z1,Z2)
>>>[[ True, True, True],
[ True, True, True],
[ True, True, True]
因此,鉴于上述矩阵,我们可以看到sympy表达式Z1
和所需表达式Z2
实际上是相同的。