已知被控对象为G(s)=1/(10s+1)e^(-0.5s),假设系统给定值为阶跃值r=30,采样时间为0.5s,系统的初始条件值r(0)=0,用常规的模糊控制器控制,求Matlab代码。
时间: 2024-03-20 18:45:33 浏览: 151
为了控制该系统,我们需要设计一个模糊控制器,包括模糊化、模糊推理和去模糊化三个步骤。
首先,我们需要将输入的实际值和期望值进行模糊化,将它们转化为模糊变量。这里可以采用三角隶属度函数进行模糊化。
```matlab
% 输入的实际值和期望值
actual_value = 0;
expected_value = 30;
% 模糊化
actual_fuzzy = trimf(actual_value, [-10, 0, 10]);
expected_fuzzy = trimf(expected_value, [20, 25, 30]);
```
接下来,我们需要进行模糊推理,根据输入的实际值和期望值,输出一组模糊化的控制信号。这里可以采用模糊规则库进行推理。
```matlab
% 模糊规则库
rule_base = [
1, 1, 1, 2, 2;
1, 1, 2, 2, 3;
1, 2, 2, 3, 3;
2, 2, 3, 3, 4;
2, 3, 3, 4, 4;
];
% 模糊推理
output_fuzzy = zeros(1, 5);
for i = 1:5
output_fuzzy(i) = max(min(actual_fuzzy(rule_base(:, i)), expected_fuzzy), [], 'all');
end
```
最后,我们需要将模糊化的控制信号进行去模糊化,得到实际的控制信号。这里可以采用质心法进行去模糊化。
```matlab
% 去模糊化
output_value = sum(output_fuzzy .* [5, 15, 25, 35, 45]) / sum(output_fuzzy);
```
将这些步骤组合起来,可以得到完整的控制代码。
```matlab
% 输入的实际值和期望值
actual_value = 0;
expected_value = 30;
% 模糊化
actual_fuzzy = trimf(actual_value, [-10, 0, 10]);
expected_fuzzy = trimf(expected_value, [20, 25, 30]);
% 模糊规则库
rule_base = [
1, 1, 1, 2, 2;
1, 1, 2, 2, 3;
1, 2, 2, 3, 3;
2, 2, 3, 3, 4;
2, 3, 3, 4, 4;
];
% 模糊推理
output_fuzzy = zeros(1, 5);
for i = 1:5
output_fuzzy(i) = max(min(actual_fuzzy(rule_base(:, i)), expected_fuzzy), [], 'all');
end
% 去模糊化
output_value = sum(output_fuzzy .* [5, 15, 25, 35, 45]) / sum(output_fuzzy);
```
需要注意的是,这里只针对单个采样周期进行控制,如果需要对整个系统进行控制,需要在控制循环中重复执行上述步骤。对于该系统,还需要进行离散化处理,可以采用ZOH(Zero-Order Hold)方法对连续信号进行采样和保持,得到离散信号。具体实现可以参考以下代码。
```matlab
% 采样时间和采样次数
Ts = 0.5;
N = 100;
% 离散时间和离散响应
t = 0:Ts:(N-1)*Ts;
Gd = c2d(tf([1], [10, 1], 'InputDelay', 0.5), Ts, 'zoh');
[y, t] = step(30*Gd, t);
% 模糊控制
r = zeros(1, N);
for k = 1:N
actual_value = y(k);
expected_value = r(k);
actual_fuzzy = trimf(actual_value, [-10, 0, 10]);
expected_fuzzy = trimf(expected_value, [20, 25, 30]);
rule_base = [
1, 1, 1, 2, 2;
1, 1, 2, 2, 3;
1, 2, 2, 3, 3;
2, 2, 3, 3, 4;
2, 3, 3, 4, 4;
];
output_fuzzy = zeros(1, 5);
for i = 1:5
output_fuzzy(i) = max(min(actual_fuzzy(rule_base(:, i)), expected_fuzzy), [], 'all');
end
output_value = sum(output_fuzzy .* [5, 15, 25, 35, 45]) / sum(output_fuzzy);
r(k+1) = output_value;
end
% 绘制响应曲线
plot(t, y, 'r-', t, r(1:N), 'b--');
xlabel('Time (s)');
ylabel('Response');
legend('Actual', 'Expected');
```
这样,就可以得到模糊控制下的系统响应曲线了。
阅读全文