匹配系数与sympy

时间:2016-02-23 05:45:08

标签: sympy

我试图通过同情的教科书来解决问题,但是同情者没有找到一个看似有效的解决方案。值得关注的是,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_1tau_2Kphi

我试图通过匹配系数来解决这个问题:

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()

1 个答案:

答案 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)       τ₁ + τ₂              ⎭⎦

看起来像是教科书的解决方案。