SymPy, упрощение / подстановка с использованием известных шаблонов или подвыражений

У меня есть такое выражение:

from sympy import pi, sin, cos, var, simplify
var('j,u,v,w,vt,wt,a2,t,phi')

u0 = v*a2*sin(pi*j/2 + pi*j*t*phi**(-1)/2) + pi*vt*a2*cos(pi*j/2 + pi*j*t*phi**(-1)/2)*j*phi**(-1)/2 + pi*w*a2*cos(pi*j/2 + pi*j*t*phi**(-1)/2)*j*phi**(-1)

Что можно упростить:

print simplify(u0)
#a2*(pi*j*vt*cos(pi*j*(phi + t)/(2*phi)) + 2*pi*j*w*cos(pi*j*(phi + t)/(2*phi)) + 2*phi*v*sin(pi*j*(phi + t)/(2*phi)))/(2*phi)

Учитывая подвыражения:

bj = pi*j*(phi + t)/(2*phi)
cj = j*pi/(2*phi)

В настоящее время я вручную подставляю bj и cj в упрощенное выражение u0, чтобы получить:

u0 = a2*(v*sin(bj) + cj*vt*cos(bj) + 2*cj*w*cos(bj))

Можно ли использовать SymPy для этого, избегая ручной подстановки?


person Saullo G. P. Castro    schedule 02.08.2013    source источник


Ответы (2)


Я думаю, вам не хватает того, что subs заменит произвольные выражения, а не только символы

>>> print simplify(u0).subs({pi*j*(phi + t)/(2*phi): bj, j*pi/(2*phi): cj})
a2*(pi*j*vt*cos(bj) + 2*pi*j*w*cos(bj) + 2*phi*v*sin(bj))/(2*phi)

(Я использовал simplify, потому что это приводит к pi*j*(phi + t)/(2*phi) вместо pi*j/2 + pi*j*t/(2*phi), но в противном случае это не требуется)

Прочтите http://docs.sympy.org/0.7.3/tutorial/basic_operations.html#substitution для получения дополнительной информации о замене и замене. Если вы хотите выполнить более сложную замену, обратите внимание на _ 6_.

person asmeurer    schedule 02.08.2013
comment
это великолепно! Спасибо! - person Saullo G. P. Castro; 02.08.2013

Вы можете найти общие подвыражения с помощью подпрограммы cse.

person Krastanov    schedule 02.08.2013
comment
можно ли передать cse подвыражения, которые он должен искать? - person Saullo G. P. Castro; 02.08.2013
comment
Смысл cse в том, чтобы найти для вас выражения. Если вы знаете общие подвыражения, зачем вам их искать? С другой стороны, если ваш вопрос касается подстановки выражений, просто используйте subs или любую из других подпрограмм, упомянутых в subs docstring. Ознакомьтесь с учебным пособием по sympy docs.sympy.org/0.7.3/tutorial/index .html - person Krastanov; 02.08.2013
comment
Мне приходится искать их, потому что иногда они не видны явно, иначе я мог бы просто заменить их в текстовом редакторе или подобном. См., Например, cj, его подвыражение находится внутри u0, но не разделено явно ... - person Saullo G. P. Castro; 02.08.2013
comment
Так что просто используйте cse. Я не понимаю, делает или не делает то, что вы хотите другого. Кроме того, использование текстового редактора для символьных манипуляций звучит как очень плохая идея ... - person asmeurer; 02.08.2013