我正在try 用Python语言或MatLab语言来模拟简单的具有PID控制器的闭环系统.在这两种情况下,我都遇到了使用拉普拉斯逆变换计算系统的时域响应的问题.
为了更好地说明这个问题,我下面的图片上的名字:
根据系统的传递函数,结果要么只在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)),我什么也没有,因为拉普拉斯逆变换从不计算.
以下是用Python编写的相同代码:
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)
Python代码陷入无穷无尽的循环,永远找不到y_t_闭合_循环的解决方案.
另外,由于某些原因,我的Windows机器上不能运行matlab代码.它只能在Linux上运行.
我是不是遗漏了什么?有没有什么方法可以确保计算出拉普拉斯逆变换?转会基金对我来说似乎很正常,但我有一种感觉,有些不对劲.
任何帮助都非常感谢!!
编辑: 我还try 在Python中使用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永远不会执行.