我试图通过同情的教科书来解决问题,但是同情者没有找到一个看似有效的解决方案。值得关注的是,PID控制器的设计使用直接合成,具有二阶加上死区时间模型。
整个问题可以简化为查找K_C,tau_I和tau_D
K_C*(s**2*tau_D*tau_I + s*tau_I + 1)/(s*tau_I)
= (s**2*tau_1*tau_2 + s*tau_1 + s*tau_2 + 1)/(K*s*(-phi + tau_c))
指定的tau_1
,tau_2
,K
和phi
。
我试图通过匹配系数来解决这个问题:
import sympy
s, tau_c, tau_1, tau_2, phi, K = sympy.symbols('s, tau_c, tau_1, tau_2, phi, K')
target = (s**2*tau_1*tau_2 + s*tau_1 + s*tau_2 + 1)/(K*s*(-phi + tau_c))
K_C, tau_I, tau_D = sympy.symbols('K_C, tau_I, tau_D', real=True)
PID = K_C*(1 + 1/(tau_I*s) + tau_D*s)
eq = (target - PID).together()
eq *= sympy.denom(eq).simplify()
eq = sympy.poly(eq, s)
sympy.solve(eq.coeffs(), [K_C, tau_I, tau_D])
这将返回一个空列表。但是,教科书提供了以下解决方案:
booksolution = {K_C: 1/K*(tau_1 + tau_2)/(tau_c - phi),
tau_I: tau_1 + tau_2,a
tau_D: tau_1*tau_2/(tau_1 + tau_2)}
这似乎满足我想要解决的等式:
[c.subs(booksolution).simplify() for c in eq.coeffs()]
返回
[0, 0, 0]
我可以将其按摩成一种可以解决的形式吗?我在做什么?
编辑:这会找到正确的解决方案,但需要我太多想一想订购公式:
eqs = eq.coeffs()
solution = {}
solution[K_C] = sympy.solve(eqs[1], K_C)[0]
solution[tau_D] = sympy.solve(eqs[0], tau_D)[0].subs(solution)
solution[tau_I] = sympy.solve(eqs[2], tau_I)[0].subs(solution).simplify()
答案 0 :(得分:1)
在SymPy 1.0中(即将发布)我得到了这个答案
In [25]: sympy.solve(eq.coeffs(), [K_C, tau_I, tau_D])
Out[25]:
⎡ ⎧ -(τ₁ + τ₂) τ₁⋅τ₂ ⎫⎤
⎢{K_C: 0, τ_I: 0}, ⎨K_C: ───────────, τ_D: ───────, τ_I: τ₁ + τ₂⎬⎥
⎣ ⎩ K⋅(φ - τ_c) τ₁ + τ₂ ⎭⎦
看起来像是教科书的解决方案。