一、连续线性化MPC核心原理
1.1 基本思想
连续线性化模型预测控制(Successive Linearization MPC, SL-MPC)是一种处理非线性系统 的MPC策略,通过在每个采样点对非线性系统进行线性化,将非线性MPC问题转化为一系列线性时变MPC问题。
1.2 数学表述
对于非线性系统:
x˙=f(x,u),y=h(x)\dot{x} = f(x, u), \quad y = h(x)x˙=f(x,u),y=h(x)
在每个采样时刻 tkt_ktk,在工作点 (xk,uk)(x_k, u_k)(xk,uk) 处进行线性化:
δx˙=Akδx+Bkδu,δy=Ckδx\delta\dot{x} = A_k \delta x + B_k \delta u, \quad \delta y = C_k \delta xδx˙=Akδx+Bkδu,δy=Ckδx
其中:
- cAk=∂f∂x∣(xk,uk)cA_k = \frac{\partial f}{\partial x}\big|{(x_k, u_k)}cAk=∂x∂f (xk,uk),Bk=∂f∂u∣(xk,uk)B_k = \frac{\partial f}{\partial u}\big|{(x_k, u_k)}Bk=∂u∂f (xk,uk)
- δx=x−xk\delta x = x - x_kδx=x−xk,δu=u−uk\delta u = u - u_kδu=u−uk
二、MATLAB实现框架
2.1 系统定义与线性化
matlab
%% 连续线性化MPC主框架
classdef SuccessiveLinearizationMPC < handle
properties
% 系统参数
nx; % 状态维度
nu; % 输入维度
ny; % 输出维度
dt; % 采样时间
% MPC参数
N; % 预测时域
Q; % 状态权重
R; % 输入权重
P; % 终端权重
% 约束
x_min; x_max; % 状态约束
u_min; u_max; % 输入约束
du_min; du_max; % 输入变化率约束
% 非线性模型
f; % 非线性状态方程
h; % 非线性输出方程
% 线性化点
x_lin; % 线性化状态
u_lin; % 线性化输入
% 线性化模型
A; B; C; D; % 线性化系统矩阵
% 优化求解器
solver_options;
% 历史记录
history;
end
methods
function obj = SuccessiveLinearizationMPC(config)
% 构造函数
obj.nx = config.nx;
obj.nu = config.nu;
obj.ny = config.ny;
obj.dt = config.dt;
obj.N = config.N;
obj.Q = config.Q;
obj.R = config.R;
obj.P = config.P;
% 非线性函数
obj.f = config.f;
obj.h = config.h;
% 初始化线性化点
obj.x_lin = zeros(obj.nx, 1);
obj.u_lin = zeros(obj.nu, 1);
% 初始化历史记录
obj.history.x = [];
obj.history.u = [];
obj.history.A = {};
obj.history.B = {};
obj.history.solve_time = [];
end
function linearize(obj, x, u)
% 在当前工作点线性化系统
obj.x_lin = x;
obj.u_lin = u;
% 计算雅可比矩阵(数值微分或符号微分)
[obj.A, obj.B] = obj.compute_jacobian(x, u);
% 输出矩阵(如果需要)
if ~isempty(obj.h)
[obj.C, obj.D] = obj.compute_output_jacobian(x, u);
else
obj.C = eye(obj.nx);
obj.D = zeros(obj.nx, obj.nu);
end
% 离散化(使用零阶保持)
sysc = ss(obj.A, obj.B, obj.C, obj.D);
sysd = c2d(sysc, obj.dt, 'zoh');
obj.A = sysd.A;
obj.B = sysd.B;
end
function [A, B] = compute_jacobian(obj, x, u)
% 数值计算雅可比矩阵
epsilon = 1e-6;
A = zeros(obj.nx, obj.nx);
B = zeros(obj.nx, obj.nu);
% 计算A矩阵
for i = 1:obj.nx
x_plus = x;
x_minus = x;
x_plus(i) = x_plus(i) + epsilon;
x_minus(i) = x_minus(i) - epsilon;
f_plus = obj.f(x_plus, u);
f_minus = obj.f(x_minus, u);
A(:, i) = (f_plus - f_minus) / (2 * epsilon);
end
% 计算B矩阵
for i = 1:obj.nu
u_plus = u;
u_minus = u;
u_plus(i) = u_plus(i) + epsilon;
u_minus(i) = u_minus(i) - epsilon;
f_plus = obj.f(x, u_plus);
f_minus = obj.f(x, u_minus);
B(:, i) = (f_plus - f_minus) / (2 * epsilon);
end
end
function [u_opt, info] = solve_mpc(obj, x_current, x_ref, u_ref)
% 求解线性MPC问题
tic;
% 在当前状态线性化
if isempty(obj.A) || norm(x_current - obj.x_lin) > 0.1
obj.linearize(x_current, obj.u_lin);
end
% 构建MPC问题
[H, f, Aeq, beq, Aineq, bineq, lb, ub] = ...
obj.build_mpc_problem(x_current, x_ref, u_ref);
% 求解QP问题
options = optimoptions('quadprog', ...
'Display', 'off', ...
'Algorithm', 'interior-point-convex');
[U_opt, fval, exitflag] = quadprog(H, f, ...
Aineq, bineq, Aeq, beq, lb, ub, [], options);
% 提取第一个控制输入
u_opt = U_opt(1:obj.nu);
% 记录信息
info = struct();
info.fval = fval;
info.exitflag = exitflag;
info.solve_time = toc;
info.is_linearized = true;
% 更新历史
obj.history.x = [obj.history.x, x_current];
obj.history.u = [obj.history.u, u_opt];
obj.history.A{end+1} = obj.A;
obj.history.B{end+1} = obj.B;
obj.history.solve_time = [obj.history.solve_time, info.solve_time];
% 更新线性化点(可选:使用预测状态)
obj.u_lin = u_opt;
end
function [H, f, Aeq, beq, Aineq, bineq, lb, ub] = ...
build_mpc_problem(obj, x0, x_ref, u_ref)
% 构建QP问题:min 0.5*U'*H*U + f'*U
% 预测矩阵
[Phi, Gamma] = obj.build_prediction_matrices();
% 代价函数矩阵
H = zeros(obj.nu * obj.N);
f = zeros(obj.nu * obj.N, 1);
% 构建H和f
for k = 0:obj.N-1
% 控制输入权重
idx_u = k*obj.nu + (1:obj.nu);
H(idx_u, idx_u) = obj.R;
% 参考跟踪项
if ~isempty(u_ref)
f(idx_u) = -obj.R * u_ref;
end
end
% 状态跟踪项(通过等式约束处理)
Q_bar = kron(eye(obj.N), obj.Q);
Q_bar(end-obj.nx+1:end, end-obj.nx+1:end) = obj.P;
H = H + Gamma' * Q_bar * Gamma;
f = f + 2 * Gamma' * Q_bar * (Phi * x0 - repmat(x_ref, obj.N, 1));
% 等式约束(系统动力学)
Aeq = [];
beq = [];
% 不等式约束(输入约束)
Aineq = [];
bineq = [];
% 边界约束
lb = repmat(obj.u_min, obj.N, 1);
ub = repmat(obj.u_max, obj.N, 1);
% 添加输入变化率约束
if ~isempty(obj.du_min) && ~isempty(obj.du_max)
D = obj.build_rate_constraint_matrix();
Aineq = [Aineq; D; -D];
bineq = [bineq;
repmat(obj.du_max, obj.N, 1);
-repmat(obj.du_min, obj.N, 1)];
end
end
function [Phi, Gamma] = build_prediction_matrices(obj)
% 构建预测矩阵:X = Phi * x0 + Gamma * U
Phi = zeros(obj.nx * obj.N, obj.nx);
Gamma = zeros(obj.nx * obj.N, obj.nu * obj.N);
% 递归计算
A_power = eye(obj.nx);
for i = 1:obj.N
% Phi矩阵
idx_x = (i-1)*obj.nx + (1:obj.nx);
Phi(idx_x, :) = A_power;
% Gamma矩阵
for j = 1:i
idx_u = (j-1)*obj.nu + (1:obj.nu);
Gamma(idx_x, idx_u) = A_power * obj.B;
A_power = obj.A * A_power;
end
A_power = eye(obj.nx);
end
end
end
end
2.2 应用示例:倒立摆控制
matlab
%% 示例:倒立摆的连续线性化MPC控制
function sl_mpc_pendulum_example()
% 倒立摆系统参数
m = 0.1; % 摆杆质量 (kg)
M = 1.0; % 小车质量 (kg)
l = 0.5; % 摆杆长度 (m)
g = 9.81; % 重力加速度 (m/s^2)
b = 0.1; % 摩擦系数
% 状态:x = [小车位置, 小车速度, 摆杆角度, 摆杆角速度]
% 输入:u = [小车力]
% 非线性动力学
f = @(x,u) [
x(2); % 小车速度
(u - m*l*x(4)^2*sin(x(3)) + m*g*sin(x(3))*cos(x(3)) - b*x(2)) / ...
(M + m - m*cos(x(3))^2); % 小车加速度
x(4); % 角速度
(g*sin(x(3)) - cos(x(3)) * ...
(u - m*l*x(4)^2*sin(x(3)) - b*x(2)) / (M + m - m*cos(x(3))^2)) / ...
(l * (4/3 - m*cos(x(3))^2/(M+m))) % 角加速度
];
% MPC配置
config = struct();
config.nx = 4;
config.nu = 1;
config.ny = 4;
config.dt = 0.05; % 50ms采样时间
config.N = 20; % 预测时域
config.Q = diag([10, 1, 100, 10]); % 状态权重
config.R = 0.1; % 输入权重
config.P = diag([20, 2, 200, 20]); % 终端权重
config.f = f;
config.h = @(x) x; % 全状态输出
% 创建SL-MPC控制器
mpc = SuccessiveLinearizationMPC(config);
% 设置约束
mpc.u_min = -20;
mpc.u_max = 20;
mpc.du_min = -5;
mpc.du_max = 5;
% 仿真参数
T_sim = 5.0; % 仿真时间
N_sim = ceil(T_sim / config.dt);
% 初始状态(摆杆向下)
x0 = [0; 0; pi; 0]; % [位置, 速度, 角度(π表示向下), 角速度]
% 目标状态(摆杆向上)
x_ref = [1.0; 0; 0; 0]; % 小车位置1m,摆杆向上
% 参考输入
u_ref = 0;
% 初始化
x = zeros(config.nx, N_sim+1);
u = zeros(config.nu, N_sim);
t = zeros(1, N_sim+1);
x(:,1) = x0;
t(1) = 0;
% 主控制循环
for k = 1:N_sim
fprintf('时间步: %d/%d\n', k, N_sim);
% 求解MPC
[u_opt, info] = mpc.solve_mpc(x(:,k), x_ref, u_ref);
% 应用控制输入(带饱和)
u(:,k) = max(min(u_opt, mpc.u_max), mpc.u_min);
% 模拟系统(使用4阶Runge-Kutta)
x(:,k+1) = rk4_integration(f, x(:,k), u(:,k), config.dt);
% 添加过程噪声
x(:,k+1) = x(:,k+1) + 0.01 * randn(config.nx, 1);
% 更新时间
t(k+1) = t(k) + config.dt;
% 显示线性化信息
if info.is_linearized
fprintf(' 在点 [%.2f, %.2f, %.2f, %.2f] 处线性化\n', ...
x(1,k), x(2,k), x(3,k), x(4,k));
end
end
% 分析结果
analyze_results(t, x, u, mpc, x_ref);
% 可视化
plot_pendulum_results(t, x, u, mpc);
end
function x_next = rk4_integration(f, x, u, dt)
% 4阶Runge-Kutta积分
k1 = f(x, u);
k2 = f(x + dt/2*k1, u);
k3 = f(x + dt/2*k2, u);
k4 = f(x + dt*k3, u);
x_next = x + dt/6 * (k1 + 2*k2 + 2*k3 + k4);
end
function analyze_results(t, x, u, mpc, x_ref)
% 性能分析
fprintf('\n=== 性能分析 ===\n');
% 跟踪误差
pos_error = x(1,:) - x_ref(1);
angle_error = wrapToPi(x(3,:) - x_ref(3));
rmse_pos = sqrt(mean(pos_error.^2));
rmse_angle = sqrt(mean(angle_error.^2));
fprintf('位置RMSE: %.4f m\n', rmse_pos);
fprintf('角度RMSE: %.4f rad\n', rmse_angle);
% 控制能量
control_energy = sum(u.^2);
fprintf('控制总能量: %.4f\n', control_energy);
% 求解时间统计
if ~isempty(mpc.history.solve_time)
avg_solve_time = mean(mpc.history.solve_time);
max_solve_time = max(mpc.history.solve_time);
fprintf('平均求解时间: %.4f ms\n', avg_solve_time*1000);
fprintf('最大求解时间: %.4f ms\n', max_solve_time*1000);
fprintf('实时性: %.1f%% (在%.1fms内)\n', ...
sum(mpc.history.solve_time < mpc.dt)/length(mpc.history.solve_time)*100, ...
mpc.dt*1000);
end
% 线性化频率
n_linearizations = length(mpc.history.A);
fprintf('线性化次数: %d (%.1f%%)\n', ...
n_linearizations, n_linearizations/length(t)*100);
end
三、连续线性化策略比较
3.1 不同线性化策略
matlab
%% 连续线性化策略比较
function compare_linearization_strategies()
% 策略1:每个采样点都线性化
strategy1 = @(mpc, x, u, k) true; % 总是线性化
% 策略2:基于状态变化触发
strategy2 = @(mpc, x, u, k) ...
norm(x - mpc.x_lin) > 0.1 || norm(u - mpc.u_lin) > 0.1;
% 策略3:基于时间触发
strategy3 = @(mpc, x, u, k) mod(k, 5) == 0; % 每5步线性化一次
% 策略4:基于预测误差触发
strategy4 = @(mpc, x, u, k) ...
check_prediction_error(mpc, x, u) > 0.05;
% 测试不同策略
strategies = {strategy1, strategy2, strategy3, strategy4};
strategy_names = {'每次线性化', '状态变化触发', '时间触发', '预测误差触发'};
results = cell(length(strategies), 1);
for i = 1:length(strategies)
fprintf('\n测试策略: %s\n', strategy_names{i});
% 运行仿真
results{i} = run_with_strategy(strategies{i});
% 显示结果
fprintf(' 线性化次数: %d\n', results{i}.n_linearizations);
fprintf(' 平均求解时间: %.3f ms\n', results{i}.avg_solve_time*1000);
fprintf(' 跟踪误差: %.4f\n', results{i}.tracking_error);
end
% 可视化比较
plot_strategy_comparison(results, strategy_names);
end
function should_linearize = check_prediction_error(mpc, x, u)
% 检查预测误差是否超过阈值
% 使用当前线性化模型进行一步预测
x_pred = mpc.A * (x - mpc.x_lin) + mpc.B * (u - mpc.u_lin) + mpc.x_lin;
% 使用非线性模型进行一步预测
x_true = rk4_integration(mpc.f, x, u, mpc.dt);
% 计算预测误差
prediction_error = norm(x_pred - x_true);
% 如果误差超过阈值,需要重新线性化
should_linearize = prediction_error > 0.05;
end
3.2 与LTV-MPC和NMPC对比
| 特性 | 连续线性化MPC | LTV-MPC | 非线性MPC |
|---|---|---|---|
| 计算复杂度 | 中等 | 低 | 高 |
| 最优性 | 次优 | 次优 | 最优(局部) |
| 实时性 | 好 | 优秀 | 差 |
| 实现难度 | 中等 | 简单 | 困难 |
| 适用系统 | 中度非线性 | 线性时变 | 强非线性 |
| 线性化频率 | 自适应 | 固定 | 不适用 |
参考代码 连续线性化模型的预测控制 https://www.codedown123.com/160623.html
四、MATLAB工具箱支持
4.1 使用MPC Toolbox
matlab
%% 使用MPC Toolbox实现连续线性化
function mpc_controller = setup_mpc_toolbox_linearization()
% 创建非线性系统对象
nlobj = nlmpc(4, 1, 4); % 4状态,1输入,4输出
% 设置采样时间
nlobj.Ts = 0.05;
nlobj.PredictionHorizon = 20;
nlobj.ControlHorizon = 5;
% 设置非线性模型
nlobj.Model.StateFcn = @pendulumStateFcn;
nlobj.Model.OutputFcn = @(x,u) x; % 全状态输出
% 设置代价函数
nlobj.Weights.OutputVariables = [10, 1, 100, 10];
nlobj.Weights.ManipulatedVariables = 0.1;
nlobj.Weights.ManipulatedVariablesRate = 0.01;
% 设置约束
nlobj.ManipulatedVariables.Min = -20;
nlobj.ManipulatedVariables.Max = 20;
% 验证模型
x0 = [0; 0; pi; 0];
u0 = 0;
validateFcns(nlobj, x0, u0);
% 创建线性化选项
options = linearizeOptions('Block', true);
% 在多个工作点线性化
operatingPoints = createOperatingPoints();
ltvModels = linearize(nlobj, operatingPoints, options);
% 创建LTV MPC控制器
mpc_controller = ltvmpc(ltvModels, nlobj.Ts, ...
'PredictionHorizon', nlobj.PredictionHorizon, ...
'ControlHorizon', nlobj.ControlHorizon);
fprintf('LTV-MPC控制器创建成功\n');
end
function operatingPoints = createOperatingPoints()
% 创建多个工作点用于线性化
n_points = 10;
operatingPoints = opcond(n_points);
for i = 1:n_points
% 在不同角度位置创建工作点
theta = (i-1)/(n_points-1) * 2*pi;
operatingPoints(i).States.x = [0; 0; theta; 0];
operatingPoints(i).Inputs.u = 0;
end
end
4.2 使用System Identification Toolbox
matlab
%% 基于在线辨识的连续线性化
function adaptive_mpc = setup_adaptive_linearization_mpc()
% 配置递归最小二乘(RLS)辨识器
na = 4; % AR部分阶数
nb = 2; % X部分阶数
nk = 1; % 延迟
rls_filter = recursiveARX([na nb nk]);
rls_filter.ForgettingFactor = 0.99;
rls_filter.InitialParameterCovariance = 10;
% 创建自适应MPC控制器
adaptive_mpc = struct();
adaptive_mpc.rls = rls_filter;
adaptive_mpc.model_update_interval = 5; % 每5步更新一次模型
adaptive_mpc.last_update = 0;
adaptive_mpc.current_model = [];
% MPC参数
adaptive_mpc.N = 10;
adaptive_mpc.Q = diag([10, 1, 100, 10]);
adaptive_mpc.R = 0.1;
fprintf('自适应线性化MPC配置完成\n');
end
function [u_opt, adaptive_mpc] = adaptive_mpc_step(adaptive_mpc, x, u, y, t)
% 自适应MPC单步
% 更新模型参数
if t - adaptive_mpc.last_update >= adaptive_mpc.model_update_interval
[A, B] = update_model_parameters(adaptive_mpc, x, u, y);
adaptive_mpc.current_model.A = A;
adaptive_mpc.current_model.B = B;
adaptive_mpc.last_update = t;
fprintf('模型在t=%.2f更新\n', t);
end
% 使用当前模型求解MPC
if ~isempty(adaptive_mpc.current_model)
[u_opt, info] = solve_linear_mpc(...
adaptive_mpc.current_model, x, adaptive_mpc);
else
% 使用初始模型
u_opt = zeros(size(u));
end
end
参考代码 连续线性化模型的预测控制 www.youwenfan.com/contentcst/160623.html
五、性能优化技巧
5.1 高效线性化策略
matlab
%% 智能线性化策略
classdef SmartLinearizationMPC < SuccessiveLinearizationMPC
properties
linearization_threshold = 0.1; % 线性化触发阈值
max_linearization_interval = 10; % 最大线性化间隔
last_linearization_time = 0;
prediction_error_history = [];
end
methods
function [u_opt, info] = solve_mpc_smart(obj, x_current, x_ref, u_ref)
% 智能线性化MPC求解
% 检查是否需要线性化
need_linearize = obj.check_linearization_need(x_current);
if need_linearize
% 执行线性化
obj.linearize(x_current, obj.u_lin);
obj.last_linearization_time = 0;
else
obj.last_linearization_time = obj.last_linearization_time + 1;
end
% 求解MPC
[u_opt, info] = solve_mpc@SuccessiveLinearizationMPC(...
obj, x_current, x_ref, u_ref);
info.linearized = need_linearize;
end
function need_linearize = check_linearization_need(obj, x_current)
% 检查线性化需求
% 条件1:距离上次线性化时间过长
if obj.last_linearization_time >= obj.max_linearization_interval
need_linearize = true;
return;
end
% 条件2:状态变化超过阈值
state_change = norm(x_current - obj.x_lin);
if state_change > obj.linearization_threshold
need_linearize = true;
return;
end
% 条件3:预测误差过大
if ~isempty(obj.prediction_error_history)
avg_error = mean(obj.prediction_error_history(end-5:end));
if avg_error > 0.05
need_linearize = true;
return;
end
end
need_linearize = false;
end
function update_prediction_error(obj, x_pred, x_actual)
% 更新预测误差历史
error = norm(x_pred - x_actual);
obj.prediction_error_history = [obj.prediction_error_history, error];
% 保持最近20个误差值
if length(obj.prediction_error_history) > 20
obj.prediction_error_history = obj.prediction_error_history(end-19:end);
end
end
end
end
5.2 并行计算加速
matlab
%% 并行线性化MPC
function parallel_linearization_mpc()
% 使用并行计算加速多个工作点的线性化
% 定义多个线性化点
n_workers = 4; % 并行工作数
operating_points = generate_operating_points(n_workers);
% 并行线性化
parpool(n_workers);
parfor i = 1:n_workers
fprintf('工作点 %d 线性化开始\n', i);
x_op = operating_points(i).x;
u_op = operating_points(i).u;
% 线性化系统
[A{i}, B{i}] = linearize_system_at_point(x_op, u_op);
fprintf('工作点 %d 线性化完成\n', i);
end
% 创建线性模型库
model_library = struct();
for i = 1:n_workers
model_library(i).A = A{i};
model_library(i).B = B{i};
model_library(i).x_op = operating_points(i).x;
model_library(i).u_op = operating_points(i).u;
end
% 基于最近邻选择模型
function model = select_model(x_current)
distances = zeros(1, n_workers);
for j = 1:n_workers
distances(j) = norm(x_current - model_library(j).x_op);
end
[~, idx] = min(distances);
model = model_library(idx);
end
fprintf('并行线性化完成,创建了%d个线性模型\n', n_workers);
end
六、实际应用建议
6.1 实施步骤
- 系统分析:确定非线性程度和主要工作区域
- 线性化点选择:在工作轨迹上选择关键点
- 控制器设计:设计线性MPC控制器
- 切换逻辑:设计线性化模型切换策略
- 仿真验证:在多种工况下测试
- 实时部署:考虑计算资源限制
6.2 调试技巧
matlab
%% 调试与验证工具
function debug_linearization_mpc(mpc_controller, simulation_data)
% 1. 检查线性化精度
plot_linearization_error(mpc_controller, simulation_data);
% 2. 分析模型切换
plot_model_switching(mpc_controller.history);
% 3. 验证约束满足
check_constraint_satisfaction(simulation_data, mpc_controller);
% 4. 性能指标计算
performance = calculate_performance_metrics(simulation_data);
% 5. 与非线性MPC比较
if exist('nonlinear_mpc_results', 'var')
compare_with_nonlinear_mpc(simulation_data, nonlinear_mpc_results);
end
fprintf('调试完成,性能指标:\n');
fprintf(' 平均跟踪误差: %.4f\n', performance.avg_tracking_error);
fprintf(' 最大约束违反: %.4f\n', performance.max_constraint_violation);
fprintf(' 计算时间比率: %.2f\n', performance.computation_ratio);
end
6.3 常见问题与解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 发散 | 线性化误差过大 | 增加线性化频率,减小步长 |
| 震荡 | 模型切换频繁 | 增加切换迟滞,平滑切换 |
| 计算超时 | 线性化计算复杂 | 使用解析雅可比,预计算 |
| 性能下降 | 工作点远离线性化点 | 增加线性化点密度 |
总结
连续线性化MPC在非线性系统控制 和实时性要求之间提供了良好平衡。MATLAB提供了多种实现方式:
- 手动实现:完全控制,适合研究和定制
- MPC Toolbox:快速原型,内置优化求解器
- System Identification Toolbox:结合在线辨识,适应时变系统
关键成功因素:
- 合理的线性化点选择策略
- 高效的模型切换机制
- 适当的触发条件设计
- 充分的仿真验证
适用场景:
- 无人机姿态控制
- 机器人轨迹跟踪
- 过程控制中的温和非线性系统
- 需要实时实现的复杂系统
通过合理设计,连续线性化MPC可以在保证控制性能的同时,显著降低计算复杂度,是实现非线性系统实时预测控制的实用方法。