文章目录
- 最优控制
-
- 主要方法
- 动态规划
-
- 动态规划的特点
- 动态规划的步骤
- 带有约束问题的最优控制matlab代码实例
最优控制
最优控制就是系统在满足一定的约束条件下,从所有可能的控制方案中找到最优解,使得系统的性能指标达到最优。在现实生活中,最优性能指标的体现就是生产一种产品,通过合理的安排,使得原材料消耗的最少;或者货物在多个城市之间的运输,经过计算得到一套方案使得运费最少,且用时最短等等,用更加通俗的话来解释这一概念就是对于一个系统,在n时刻的状态x(n),离规定目标点的距离越近就说明越好,因此它的核心就是通过建立系统的数学模型,用数学方法来求解最优的控制策略。
主要方法
1,极小值原理:基于变分法的改进,适用于控制变量有约束的最优控制问题,通过哈密顿函数和协态方程求解。 2,动态规划:将复杂问题分解为多阶段决策,利用贝尔曼方程求解,适用于离散系统和多阶段优化。 3,线性二次调节器(LQR):针对线性系统和二次型性能指标,通过求解黎卡提方程得到状态反馈控制律。 4,模型预测控制(MPC):在线优化方法,基于系统模型预测未来状态,处理约束问题,广泛应用于工业过程控制。 强化学习:通过智能体与环境的交互学习最优策略,适用于复杂和非线性系统。 5,H∞控制:设计鲁棒控制器,最小化系统对扰动的敏感性,适用于多变量系统。 6,极值搜索控制:无需系统模型,通过实时调整参数最大化目标函数,适用于参数变化的系统。
动态规划
贝尔曼为解决动态最优化问题而提出,它是一种用于求解多阶段决策最优化问题的算法设计方法。 通过递推关系式,从最终状态倒推出最优解。 因此,动态规划的核心就是把复杂问题分解为相互关联的子问题,通过保存子问题的解来避免重复计算,从而可以有效的提高效率。
动态规划的特点
1,最优子结构:问题的最优解包含子问题的最优解 2,无后效性:某一个阶段的状态确定之后,后续决策不会受之前状态的影响 3,重叠子问题:在求解的过程中,相同的子问题会被多次计算,动态规划通过存储中间的结果来进行优化,减少中间重复的步骤
动态规划的步骤
1,分解问题:确定问题的状态,把大问题分解为若干个子问题 2,建立递推模型:建立能够描述子问题之间的递推关系 3,初始化:设定初始状态的值 4,递推求解:从最终状态开始倒退逐步进行计算,或者从最小的子问题开始计算,直到得到原问题的解
举个例子:

带有约束问题的最优控制matlab代码实例
无人机高度的控制:
目标:从地面升高到10米的高空,用时最短,J=tf h(0)=0, h’(0)=0 h(d)=10, h’(d)=0 约束条件: 加速度: -3 m/s² ≤ a ≤ 2 m/s² 速度:0 m/s² ≤ v ≤ 2 m/s²
动态方程是: m h’\'(t) = f(t) – mg 控制量: u = a = 1/m [ f(t) – mg ] 即无人机的加速度,其中f(t) 是向上的升力,也就是马达的转速,转速越快,向上的力就越大。
先通过绘图来进行分析,纵轴上距离间隔设置为2米将其离散化处理,横轴是速度,如图所示: 
平均速度 v_avg =1/2( v(k) + v(k+1) )起点与重点速度之和的1/2; 时间 t = dx/{1/2[ u(k)+u(k+1)]} 加速度: a = [v(k+1) – v(k)] / t 从10米的位置开始向8米的位置计算,只有四种情况,计算完之后得到对应每个点处的用时和加速度的值,先存起来,再从8米的位置向6米的位置计算,此时就有4✖4=16种不同的情况,并且每次计算得到的时间值需要加上上一步存的时间值,再将每个可能的情况存起来,以此类推,一直算到最后的0米为止。因为这个循环的计算过程用的都是同一种公式,所以可以用一套循环语句来完成。最后再比较得出的时间值,选取最小的作为这个问题的最优控制解决方案。 
以下是在matlab中的运行代码:
%% Dynamic Programming
clc; clear all; close all;
% Define IC
h_init = 0 ; % h: height
v_init = 0 ;% v: velocity
% Final state
h_final = 10;
v_final = 0;
% Boundary condition
h_min = 0;
h_max = 10; N_h=5;
v_min = 0 ;
v_max = 3; N_v=3;
% Create state array
Hd = h_min : (h_max – h_min)/N_h: h_max;
Vd = v_min: (v_max – v_min)/N_v : v_max;
% Input constraint, input is the system acceleration
u_min = –3; u_max = 2;
% Define cost to go matrix
J_costtogo = zeros(N_h + 1, N_v + 1);
% Define input acceleration matrix
Input_acc = zeros(N_h + 1, N_v + 1);
%%%%%%%%%%%%%%%% From 10m to 8m %%%%%

![P11246 [GESP202409 六级] 小杨和整数拆分-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108100631-6af049a75855c-220x150.png)
![打卡信奥刷题(3678)用C++实现信奥题 P12274 [蓝桥杯 2024 国 Python B] 设计-171主机测评](https://www.171host.com/wp-content/uploads/2026/11/20261108053830-6af00ad6bdf8d-220x150.png)

