You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:35:19