将表达式重新排列为传递函数的标准形式

问题描述 投票:0回答:2

我是 Python/Sympy 的新手,我希望它能让我更轻松地理解控制系统主题。对我来说,一个常见的要求是根据我自己的推导交叉检查文献中提出的方程。当涉及到传递函数时,分母通常按照左侧的高阶 s 进行排序,向右则阶数递减。最高阶 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())

其产量:

现在,我并不是真的期望 simple 知道我想要显示哪种格式的表达式,但我希望有一个现有的函数或一组函数可以帮助我按照我想要的方式排列它。有吗

进一步更新:

经过一些操作,我成功地隔离了最高功率,并除以系数顶部和底部,留下没有系数的最高阶项,正如我想要的那样。无论如何,它都不是完美的。一种改进是让每个项都是独立的,并且像大多数多项式表示一样从高到低排序。我注意到,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))
function format sympy transfer polynomials
2个回答
2
投票

也许这就是你想要的:

In [30]: H.cancel().collect(s)
Out[30]: 
           N⋅k₀⋅k_d⋅s⋅τ₂ + N⋅k₀⋅k_d          
─────────────────────────────────────────────
          2                                  
k₀⋅k_d + s ⋅(N⋅τ₁ + N⋅τ₂) + s⋅(N + k₀⋅k_d⋅τ₂)

0
投票

Z 域示例(未提出问题,但相关)

在 z 域中,通常将系数收集为 z 的负幂,而不是 s 的正幂(通常是 s 域)。例如:

b0, b1, b2, a0, a1, a2, z = symbols('b0, b1, b2, a0, a1, a2, z')
hz = ((b0 + b1 * z**(-1) + b2 * z**(-2)) / (a0 + a1 * z**(-1) + a2 * z**(-2)))
hz

所需表格!

任何操作都会使表达脱离所需的形式,例如简化。

hz_s = hz.simplify()
hz_s

cancel().collect(z) 不起作用!什么都不做。

必须手动完成☹️。

hz_n, hz_d = fraction(hz_s)
(hz_n / z**2).simplify() / (hz_d / z**2).simplify()

© www.soinside.com 2019 - 2024. All rights reserved.