Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SymPy 1.3简化符号矩阵计算_Python_Sympy - Fatal编程技术网

Python SymPy 1.3简化符号矩阵计算

Python SymPy 1.3简化符号矩阵计算,python,sympy,Python,Sympy,我有以下用于符号矩阵计算的代码 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

我有以下用于符号矩阵计算的代码

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

我能问你们怎么做吗?非常感谢

目前,在Symphy中无法扩展矩阵运算。以上结果的表达式是查看结果的唯一方法。包括
expand()
expand\u trig()
expand\u power\u exp()
expand\u power\u base()
expand\u log()
expand\u func()
超扩展()
,这些似乎都不适用于矩阵表达式

如果我们想要评估您所需的输出,以与
Z
sympy输出进行比较,那么
simplify
函数似乎也不起作用

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表达式的形式不同

即使您只是根据Symphy的输出测试所需的输出,您仍然会得到错误的结果

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并将这两个表达式与已知的矩阵值进行比较。这非常复杂,不适用于非常复杂的表达式,但适用于简单表达式

e、 g


因此,我们可以看到,给定上述矩阵,symphy表达式
Z1
和您想要的表达式
Z2
实际上是相同的。

有人能帮忙吗?我想symphy没有办法做到这一点。它在MatrixSymbol类中没有这样的函数。
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]