非线性规划中的差分动态规划(DDP)算法进阶题
字数 7143 2025-12-08 04:06:39

非线性规划中的差分动态规划(DDP)算法进阶题

题目描述

考虑一个离散时间的确定性最优控制问题,可表述为一个非线性规划问题。假设系统动力学由非线性状态方程描述:

\[x_{k+1} = f(x_k, u_k), \quad k=0,1,\dots,N-1 \]

其中 \(x_k \in \mathbb{R}^{n_x}\) 是状态向量,\(u_k \in \mathbb{R}^{n_u}\) 是控制向量,\(f: \mathbb{R}^{n_x} \times \mathbb{R}^{n_u} \to \mathbb{R}^{n_x}\) 是二次连续可微的函数。给定初始状态 \(x_0\)。目标是最小化总代价函数:

\[J = \phi(x_N) + \sum_{k=0}^{N-1} L(x_k, u_k) \]

其中 \(\phi: \mathbb{R}^{n_x} \to \mathbb{R}\) 是终端代价函数,\(L: \mathbb{R}^{n_x} \times \mathbb{R}^{n_u} \to \mathbb{R}\) 是阶段代价函数,两者均二次连续可微。控制序列 \(\{u_0, u_1, \dots, u_{N-1}\}\) 是决策变量,无显式约束。

本题要求:使用差分动态规划(DDP) 算法求解此最优控制问题。解释DDP算法的核心思想,推导其关键步骤(包括回溯法和前向法中的二次展开、局部优化、反馈策略更新等),并阐述如何通过迭代改进控制序列。提供一个简单的数值例子(例如,小车倒立摆的摆动问题或简单二次型问题)展示算法步骤。


解题过程详解

差分动态规划(DDP)是一种基于动态规划和二阶近似的迭代方法,用于求解离散时间最优控制问题。其核心思想是:在给定当前控制序列(标称轨迹)附近,对动力学和代价函数进行二阶展开,通过求解局部二次规划(即线性二次型调节器LQR问题)得到改进的控制策略,并沿新轨迹迭代更新。下面循序渐进讲解:


第一步:问题重述与DDP基本原理

  1. 问题形式:我们有一个 \(N\) 阶段的控制问题,决策变量是整个控制序列 \(U = [u_0, u_1, \dots, u_{N-1}]\),状态序列 \(X = [x_1, \dots, x_N]\) 由动力学方程决定。这是一个高维无约束非线性规划问题,维度为 \(N \cdot n_u\)

  2. 动态规划视角:定义值函数(最优代价-动作函数):

\[ V_k(x) = \min_{u_k, u_{k+1}, \dots} \left[ \phi(x_N) + \sum_{j=k}^{N-1} L(x_j, u_j) \right] \]

满足 \(x_k = x\) 和系统动力学。根据贝尔曼最优性原理:

\[ V_k(x) = \min_{u} \left[ L(x, u) + V_{k+1}(f(x, u)) \right] \]

  1. DDP思路:从一个初始猜测控制序列 \(U^{(0)}\) 出发,通过前向模拟得到标称状态轨迹 \(\bar{X}\)。然后,在标称轨迹附近,对上述贝尔曼方程中的右端项进行二阶泰勒展开,得到局部LQR问题,其解给出一个反馈控制律(包括开环修正和线性反馈项)。利用这个反馈律,在下一个迭代中沿轨迹施加改进的控制,并更新标称轨迹。迭代直至收敛。

第二步:DDP算法核心推导

假设当前迭代中,我们有标称轨迹 \(\{\bar{x}_k, \bar{u}_k\}_{k=0}^{N-1}\),满足 \(\bar{x}_{k+1} = f(\bar{x}_k, \bar{u}_k)\)

2.1 反向传播(Backward Pass)

从最后一步 \(k=N\) 开始,向后计算到 \(k=0\)。定义状态和控制的偏差:

\[\delta x_k = x_k - \bar{x}_k, \quad \delta u_k = u_k - \bar{u}_k \]

  1. 展开代价函数
    定义哈密顿函数(仅用于推导):

\[ H_k(x, u) = L(x, u) + V_{k+1}(f(x, u)) \]

在标称点 \((\bar{x}_k, \bar{u}_k)\) 处,计算其一阶和二阶导数:

  • 梯度:

