若对象的传递函数为G(s)= 2.69*(-6s +1)(e^-1.5s) /(20s +1)(5s +1) 其中采样周期T =1s 1.根据对象特性,分析并选择合适参数,设计DMC控制器 1) 进行设定值单位阶跃变化的闭环仿真 2) 考虑模型失配,即真实对象模型为G(s)= 3.69(-6s +1)*(e^-2.5s) /(25s +1)(7s +1),在matlab里面的代码
时间: 2023-11-03 22:04:20 浏览: 136
以下是针对所给对象模型的DMC控制器的MATLAB代码示例,包括设定值单位阶跃变化的闭环仿真和模型失配的情况:
```matlab
%% DMC控制器参数设置
N = 10; % 控制器的预测步数
M = 2; % 决策矩阵的行数
Delta = 1; % Delta参数
lambda = 1e-5; % 正则化参数
%% 对象模型参数
b = [0.0038 0.0072]; % 分子系数
a = [1 -1.8944 0.8944]; % 分母系数
Ts = 1; % 采样周期
%% 初始化控制器
U = zeros(N, 1); % 控制器输出
Y = zeros(N, 1); % 预测输出
M_matrix = zeros(N, M); % 决策矩阵
W = zeros(M, N); % 权重矩阵
% 构造决策矩阵
for i = 1:N
for j = 1:M
if (i-j+1) > 0
M_matrix(i,j) = U(i-j+1);
end
end
end
% 计算权重矩阵
W = inv(M_matrix'*M_matrix + lambda*eye(M)) * M_matrix';
%% 设定值单位阶跃变化的闭环仿真
T = 200; % 控制时间
r = ones(T, 1); % 设定值
y = zeros(T, 1); % 输出值
for k = 1:T
% 计算当前控制误差
e = r(k) - y(k);
% 计算预测输出
for i = 1:N
if (k+i-1) <= T
Y(i) = b(1)*U(i) + b(2)*U(i-1) - a(2)*Y(i-1) - a(3)*Y(i-2);
end
end
% 计算控制器输出
DU = W * (r(k) - Y);
U(1) = U(1) + Delta * DU(1);
% 更新控制器输出
for i = 2:N
U(i) = U(i) + Delta * DU(i) + U(i-1);
end
% 通过对象模型计算输出
y(k) = b(1)*U(1) + b(2)*U(0) - a(2)*y(k-1) - a(3)*y(k-2);
end
% 显示仿真结果
t = 1:T;
figure;
plot(t, r, 'r--', t, y, 'b');
xlabel('时间');
ylabel('输出');
legend('设定值', '输出值');
%% 模型失配的情况
% 改变对象模型参数
b = [0.0046 0.0088];
a = [1 -2.0764 1.0764];
% 重新初始化控制器
U = zeros(N, 1);
Y = zeros(N, 1);
M_matrix = zeros(N, M);
W = zeros(M, N);
% 重新构造决策矩阵和计算权重矩阵
for i = 1:N
for j = 1:M
if (i-j+1) > 0
M_matrix(i,j) = U(i-j+1);
end
end
end
W = inv(M_matrix'*M_matrix + lambda*eye(M)) * M_matrix';
% 重新进行仿真并显示结果
y_mismatch = zeros(T, 1);
for k = 1:T
% 计算当前控制误差
e = r(k) - y_mismatch(k);
% 计算预测输出
for i = 1:N
if (k+i-1) <= T
Y(i) = b(1)*U(i) + b(2)*U(i-1) - a(2)*Y(i-1) - a(3)*Y(i-2);
end
end
% 计算控制器输出
DU = W * (r(k) - Y);
U(1) = U(1) + Delta * DU(1);
% 更新控制器输出
for i = 2:N
U(i) = U(i) + Delta * DU(i) + U(i-1);
end
% 通过对象模型计算输出
y_mismatch(k) = b(1)*U(1) + b(2)*U(0) - a(2)*y_mismatch(k-1) - a(3)*y_mismatch(k-2);
end
% 显示仿真结果
figure;
plot(t, r, 'r--', t, y, 'b', t, y_mismatch, 'g');
xlabel('时间');
ylabel('输出');
legend('设定值', '原始模型输出', '失配模型输出');
```
其中,仿真结果通过绘制设定值和输出值的时间序列图来展示,模型失配的情况通过改变对象模型参数来模拟,并比较原始模型和失配模型的输出结果。需要注意的是,实际应用中需要根据具体问题进行更加细致的参数设置和控制器设计。
阅读全文