Python/MATLAB中PID闭环系统拉普拉斯逆变换计算问题求助
PID闭环系统拉普拉斯逆变换仿真问题
我尝试在Python或MATLAB中仿真带PID控制器的简单闭环系统,但通过拉普拉斯逆变换计算系统时域响应时遇到问题。根据被控对象传递函数(G_s)的不同,结果要么仅能在MATLAB中计算,要么完全无法计算。
MATLAB仿真情况
仿真代码
syms s t k_p T_i T_d D_d v real; % controller transfer function C_s = k_p * (1 + 1 / (T_i * s) + (T_d * s) / (D_d * s + 1)); % plant transfer function G_s = 1 / ((s + 1) * (s + 2)); % closed loop transfer function W_s = C_s * G_s / (1 + C_s * G_s); % input signal R_t = 4 * heaviside(t - 2) * (1 - heaviside(t - 5)) + ... 6 * heaviside(t - 5) * (1 - heaviside(t - 6)) + ... 2 * heaviside(t - 6); R_s = laplace(R_t, t, s, noconds=True) % PID-controller system response C_res_s = C_s * R_s; w_t = ilaplace(C_res_s , s, t) % Closed loop system response Y_s = W_s * R_s y_t_closed_loop = ilaplace(Y_s, s, t) % Parameters k_p_val = 15; T_i_val = 5; T_d_val = 2; D_d_val = 0.1; time = linspace(0, 10, 1000); % Convert symbolic expressions to MATLAB functions w_t_param = matlabFunction(w_t, 'Vars', {t, k_p, T_i, T_d, D_d}); matlabFunction(y_t_closed_loop, 'File', 'y_t_closed_loop_func', 'Vars', {t, k_p, T_i, T_d, D_d}); w_t_param_closed_loop = str2func('y_t_closed_loop_func'); R_t_lam = matlabFunction(R_t, 'Vars', {t}); % Calculate system responses solution = zeros(size(time)); solution_closed_loop = zeros(size(time)); for i = 1:length(time) solution(i) = w_t_param(time(i), k_p_val, T_i_val, T_d_val, D_d_val); solution_closed_loop(i) = w_t_param_closed_loop(time(i), k_p_val, T_i_val, T_d_val, D_d_val); end
不同被控对象的仿真结果
- 当
G_s = 1 / ((s + 1) * (s + 2))时,结果正常,时域响应曲线符合预期 - 当
G_s = 1 / ((s + 1))时,结果异常,时域响应曲线出现不符合预期的错误 - 当
G_s = 1 / ((s + 1) * (s + 2) * (s + 3))时,拉普拉斯逆变换始终无法完成计算
系统限制
上述MATLAB代码仅能在Linux系统运行,Windows系统无法正常执行。
Python仿真情况
尝试代码1(sympy直接计算)
s, t, k_p, T_i, T_d, D_d, v = symbols("s t k_p T_i T_d D_d v", real=True) #controller transfer function C_s = k_p * (1 + 1 / (T_i * s) + (T_d * s) / (D_d * s + 1)) #plant transfer function G_s = 1 / ((s + 1) * (s + 2)) #closed loop transfer function W_s = C_s * G_s / (1 + C_s * G_s) #input signal R_t = 4 * Heaviside(t - 2) * (1 - Heaviside(t - 5)) + 6 * Heaviside(t - 5) * (1 - Heaviside(t - 6)) + 2 * Heaviside(t - 6) R_s = laplace_transform(R_t, t, s, noconds=True) # PID-controller system response C_res_s = C_s * R_s w_t = inverse_laplace_transform(C_res_s , s, t) # Closed loop system response Y_s = W_s * R_s y_t_closed_loop = inverse_laplace_transform(Y_s, s, t)
这段代码陷入无限循环,始终无法得到y_t_closed_loop的解。
尝试代码2(sympy+control库)
import sympy import numpy import matplotlib.pyplot as plt from tbcontrol.loops import feedback s = sympy.Symbol('s') t = sympy.Symbol('t', positive=True) tau = sympy.Symbol('tau', positive=True) K_p = sympy.Symbol('K_p') T_i = sympy.Symbol('T_i') T_d = sympy.Symbol('T_d') D_d = sympy.Symbol('D_d') G_p = 1/(s+1) G_c = K_p * (1 + 1 / (T_i * s) + (T_d * s) / (D_d * s + 1)) G_OL = G_p*G_c G_CL = feedback(G_OL, 1).cancel() general_timeresponse = sympy.inverse_laplace_transform(sympy.simplify(G_CL/s), s, t)
这段代码同样无法完成general_timeresponse的计算。
求助
请问我是否遗漏了什么?有没有办法确保拉普拉斯逆变换能完成计算?
内容的提问来源于stack exchange,提问作者zorka5
相关产品推荐
相关产品推荐

