Вопрос
Я хочу показать шаги вычисления (например, в учебнике) в файле уценки, который создается кодом Python.вот что мне нужно в исходном коде Python
from sympy import *
angle = 60 # this will be changed to created different markdown files
theta = symbols('ss')
x = symbols('xx')
a = Matrix([[cos(theta), -sin(theta), 0], [sin(theta), cos(theta), 0], [0, 0, 1]])
b = Matrix([[x, 0, 0], [0, x, 1], [0, 0, 0]])
print(
'$$',
latex(a), latex(b), '=', # step 1
latex(a).replace('ss', latex(rad(angle))), latex(b).replace('xx', '2'), '=', # step 2
latex(a.subs('ss', rad(60))), latex(b.subs('xx', '2')), '=', # step 3
latex((a*b).subs({'ss': rad(60), 'xx':2}).evalf(2)), # step 4
'$$'
)
вы можете обнаружить, что step 1
перечисляет общую матрицу, step 2
заменяет элемент матрицы на заданное значение, step 3
вычисляет / упрощает матрицуи step 4
оценивает матричные элементы в плавающей форме.
Слишком много вызовов latex
, что делает код слишком длинным и трудным для чтения.
Первая попытка
Я пишу
from sympy import *
class T_Rotate(object):
def __init__(self, theta):
self.eq = Matrix([[cos(theta), -sin(theta), 0], [sin(theta), cos(theta), 0], [0, 0, 1]])
self.str = latex(self.eq)
def __mul__(self, mat):
return self.eq * mat
def __rmul__(self, mat):
return mat * self.eq
a = T_Rotate(60)
b = Matrix([[1, 0, 0], [0, 1, 1], [0, 0, 0]])
print('$$a*b = %s * %s = %s$$' % (a.str, latex(b), latex(a*b)))
print('$$b * a = %s * %s = %s$$' % (latex(b), a.str, latex(b*a)))
, но выше a * b
- неправильный ответ, представляющий собой матрицу 3 * 3, но все элементы которой состоят из матрицы 3 * 3!
, так что жепроблема?
Дальнейшие размышления
В случае, если вышеупомянутое исправлено, все еще есть вызов функции latex
.Какие-нибудь подсказки, чтобы обернуть выражение sympy так, чтобы код на python был более кратким?
спасибо