Не удалось отобразить шаги расчета с sympy и уценкой - PullRequest
0 голосов
/ 18 декабря 2018

Вопрос

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

спасибо

1 Ответ

0 голосов
/ 21 декабря 2018

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

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

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

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

Легко ли это?Я так думаю.

...