2.69(-6. +1)e-155若对象的传递函数为G(s)=(20s +1)(5.s +1) 其中采样周期T =1s 1.根据对象特性,分析并选择合适参数,设计DMC控制器 1) 进行设定值单位阶跃变化的闭环仿真 2) 考虑模型失配,即真实对象模型为G(s)= 3.69(-6s +1)e-2.55 (25s +1)7s +1)
时间: 2024-03-16 13:45:02 浏览: 82
根据所给的传递函数G(s),可以计算出对象的离散化传递函数G(z),采用零阶保持器(ZOH)方法离散化:
G(z) = (0.0000002067 z + 0.9999997933) / ((0.00333333 z + 1) (0.2 z + 1))
根据对象特性,选择DMC控制器的参数:
1. 控制时间步长N和控制预测步长Nu:根据对象的惯性时间常数和采样周期,可以选择N=10和Nu=3。
2. 权重矩阵Q和R:为了使控制器更加关注控制误差,可以将Q的对角线元素设置为较大的值,例如Q=diag([10, 10]);R的值可以根据控制器的输出幅值确定,一般可以设置为1。
3. 衰减因子λ:可以根据控制器的动态响应和稳态误差进行调整,一般可以选择λ=0.9。
下面是进行设定值单位阶跃变化的闭环仿真的示例代码:
```
% DMC控制器参数设置
N = 10; % 控制时间步长
Nu = 3; % 控制预测步长
lambda = 0.9; % 衰减因子
Q = diag([10, 10]); % 误差惩罚权重
R = 1; % 控制量惩罚权重
% 模型参数
B = [0.0000002067, 0.9999997933];
A = [1, -1.939086e+01, 1.001234e+00, -8.117505e-03];
% 设定值
r = ones(100, 1);
% 初始状态
x0 = [0, 0];
% 控制器初始化
y = zeros(1, Nu);
u = zeros(1, Nu);
% 闭环仿真
for k = 1:length(r)
% 状态更新
x = filter(B, A, x0) + B*u(1);
% 计算控制器输出
for i = 1:Nu
if (k+i-1 <= length(r))
y(i) = r(k+i-1) - filter(B, A, x0, 'v') - B*u(1);
else
y(i) = r(end) - filter(B, A, x0, 'v') - B*u(1);
end
end
u = inv(B'*B+lambda*eye(Nu))*B'*y';
% 状态更新
x0 = [x(2), x(3), B*u(1)];
% 记录结果
y_data(k) = x(1);
u_data(k) = u(1);
end
% 绘制结果
figure;
subplot(2,1,1);
plot(y_data);
title('输出响应');
subplot(2,1,2);
plot(u_data);
title('控制量');
```
考虑模型失配的情况下,可以将原有的模型参数A和B替换为真实对象的模型参数A_hat和B_hat,同时可以加入模型失配的惩罚项,例如将Q的对角线元素设置为[100, 1000],以降低模型误差对控制器的影响。下面是考虑模型失配的示例代码:
```
% DMC控制器参数设置
N = 10; % 控制时间步长
Nu = 3; % 控制预测步长
lambda = 0.9; % 衰减因子
Q = diag([100, 1000]); % 误差惩罚权重
R = 1; % 控制量惩罚权重
% 模型参数
B_hat = [3.69e-6, -2.55e-2, 1];
A_hat = [1, -1.776413e+01, 9.460030e-01, -2.620737e-02, 3.345373e-04, -1.941031e-06, 4.946736e-09];
% 设定值
r = ones(100, 1);
% 初始状态
x0 = [0, 0, 0, 0, 0, 0];
% 控制器初始化
y = zeros(1, Nu);
u = zeros(1, Nu);
% 闭环仿真
for k = 1:length(r)
% 状态更新
x = filter(B_hat, A_hat, x0);
% 计算控制器输出
for i = 1:Nu
if (k+i-1 <= length(r))
y(i) = r(k+i-1) - filter(B_hat, A_hat, x0, 'v');
else
y(i) = r(end) - filter(B_hat, A_hat, x0, 'v');
end
end
u = inv(B_hat'*B_hat+lambda*diag(Q))*B_hat'*y';
% 状态更新
x0 = [x(2:end), B_hat*u(1)];
% 修正模型参数
A_hat = A_hat + 0.01*(x - x0')*[1, -x0(1:end-1)]';
B_hat = B_hat + 0.01*(u(1) - u(2))*[1, -x0(1)]';
% 记录结果
y_data(k) = x(1);
u_data(k) = u(1);
end
% 绘制结果
figure;
subplot(2,1,1);
plot(y_data);
title('输出响应');
subplot(2,1,2);
plot(u_data);
title('控制量');
```
在模型失配的情况下,通过修正模型参数,可以使控制器适应模型失配的情况,实现更好的控制效果。
阅读全文