Python SymPy 1.3 简化符号矩阵计算

标签 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 * C^-1 * A^T + A * B C^-1 * A^T + A * A C^-1 * B^T + A * B C^-1 * B^T

请问各位大佬,怎么办?非常感谢

最佳答案

目前在sympy中还没有扩展矩阵运算的方法。上面的结果表达式是查看结果的唯一方法。 Expansion functions available in sympy包括 expand()expand_trig()expand_power_exp()expand_power_base()expand_log( )expand_func()hyperexpand(),它们似乎都不适用于您的矩阵表达式。

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

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 的输出来测试您想要的输出,您仍然会得到错误的结果

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

我们不能用每个索引的已知值定义矩阵 ABC,然后计算上面的表达式以比较它们输出是因为 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 实际上是相同的,给定上面的矩阵。

关于Python SymPy 1.3 简化符号矩阵计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54678241/

相关文章:

python - 提高性能 - 符号函数应用于 numpy 数组的每一行

python-3.x - 如何用 sympy 声明自然符号?

python - asyncio.TimeoutError 永远不会引发

python - 为什么 SymPy 的积分有时会产生非常长的反导数?

python - 使用 GUI 从 Python 代码运行 dask 调度程序

python - 计算两个数据帧之间的最小距离

python - 将 Matplotlib 和 Sympy 的图放在一起

python - 通过 SymPy 求多元函数的微分并在一点求值

python - scipy.io.wavfile 给出 "WavFileWarning: chunk not understood"错误

python - 一种使用 numpy 的热编码