Не удалось отобразить шаги расчета с помощью sympy и markdown

Вопрос

Я хочу показать шаги расчета (например, в учебнике) в файле уценки, который создается кодом 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. Какие-нибудь подсказки обернуть симпозиумное выражение, чтобы код Python был более лаконичным?

Благодарность


person oyster    schedule 18.12.2018    source источник


Ответы (1)


Теперь я написал https://github.com/retsyo/expand_expression, чтобы частично ответить на сообщение. Но я все еще ищу более распространенный метод, не предоставляющий пользователю все функции

Я выпустил его, потому что он может помочь другим. Вот пример:

Если вы определили функцию, вы можете использовать ее как

T1 = T_Rotate('pi/6 + pi/2', useRad=True)
fOut.write(latexExpression('T1'))

Это просто? Я так думаю.

person oyster    schedule 21.12.2018