与 sympy 匹配系数

Matching coefficients with sympy

我正尝试在 sympy 中解决教科书中的问题,但 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])

此 returns 一个空列表。然而,教科书提供了以下解决方案:

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

returns

[0, 0, 0]

我可以将其按摩成 sympy 可以解决的形式吗?我在做什么wong?

编辑:这找到了正确的解决方案,但需要我这边考虑太多才能对方程式排序:

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

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

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