Python SymPy 1.3 упрощает вычисление символьной матрицы - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть следующий код для вычисления символьной матрицы

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

Могу я вас спросить, ребята, как это сделать?Большое спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

В настоящее время нет возможности расширить матричные операции в sympy.Выражение из приведенного выше результата - единственный способ просмотреть результат. Функции расширения, доступные в 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

, который явно не является 't в той же форме, что и выражение sympy для Z.

Даже если вы просто протестируете желаемый результат по сравнению с выводом 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

Мы не можем определить матрицы 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 фактически совпадает с приведенными выше матрицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...