与 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_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])
此 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) τ₁ + τ₂ ⎭⎦
这看起来像你的教科书的解决方案。
我正尝试在 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_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])
此 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) τ₁ + τ₂ ⎭⎦
这看起来像你的教科书的解决方案。