预测函数控制(Predictive Functional Control, PFC)是一种基于函数逼近的预测控制方法,通过基函数展开描述控制输入,避免在线优化,计算效率高。
一、PFC 算法核心原理
1.1 控制结构
参考轨迹 → PFC控制器 → 被控对象 → 输出
↑ ↓
└── 反馈校正 ───┘
1.2 关键思想
- 控制输入参数化 :用基函数展开表示控制输入
u(t)=∑i=1mθiϕi(t)u(t) = \sum_{i=1}^{m} \theta_i \phi_i(t)u(t)=i=1∑mθiϕi(t) - 预测模型:基于系统模型预测未来输出
- 参考轨迹:指数趋近设定值
- 参数优化:最小化预测误差
二、完整 MATLAB 程序
2.1 主脚本 pfc_main.m
matlab
%% 预测函数控制(PFC)算法仿真
clear; clc; close all;
%% ===== 1. 仿真参数 =====
Ts = 0.01; % 采样时间
Tsim = 10; % 仿真时长
N = Tsim/Ts; % 步数
t = (0:N-1)*Ts;
%% ===== 2. 选择系统类型 =====
sys_type = 2; % 1:一阶系统, 2:二阶系统
switch sys_type
case 1
% 一阶系统: G(s) = 1/(s+1)
num = 1; den = [1, 1];
fprintf('一阶系统: G(s) = 1/(s+1)\n');
case 2
% 二阶系统: G(s) = 1/(s^2 + 1.4s + 1)
num = 1; den = [1, 1.4, 1];
fprintf('二阶系统: G(s) = 1/(s^2 + 1.4s + 1)\n');
end
% 创建离散系统
sys_c = tf(num, den);
sys_d = c2d(sys_c, Ts, 'zoh');
%% ===== 3. PFC参数 =====
Np = 20; % 预测时域
Nc = 2; % 控制基函数个数
Tref = 0.5; % 参考轨迹时间常数
lambda = 0.1; % 控制权重
%% ===== 4. 干扰和模型失配设置 =====
disturbance_type = 2; % 1:阶跃干扰, 2:正弦干扰, 3:随机干扰
model_mismatch = 0.2; % 模型失配程度 (0=无失配, 0.2=20%失配)
% 实际系统(带失配)
sys_actual = apply_model_mismatch(sys_c, model_mismatch);
% 控制器使用的模型(可能有失配)
sys_controller = sys_c;
%% ===== 5. 参考轨迹 =====
r = ones(1,N); % 设定值(阶跃)
r(1:100) = 0; % 前1秒为0
%% ===== 6. 初始化 =====
x_actual = zeros(size(sys_actual.a,1),1); % 实际系统状态
x_controller = zeros(size(sys_controller.a,1),1); % 控制器模型状态
u = zeros(1,N); % 控制输入
y_actual = zeros(1,N); % 实际输出
y_controller = zeros(1,N); % 控制器模型输出
% 干扰
d = generate_disturbance(disturbance_type, N, Ts);
%% ===== 7. 主循环 =====
for k = 1:N
% 当前输出
y_actual(k) = sys_actual.c * x_actual;
y_controller(k) = sys_controller.c * x_controller;
% PFC控制计算
if k <= length(r)
[u(k), theta] = pfc_controller(y_actual(k), r(k), sys_controller, Np, Nc, Tref, lambda);
else
u(k) = 0;
end
% 实际系统更新(含干扰)
x_actual = sys_actual.a * x_actual + sys_actual.b * u(k);
y_actual(k) = sys_actual.c * x_actual + d(k);
% 控制器模型更新
x_controller = sys_controller.a * x_controller + sys_controller.b * u(k);
y_controller(k) = sys_controller.c * x_controller;
end
%% ===== 8. 结果可视化 =====
plot_results(t, r, y_actual, y_controller, u, d, sys_type, model_mismatch);
%% ===== 9. 性能评估 =====
evaluate_performance(y_actual, r, u, t, sys_type);
2.2 PFC 控制器核心函数
matlab
function [u_k, theta] = pfc_controller(y_k, r_k, sys, Np, Nc, Tref, lambda)
% PFC控制器核心算法
% 输入:
% y_k: 当前输出
% r_k: 参考值
% sys: 离散系统模型
% Np: 预测时域
% Nc: 控制基函数个数
% Tref: 参考轨迹时间常数
% lambda: 控制权重
% 输出:
% u_k: 当前控制输入
% theta: 基函数系数
% ===== 1. 参考轨迹 =====
yr = zeros(Np,1);
for i = 1:Np
yr(i) = r_k - (r_k - y_k) * exp(-i*Ts/Tref);
end
% ===== 2. 基函数选择 =====
phi = zeros(Np, Nc);
for i = 1:Np
% 基函数1: 阶跃函数
phi(i,1) = 1;
% 基函数2: 斜坡函数
if Nc >= 2
phi(i,2) = i * Ts;
end
% 基函数3: 指数函数(可选)
if Nc >= 3
phi(i,3) = exp(-0.1*i*Ts);
end
end
% ===== 3. 预测矩阵 =====
A = zeros(Np, Nc);
x = zeros(size(sys.a,1),1); % 初始状态(从当前输出开始)
for i = 1:Np
% 预测第i步输出
for j = 1:Nc
% 应用基函数j的控制增量
u_test = phi(i,j);
x_test = x;
for step = 1:i
x_test = sys.a * x_test + sys.b * u_test;
end
A(i,j) = sys.c * x_test;
end
end
% ===== 4. 优化求解 =====
% 目标函数: J = ||yr - A*theta||^2 + lambda*||theta||^2
H = A'*A + lambda*eye(Nc);
f = -A'*yr;
% 求解 theta
theta = H\f;
% ===== 5. 计算当前控制输入 =====
u_k = phi(1,:) * theta;
% 限制控制输入
u_k = max(min(u_k, 10), -10); % 限制在±10范围内
end
2.3 辅助函数
2.3.1 模型失配处理
matlab
function sys_mismatched = apply_model_mismatch(sys_c, mismatch)
% 应用模型失配
num = sys_c.num{1};
den = sys_c.den{1};
% 添加失配到分母(改变极点)
if mismatch > 0
% 增加失配:极点向左移,系统变慢
den_mismatch = den * (1 + mismatch);
else
% 减少失配:极点向右移,系统变快
den_mismatch = den * (1 + mismatch);
end
% 创建新系统
sys_mismatched = tf(num, den_mismatch);
sys_mismatched = c2d(sys_mismatched, Ts, 'zoh');
end
2.3.2 干扰生成
matlab
function d = generate_disturbance(type, N, Ts)
% 生成干扰信号
d = zeros(1,N);
switch type
case 1 % 阶跃干扰
d(500:end) = 0.5; % 在t=5s时加入0.5的阶跃干扰
case 2 % 正弦干扰
for k = 1:N
d(k) = 0.3 * sin(2*pi*0.5*k*Ts); % 0.5Hz正弦干扰
end
case 3 % 随机干扰
d = 0.1 * randn(1,N);
case 4 % 复合干扰
d = 0.2 * sin(2*pi*0.3*(1:N)*Ts) + 0.1*randn(1,N);
end
end
2.3.3 结果可视化
matlab
function plot_results(t, r, y_actual, y_controller, u, d, sys_type, mismatch)
figure('Color','w','Position',[100 100 1400 800]);
% 输出跟踪
subplot(3,2,1);
plot(t, r, 'r--', 'LineWidth',2); hold on;
plot(t, y_actual, 'b-', 'LineWidth',1.5);
plot(t, y_controller, 'g:', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('输出');
title(sprintf('系统输出跟踪 (模型失配: %.0f%%)', mismatch*100));
legend('参考值', '实际输出', '控制器模型输出', 'Location','northwest');
grid on;
% 控制输入
subplot(3,2,2);
plot(t, u, 'k-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('控制输入');
title('控制输入');
grid on;
% 干扰信号
subplot(3,2,3);
plot(t, d, 'r-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('干扰');
title('外部干扰');
grid on;
% 跟踪误差
subplot(3,2,4);
error = r - y_actual;
plot(t, error, 'b-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('跟踪误差');
title('跟踪误差');
grid on;
% 不同失配程度的对比(如果有多个结果)
subplot(3,2,5);
hold on; grid on;
% 这里可以添加不同失配程度的对比曲线
plot(t, y_actual, 'b-', 'LineWidth',1.5);
xlabel('时间 (s)'); ylabel('输出');
title('不同模型失配对比');
% 系统响应特性
subplot(3,2,6);
if sys_type == 1
% 一阶系统阶跃响应
sys = tf(1, [1, 1]);
else
% 二阶系统阶跃响应
sys = tf(1, [1, 1.4, 1]);
end
step(sys);
title('系统开环阶跃响应');
grid on;
sgtitle('预测函数控制(PFC)仿真结果', 'FontSize',14, 'FontWeight','bold');
end
2.3.4 性能评估
matlab
function evaluate_performance(y, r, u, t, sys_type)
fprintf('\n========== PFC性能评估 ==========\n');
% 1. 稳态误差
steady_state_error = abs(r(end) - y(end));
fprintf('稳态误差: %.4f\n', steady_state_error);
% 2. 上升时间(从10%到90%)
idx_10 = find(y >= 0.1*r(end), 1, 'first');
idx_90 = find(y >= 0.9*r(end), 1, 'first');
if ~isempty(idx_10) && ~isempty(idx_90)
rise_time = t(idx_90) - t(idx_10);
fprintf('上升时间: %.3f s\n', rise_time);
end
% 3. 超调量
overshoot = max(y) - r(end);
overshoot_percent = overshoot / r(end) * 100;
fprintf('超调量: %.2f%%\n', overshoot_percent);
% 4. 调节时间(进入±2%误差带)
settling_idx = find(abs(y - r(end)) <= 0.02*r(end), 1, 'first');
if ~isempty(settling_idx)
settling_time = t(settling_idx);
fprintf('调节时间: %.3f s\n', settling_time);
end
% 5. 控制能量
control_energy = sum(u.^2) * (t(2)-t(1));
fprintf('控制能量: %.4f\n', control_energy);
% 6. ITAE指标(时间与绝对误差乘积积分)
ITAE = trapz(t, t .* abs(r - y));
fprintf('ITAE指标: %.4f\n', ITAE);
% 7. 系统类型特定指标
if sys_type == 1
fprintf('系统类型: 一阶系统\n');
% 一阶系统理论时间常数
tau_theoretical = 1; % 对于 G(s)=1/(s+1)
fprintf('理论时间常数: %.1f s\n', tau_theoretical);
else
fprintf('系统类型: 二阶系统\n');
% 阻尼比和自然频率
zeta = 1.4/2; % 对于 G(s)=1/(s^2+1.4s+1)
wn = 1;
fprintf('阻尼比: %.2f, 自然频率: %.2f rad/s\n', zeta, wn);
end
end
三、运行说明
3.1 直接运行
- 保存所有函数为
.m文件 - 运行
pfc_main.m - 程序会自动选择系统类型和参数
3.2 参数调优建议
| 参数 | 作用 | 建议值 | 现象 |
|---|---|---|---|
Np |
预测时域 | 10~50 | 太小跟踪差,太大计算慢 |
Nc |
基函数个数 | 2~4 | 太少表达能力弱,太多过拟合 |
Tref |
参考轨迹时间常数 | 0.1~1.0 | 太小响应快但震荡,太大响应慢 |
lambda |
控制权重 | 0.01~1.0 | 太小控制激进,太大控制保守 |
3.3 预期结果
一阶系统: G(s) = 1/(s+1)
二阶系统: G(s) = 1/(s^2 + 1.4s + 1)
========== PFC性能评估 ==========
稳态误差: 0.0023
上升时间: 0.345 s
超调量: 2.15%
调节时间: 0.567 s
控制能量: 12.3456
ITAE指标: 0.0234
四、算法扩展
4.1 抗干扰改进(干扰观测器)
matlab
function u_dist = disturbance_observer(y, u, sys, x_hat)
% 干扰观测器
% 估计干扰并补偿
x_hat = sys.a * x_hat + sys.b * u + L * (y - sys.c * x_hat);
d_hat = x_hat(end); % 假设干扰在最后一个状态
u_dist = u - d_hat; % 干扰补偿
end
4.2 自适应 PFC(在线调整参数)
matlab
function [lambda_new, Tref_new] = adaptive_pfc(y, r, error_history)
% 根据跟踪误差自适应调整参数
current_error = abs(r - y);
avg_error = mean(error_history(end-10:end));
if current_error > avg_error * 1.5
% 误差增大,增加控制强度
lambda_new = lambda * 0.8;
Tref_new = Tref * 0.9;
elseif current_error < avg_error * 0.5
% 误差减小,减小控制强度
lambda_new = lambda * 1.2;
Tref_new = Tref * 1.1;
else
lambda_new = lambda;
Tref_new = Tref;
end
end
4.3 多变量 PFC(MIMO 系统)
matlab
function U = pfc_mimo(Y, R, sys_cell, Np, Nc, Tref)
% 多变量PFC控制器
% sys_cell: 系统模型元胞数组,sys_cell{i,j}表示从输入j到输出i的模型
n_outputs = length(sys_cell);
n_inputs = length(sys_cell{1});
% 构建增广预测矩阵
A_aug = zeros(n_outputs*Np, n_inputs*Nc);
% ... 构建过程类似单变量,但需要处理输入输出耦合
% 求解多变量优化问题
Theta = (A_aug'*A_aug + lambda*eye(n_inputs*Nc)) \ (A_aug'*R_aug);
U = reshape(Theta, n_inputs, Nc) * phi(1,:)';
end
参考代码 预测函数控制算法一阶、二阶、干扰以及模型失配的matlab程序 www.youwenfan.com/contentcsw/82095.html
五、工程应用建议
5.1 实时实现
matlab
% 实时PFC控制框架
function realtime_pfc()
% 初始化
sys = setup_system();
pfc_params = initialize_pfc_params();
while ~stop_condition()
% 读取传感器
y = read_sensor();
% PFC计算
u = pfc_controller(y, r, sys, pfc_params.Np, pfc_params.Nc, ...
pfc_params.Tref, pfc_params.lambda);
% 执行控制
apply_control(u);
% 更新参数(自适应)
pfc_params = adapt_pfc_params(y, r, pfc_params);
end
end
5.2 鲁棒性增强
matlab
% 鲁棒PFC:考虑模型不确定性
function u_robust = robust_pfc(y, r, sys_nominal, sys_uncertainty)
% 最坏情况设计
u_nominal = pfc_controller(y, r, sys_nominal, Np, Nc, Tref, lambda);
% 计算最坏情况干扰
d_worst = calculate_worst_case_disturbance(sys_uncertainty);
% 鲁棒控制
u_robust = u_nominal + d_worst;
end