Вот пример (взято отсюда):

Я разработал свою собственную передаточную функцию с использованием Sympy и хотел бы перестроить ее в только что описанная мода.
import sympy as sp
from sympy import simplify
from IPython.display import display
s, tau_1, tau_2 = sp.symbols('s,tau_1,tau_2')
F = (1+s*tau_2)/(1+s*(tau_1+tau_2));
k_0, k_d, N = sp.symbols('k_0,k_d,N')
H = (k_0*k_d*F)/(s+((k_0*k_d*F/N)))
display(H.simplify())
Что дает:
Я не ожидаю, что с помощью упрощения можно будет узнать, в каком формате я хочу отображать выражение, но я надеюсь, что существует существующая функция или набор функций, которые поможет мне устроить это так, как я хочу. Есть ли?
ДАЛЬНЕЙШЕЕ ОБНОВЛЕНИЕ:
После небольших манипуляций мне удалось изолировать высшую мощность и разделите на верхние и нижние коэффициенты, чтобы оставить член высшего порядка без коэффициента, как я и хотел. Это не идеально ни в каком смысле. Улучшением было бы, чтобы каждый термин был отдельным и располагался в порядке от наибольшего к наименьшему, как в большинстве полиномиальных представлений. Я заметил, что метод Collect() не упорядочивает термины мощности так, как можно было бы ожидать. Что это такое!?
import sympy as sp
from sympy import simplify
from sympy import poly
from sympy import degree
from IPython.display import display
s, tau_1, tau_2 = sp.symbols('s,tau_1,tau_2')
F = (1+s*tau_2)/(1+s*(tau_1+tau_2));
display(F)
k_0, k_d, N = sp.symbols('k_0,k_d,N')
H = (k_0*k_d*F)/(s+((k_0*k_d*F/N)))
display(H)
def normTF(expr):
H_c = expr.ratsimp().collect(s)
n,d=sp.fraction(H_c)
collected = sp.Poly(d, s).as_expr()
degree = sp.degree(collected, gen=s)
terms = dict(i.as_independent(s)[::-1] for i in sp.Add.make_args(collected))
sn=(n/terms[s**degree]).ratsimp().collect(s)
sd=(d/terms[s**degree]).ratsimp().collect(s)
return sn/sd
display(normTF(H))
Подробнее здесь: https://stackoverflow.com/questions/629 ... r-function
Мобильная версия