Преобразование выражения в стандартную форму для передаточной функцииPython

Программы на Python
Ответить
Anonymous
 Преобразование выражения в стандартную форму для передаточной функции

Сообщение Anonymous »

Я новичок в Python/Sympy и надеюсь, что это облегчит понимание тем, связанных с системами управления. Общим требованием для меня является перекрестная проверка уравнений, разработанных в литературе, с моими собственными выводами. Когда дело доходит до передаточных функций, знаменатель обычно упорядочивается так, чтобы более высокие порядки s находились слева, а порядок уменьшения перемещался вправо. Член высшего порядка имеет коэффициент единицы.
Вот пример (взято отсюда):
Изображение

Я разработал свою собственную передаточную функцию с использованием 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»