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