\[ \begin{aligned} q_k &= \nabla_x H_k = L_x + f_x^T V'_{k+1} \\ r_k &= \nabla_u H_k = L_u + f_u^T V'_{k+1} \end{aligned} \]

 其中 $ L_x = \nabla_x L(\bar{x}_k, \bar{u}_k) $,$ f_x = D_x f(\bar{x}_k, \bar{u}_k) $ 等,$ V'_{k+1} = \nabla_x V_{k+1}(\bar{x}_{k+1}) $。
  • 海森矩阵块:

\[ \begin{aligned} Q_{xx,k} &= H_{xx} = L_{xx} + f_x^T V''_{k+1} f_x + \sum_{i} (V'_{k+1})_i f_{xx}^i \\ Q_{uu,k} &= H_{uu} = L_{uu} + f_u^T V''_{k+1} f_u + \sum_{i} (V'_{k+1})_i f_{uu}^i \\ Q_{ux,k} &= H_{ux} = L_{ux} + f_u^T V''_{k+1} f_x + \sum_{i} (V'_{k+1})_i f_{ux}^i \end{aligned} \]

 这里 $ f_{xx}^i $ 是 $ f $ 的第 $ i $ 分量对 $ x $ 的海森矩阵,通常为了计算效率,DDP常忽略二阶动力学项(即 $ f_{xx}, f_{uu}, f_{ux} $),这导出了**iLQR(迭代LQR)** 算法。但经典DDP保留这些项。为简化,以下推导采用iLQR假设(忽略二阶动力学项),但会指出完整DDP的区别。
  1. 二次逼近的贝尔曼方程
    \(H_k\) 在标称点做二阶展开:

\[ \Delta H_k \approx q_k^T \delta x_k + r_k^T \delta u_k + \frac12 \delta x_k^T Q_{xx,k} \delta x_k + \frac12 \delta u_k^T Q_{uu,k} \delta u_k + \delta u_k^T Q_{ux,k} \delta x_k \]

值函数的增量:

\[ V_k(\bar{x}_k + \delta x_k) \approx V_k(\bar{x}_k) + \Delta V_k \]

根据贝尔曼方程,\(V_k(\bar{x}_k + \delta x_k) = \min_{\delta u_k} \left[ H_k(\bar{x}_k + \delta x_k, \bar{u}_k + \delta u_k) \right]\)

  1. 求解局部最优控制
    \(\delta u_k\) 最小化 \(\Delta H_k\)(一个二次函数):
    • 最优条件:\(\frac{\partial \Delta H_k}{\partial \delta u_k} = r_k + Q_{uu,k} \delta u_k + Q_{ux,k} \delta x_k = 0\)
    • 解得最优控制修正:

\[ \delta u_k^* = -Q_{uu,k}^{-1} (r_k + Q_{ux,k} \delta x_k) = k_k + K_k \delta x_k \]

 其中:

\[ k_k = -Q_{uu,k}^{-1} r_k, \quad K_k = -Q_{uu,k}^{-1} Q_{ux,k} \]

 $ k_k $ 是开环修正项,$ K_k $ 是反馈增益矩阵。
  1. 更新值函数导数的递归
    \(\delta u_k^*\) 代回 \(\Delta H_k\) 表达式,得到 \(\Delta V_k\) 的二次型:

\[ \Delta V_k = \frac12 \delta x_k^T S_k \delta x_k + s_k^T \delta x_k + \text{常数} \]

通过匹配系数,得到值函数梯度 \(V'_k\) 和海森 \(V''_k\) 的递推(在 \(\delta x_k=0\) 处):

\[ \begin{aligned} V'_k &= q_k + K_k^T r_k + K_k^T Q_{uu,k} k_k + Q_{ux,k}^T k_k \\ V''_k &= Q_{xx,k} + K_k^T Q_{uu,k} K_k + Q_{ux,k}^T K_k + K_k^T Q_{ux,k} \end{aligned} \]

实际上,更紧凑的形式(经过代数整理,并利用 \(k_k, K_k\) 定义)是:

\[ \begin{aligned} V'_k &= q_k - K_k^T Q_{uu,k} k_k + Q_{ux,k}^T k_k \\ V''_k &= (Q_{xx,k} - Q_{ux,k}^T Q_{uu,k}^{-1} Q_{ux,k}) + K_k^T Q_{uu,k} K_k \end{aligned} \]

常用计算步骤:

  • 首先计算 \(Q_{uu,k}^{-1}\)(需确保正定性,否则正则化)。
  • 然后计算 \(k_k, K_k\)
  • 更新:

\[ \begin{aligned} V'_k &\leftarrow q_k + K_k^T r_k + K_k^T Q_{uu,k} k_k + Q_{ux,k}^T k_k \\ V''_k &\leftarrow Q_{xx,k} + K_k^T Q_{uu,k} K_k + Q_{ux,k}^T K_k + K_k^T Q_{ux,k} \end{aligned} \]

初始条件:\(V'_N = \nabla \phi(\bar{x}_N)\), \(V''_N = \nabla^2 \phi(\bar{x}_N)\)

2.2 前向滚动(Forward Pass)

\(k=0\)\(N-1\),使用反向传播计算出的反馈律,沿新状态轨迹更新控制:

  1. 给定初始状态 \(x_0^{(new)} = x_0\)
  2. 对于 \(k=0,1,\dots,N-1\)

\[ \begin{aligned} u_k^{(new)} &= \bar{u}_k + k_k + K_k (x_k^{(new)} - \bar{x}_k) \\ x_{k+1}^{(new)} &= f(x_k^{(new)}, u_k^{(new)}) \end{aligned} \]

  1. 计算新轨迹下的总代价 \(J^{(new)}\)

第三步:算法流程与迭代改进

  1. 初始化:猜测初始控制序列 \(U^{(0)}\),设定正则化参数 \(\mu > 0\)(用于保证 \(Q_{uu}\) 可逆),容忍误差 \(\epsilon\),最大迭代次数。

  2. 迭代循环
    a. 前向模拟:用当前控制序列 \(U^{(i)}\) 积分动力学,得到标称状态轨迹 \(\bar{X}\) 和代价 \(J^{(i)}\)
    b. 反向传播:从 \(k=N\)\(0\) 计算 \(q_k, r_k, Q_{xx}, Q_{uu}, Q_{ux}\)\(k_k, K_k\)。如果 \(Q_{uu}\) 不正定,增加 \(\mu\)(即用 \(Q_{uu} + \mu I\) 代替)以保证下降方向。
    c. 前向滚动:用反馈律 \(u_k = \bar{u}_k + k_k + K_k (x_k - \bar{x}_k)\)\(x_0\) 生成新轨迹 \(X^{(new)}, U^{(new)}\) 和代价 \(J^{(new)}\)
    d. 接受判断:如果 \(J^{(new)} < J^{(i)}\),接受新轨迹,更新 \(\bar{X} \leftarrow X^{(new)}\), \(\bar{U} \leftarrow U^{(new)}\),并减少 \(\mu\)(如 \(\mu \leftarrow \mu/2\))。否则,增加 \(\mu\) 以更保守,重新反向传播(或减少步长)。
    e. 检查收敛:如果代价下降量 \(|J^{(i)} - J^{(new)}| < \epsilon\) 或达到最大迭代,停止。


第四步:简单数值例子

考虑一个简单的二次型问题,以便手工验证:

  • 系统:\(x_{k+1} = x_k + u_k\),标量 \(x, u\)
  • 代价:\(J = \frac12 x_N^2 + \frac12 \sum_{k=0}^{N-1} (x_k^2 + u_k^2)\)
  • 参数:\(N=2, x_0=1\)

步骤

  1. 初始猜测:\(\bar{u}_0 = \bar{u}_1 = 0\),则 \(\bar{x}_0=1, \bar{x}_1=1, \bar{x}_2=1\),初始代价 \(J = 0.5*(1+1+1) = 1.5\)
  2. 反向传播(iLQR,忽略二阶动力学):
    • \(k=2\)\(V'_2 = \phi_x = x_2 = 1\), \(V''_2 = 1\)
    • \(k=1\)\(f_x=1, f_u=1, L_x=x_1=1, L_u=u_1=0, L_{xx}=1, L_{uu}=1, L_{ux}=0\)
      • \(q_1 = L_x + f_x V'_2 = 1 + 1*1 = 2\)
      • \(r_1 = L_u + f_u V'_2 = 0 + 1*1 = 1\)
      • \(Q_{xx} = L_{xx} + f_x^2 V''_2 = 1 + 1 = 2\)
      • \(Q_{uu} = L_{uu} + f_u^2 V''_2 = 1 + 1 = 2\)
      • \(Q_{ux} = L_{ux} + f_u f_x V''_2 = 0 + 1 = 1\)
      • \(k_1 = -Q_{uu}^{-1} r_1 = -0.5*1 = -0.5\)
      • \(K_1 = -Q_{uu}^{-1} Q_{ux} = -0.5*1 = -0.5\)
      • 更新 \(V'_1 = q_1 + K_1 r_1 + K_1^2 Q_{uu} + Q_{ux} k_1 = 2 + (-0.5)*1 + 0.25*2 + 1*(-0.5) = 2 -0.5+0.5-0.5=1.5\)
        \(V''_1 = Q_{xx} + K_1^2 Q_{uu} + 2 K_1 Q_{ux} = 2 + 0.25*2 + 2*(-0.5)*1 = 2+0.5-1=1.5\)
    • \(k=0\):类似计算(略),得到 \(k_0, K_0\)
  3. 前向滚动:用反馈律从 \(x_0=1\) 计算新控制。例如,若得 \(k_0=-0.6, K_0=-0.6\),则 \(u_0 = 0 + (-0.6) + (-0.6)*(1-1) = -0.6\)\(x_1 = 1 + (-0.6) = 0.4\);再用 \(k_1, K_1\) 计算 \(u_1\),得新轨迹。
  4. 新代价应下降,迭代至收敛(解析解可通过Riccati方程得到)。

要点小结

  • DDP利用动态规划框架,在标称轨迹附近二次展开,得到局部LQR反馈策略。
  • 反向传播计算反馈增益和开环修正,前向滚动执行新控制。
  • 通过迭代更新轨迹,通常具有二次收敛速度。
  • 与SQP相比,DDP利用问题的时间结构,适合较长时域控制问题。

这个算法进阶题要求理解展开推导、反馈律构造、以及迭代更新机制。在实际应用中,还需处理正则化、步长调整、约束处理(可通过内点法或惩罚函数)等细节。

非线性规划中的差分动态规划(DDP)算法进阶题 题目描述 考虑一个离散时间的确定性最优控制问题,可表述为一个非线性规划问题。假设系统动力学由非线性状态方程描述: \[ x_ {k+1} = f(x_ k, u_ k), \quad k=0,1,\dots,N-1 \] 其中 \( x_ k \in \mathbb{R}^{n_ x} \) 是状态向量,\( u_ k \in \mathbb{R}^{n_ u} \) 是控制向量,\( f: \mathbb{R}^{n_ x} \times \mathbb{R}^{n_ u} \to \mathbb{R}^{n_ x} \) 是二次连续可微的函数。给定初始状态 \( x_ 0 \)。目标是最小化总代价函数: \[ J = \phi(x_ N) + \sum_ {k=0}^{N-1} L(x_ k, u_ k) \] 其中 \( \phi: \mathbb{R}^{n_ x} \to \mathbb{R} \) 是终端代价函数,\( L: \mathbb{R}^{n_ x} \times \mathbb{R}^{n_ u} \to \mathbb{R} \) 是阶段代价函数,两者均二次连续可微。控制序列 \( \{u_ 0, u_ 1, \dots, u_ {N-1}\} \) 是决策变量,无显式约束。 本题要求:使用 差分动态规划(DDP) 算法求解此最优控制问题。解释DDP算法的核心思想,推导其关键步骤(包括回溯法和前向法中的二次展开、局部优化、反馈策略更新等),并阐述如何通过迭代改进控制序列。提供一个简单的数值例子(例如,小车倒立摆的摆动问题或简单二次型问题)展示算法步骤。 解题过程详解 差分动态规划(DDP)是一种基于动态规划和二阶近似的迭代方法,用于求解离散时间最优控制问题。其核心思想是:在给定当前控制序列(标称轨迹)附近,对动力学和代价函数进行二阶展开,通过求解局部二次规划(即线性二次型调节器LQR问题)得到改进的控制策略,并沿新轨迹迭代更新。下面循序渐进讲解: 第一步:问题重述与DDP基本原理 问题形式 :我们有一个 \( N \) 阶段的控制问题,决策变量是整个控制序列 \( U = [ u_ 0, u_ 1, \dots, u_ {N-1}] \),状态序列 \( X = [ x_ 1, \dots, x_ N] \) 由动力学方程决定。这是一个高维无约束非线性规划问题,维度为 \( N \cdot n_ u \)。 动态规划视角 :定义值函数(最优代价-动作函数): \[ V_ k(x) = \min_ {u_ k, u_ {k+1}, \dots} \left[ \phi(x_ N) + \sum_ {j=k}^{N-1} L(x_ j, u_ j) \right ] \] 满足 \( x_ k = x \) 和系统动力学。根据贝尔曼最优性原理: \[ V_ k(x) = \min_ {u} \left[ L(x, u) + V_ {k+1}(f(x, u)) \right ] \] DDP思路 :从一个初始猜测控制序列 \( U^{(0)} \) 出发,通过前向模拟得到标称状态轨迹 \( \bar{X} \)。然后,在标称轨迹附近,对上述贝尔曼方程中的右端项进行二阶泰勒展开,得到局部LQR问题,其解给出一个 反馈控制律 (包括开环修正和线性反馈项)。利用这个反馈律,在下一个迭代中沿轨迹施加改进的控制,并更新标称轨迹。迭代直至收敛。 第二步:DDP算法核心推导 假设当前迭代中,我们有标称轨迹 \( \{\bar{x} k, \bar{u} k\} {k=0}^{N-1} \),满足 \( \bar{x} {k+1} = f(\bar{x}_ k, \bar{u}_ k) \)。 2.1 反向传播(Backward Pass) 从最后一步 \( k=N \) 开始,向后计算到 \( k=0 \)。定义状态和控制的偏差: \[ \delta x_ k = x_ k - \bar{x}_ k, \quad \delta u_ k = u_ k - \bar{u}_ k \] 展开代价函数 : 定义哈密顿函数(仅用于推导): \[ H_ k(x, u) = L(x, u) + V_ {k+1}(f(x, u)) \] 在标称点 \( (\bar{x}_ k, \bar{u}_ k) \) 处,计算其一阶和二阶导数: 梯度: \[ \begin{aligned} q_ k &= \nabla_ x H_ k = L_ x + f_ x^T V' {k+1} \\ r_ k &= \nabla_ u H_ k = L_ u + f_ u^T V' {k+1} \end{aligned} \] 其中 \( L_ x = \nabla_ x L(\bar{x}_ k, \bar{u} k) \),\( f_ x = D_ x f(\bar{x} k, \bar{u} k) \) 等,\( V' {k+1} = \nabla_ x V {k+1}(\bar{x} {k+1}) \)。 海森矩阵块: \[ \begin{aligned} Q_ {xx,k} &= H_ {xx} = L_ {xx} + f_ x^T V'' {k+1} f_ x + \sum {i} (V' {k+1}) i f {xx}^i \\ Q {uu,k} &= H_ {uu} = L_ {uu} + f_ u^T V'' {k+1} f_ u + \sum {i} (V' {k+1}) i f {uu}^i \\ Q {ux,k} &= H_ {ux} = L_ {ux} + f_ u^T V'' {k+1} f_ x + \sum {i} (V' {k+1}) i f {ux}^i \end{aligned} \] 这里 \( f {xx}^i \) 是 \( f \) 的第 \( i \) 分量对 \( x \) 的海森矩阵,通常为了计算效率,DDP常忽略二阶动力学项(即 \( f_ {xx}, f_ {uu}, f_ {ux} \)),这导出了 iLQR(迭代LQR) 算法。但经典DDP保留这些项。为简化,以下推导采用iLQR假设(忽略二阶动力学项),但会指出完整DDP的区别。 二次逼近的贝尔曼方程 : 对 \( H_ k \) 在标称点做二阶展开: \[ \Delta H_ k \approx q_ k^T \delta x_ k + r_ k^T \delta u_ k + \frac12 \delta x_ k^T Q_ {xx,k} \delta x_ k + \frac12 \delta u_ k^T Q_ {uu,k} \delta u_ k + \delta u_ k^T Q_ {ux,k} \delta x_ k \] 值函数的增量: \[ V_ k(\bar{x}_ k + \delta x_ k) \approx V_ k(\bar{x}_ k) + \Delta V_ k \] 根据贝尔曼方程,\( V_ k(\bar{x} k + \delta x_ k) = \min {\delta u_ k} \left[ H_ k(\bar{x}_ k + \delta x_ k, \bar{u}_ k + \delta u_ k) \right ] \)。 求解局部最优控制 : 对 \( \delta u_ k \) 最小化 \( \Delta H_ k \)(一个二次函数): 最优条件:\( \frac{\partial \Delta H_ k}{\partial \delta u_ k} = r_ k + Q_ {uu,k} \delta u_ k + Q_ {ux,k} \delta x_ k = 0 \) 解得最优控制修正: \[ \delta u_ k^* = -Q_ {uu,k}^{-1} (r_ k + Q_ {ux,k} \delta x_ k) = k_ k + K_ k \delta x_ k \] 其中: \[ k_ k = -Q_ {uu,k}^{-1} r_ k, \quad K_ k = -Q_ {uu,k}^{-1} Q_ {ux,k} \] \( k_ k \) 是开环修正项,\( K_ k \) 是反馈增益矩阵。 更新值函数导数的递归 : 将 \( \delta u_ k^* \) 代回 \( \Delta H_ k \) 表达式,得到 \( \Delta V_ k \) 的二次型: \[ \Delta V_ k = \frac12 \delta x_ k^T S_ k \delta x_ k + s_ k^T \delta x_ k + \text{常数} \] 通过匹配系数,得到值函数梯度 \( V' k \) 和海森 \( V'' k \) 的递推(在 \( \delta x_ k=0 \) 处): \[ \begin{aligned} V' k &= q_ k + K_ k^T r_ k + K_ k^T Q {uu,k} k_ k + Q {ux,k}^T k_ k \\ V'' k &= Q {xx,k} + K_ k^T Q {uu,k} K_ k + Q_ {ux,k}^T K_ k + K_ k^T Q_ {ux,k} \end{aligned} \] 实际上,更紧凑的形式(经过代数整理,并利用 \( k_ k, K_ k \) 定义)是: \[ \begin{aligned} V' k &= q_ k - K_ k^T Q {uu,k} k_ k + Q_ {ux,k}^T k_ k \\ V'' k &= (Q {xx,k} - Q_ {ux,k}^T Q_ {uu,k}^{-1} Q_ {ux,k}) + K_ k^T Q_ {uu,k} K_ k \end{aligned} \] 常用计算步骤: 首先计算 \( Q_ {uu,k}^{-1} \)(需确保正定性,否则正则化)。 然后计算 \( k_ k, K_ k \)。 更新: \[ \begin{aligned} V' k &\leftarrow q_ k + K_ k^T r_ k + K_ k^T Q {uu,k} k_ k + Q_ {ux,k}^T k_ k \\ V'' k &\leftarrow Q {xx,k} + K_ k^T Q_ {uu,k} K_ k + Q_ {ux,k}^T K_ k + K_ k^T Q_ {ux,k} \end{aligned} \] 初始条件:\( V'_ N = \nabla \phi(\bar{x}_ N) \), \( V''_ N = \nabla^2 \phi(\bar{x}_ N) \)。 2.2 前向滚动(Forward Pass) 从 \( k=0 \) 到 \( N-1 \),使用反向传播计算出的反馈律,沿新状态轨迹更新控制: 给定初始状态 \( x_ 0^{(new)} = x_ 0 \)。 对于 \( k=0,1,\dots,N-1 \): \[ \begin{aligned} u_ k^{(new)} &= \bar{u}_ k + k_ k + K_ k (x_ k^{(new)} - \bar{x} k) \\ x {k+1}^{(new)} &= f(x_ k^{(new)}, u_ k^{(new)}) \end{aligned} \] 计算新轨迹下的总代价 \( J^{(new)} \)。 第三步:算法流程与迭代改进 初始化 :猜测初始控制序列 \( U^{(0)} \),设定正则化参数 \( \mu > 0 \)(用于保证 \( Q_ {uu} \) 可逆),容忍误差 \( \epsilon \),最大迭代次数。 迭代循环 : a. 前向模拟 :用当前控制序列 \( U^{(i)} \) 积分动力学,得到标称状态轨迹 \( \bar{X} \) 和代价 \( J^{(i)} \)。 b. 反向传播 :从 \( k=N \) 到 \( 0 \) 计算 \( q_ k, r_ k, Q_ {xx}, Q_ {uu}, Q_ {ux} \) 及 \( k_ k, K_ k \)。如果 \( Q_ {uu} \) 不正定,增加 \( \mu \)(即用 \( Q_ {uu} + \mu I \) 代替)以保证下降方向。 c. 前向滚动 :用反馈律 \( u_ k = \bar{u}_ k + k_ k + K_ k (x_ k - \bar{x}_ k) \) 从 \( x_ 0 \) 生成新轨迹 \( X^{(new)}, U^{(new)} \) 和代价 \( J^{(new)} \)。 d. 接受判断 :如果 \( J^{(new)} < J^{(i)} \),接受新轨迹,更新 \( \bar{X} \leftarrow X^{(new)} \), \( \bar{U} \leftarrow U^{(new)} \),并减少 \( \mu \)(如 \( \mu \leftarrow \mu/2 \))。否则,增加 \( \mu \) 以更保守,重新反向传播(或减少步长)。 e. 检查收敛 :如果代价下降量 \( |J^{(i)} - J^{(new)}| < \epsilon \) 或达到最大迭代,停止。 第四步:简单数值例子 考虑一个简单的二次型问题,以便手工验证: 系统:\( x_ {k+1} = x_ k + u_ k \),标量 \( x, u \)。 代价:\( J = \frac12 x_ N^2 + \frac12 \sum_ {k=0}^{N-1} (x_ k^2 + u_ k^2) \)。 参数:\( N=2, x_ 0=1 \)。 步骤 : 初始猜测:\( \bar{u}_ 0 = \bar{u}_ 1 = 0 \),则 \( \bar{x}_ 0=1, \bar{x}_ 1=1, \bar{x}_ 2=1 \),初始代价 \( J = 0.5* (1+1+1) = 1.5 \)。 反向传播(iLQR,忽略二阶动力学): \( k=2 \):\( V'_ 2 = \phi_ x = x_ 2 = 1 \), \( V''_ 2 = 1 \)。 \( k=1 \):\( f_ x=1, f_ u=1, L_ x=x_ 1=1, L_ u=u_ 1=0, L_ {xx}=1, L_ {uu}=1, L_ {ux}=0 \)。 \( q_ 1 = L_ x + f_ x V'_ 2 = 1 + 1* 1 = 2 \) \( r_ 1 = L_ u + f_ u V'_ 2 = 0 + 1* 1 = 1 \) \( Q_ {xx} = L_ {xx} + f_ x^2 V''_ 2 = 1 + 1 = 2 \) \( Q_ {uu} = L_ {uu} + f_ u^2 V''_ 2 = 1 + 1 = 2 \) \( Q_ {ux} = L_ {ux} + f_ u f_ x V''_ 2 = 0 + 1 = 1 \) \( k_ 1 = -Q_ {uu}^{-1} r_ 1 = -0.5* 1 = -0.5 \) \( K_ 1 = -Q_ {uu}^{-1} Q_ {ux} = -0.5* 1 = -0.5 \) 更新 \( V' 1 = q_ 1 + K_ 1 r_ 1 + K_ 1^2 Q {uu} + Q_ {ux} k_ 1 = 2 + (-0.5) 1 + 0.25 2 + 1* (-0.5) = 2 -0.5+0.5-0.5=1.5 \) \( V'' 1 = Q {xx} + K_ 1^2 Q_ {uu} + 2 K_ 1 Q_ {ux} = 2 + 0.25 2 + 2 (-0.5)* 1 = 2+0.5-1=1.5 \) \( k=0 \):类似计算(略),得到 \( k_ 0, K_ 0 \)。 前向滚动:用反馈律从 \( x_ 0=1 \) 计算新控制。例如,若得 \( k_ 0=-0.6, K_ 0=-0.6 \),则 \( u_ 0 = 0 + (-0.6) + (-0.6)* (1-1) = -0.6 \),\( x_ 1 = 1 + (-0.6) = 0.4 \);再用 \( k_ 1, K_ 1 \) 计算 \( u_ 1 \),得新轨迹。 新代价应下降,迭代至收敛(解析解可通过Riccati方程得到)。 要点小结 : DDP利用动态规划框架,在标称轨迹附近二次展开,得到局部LQR反馈策略。 反向传播计算反馈增益和开环修正,前向滚动执行新控制。 通过迭代更新轨迹,通常具有二次收敛速度。 与SQP相比,DDP利用问题的时间结构,适合较长时域控制问题。 这个算法进阶题要求理解展开推导、反馈律构造、以及迭代更新机制。在实际应用中,还需处理正则化、步长调整、约束处理(可通过内点法或惩罚函数)等细节。