【2024 Optimal Control 16-745】【Lecture4】equality-constraints.ipynb功能分析

news2025/2/22 19:53:22
  • 代码实现了一个二次优化问题的可视化解法,包括目标函数、约束以及优化路径。
  • 提供了两种优化方法:牛顿法高斯-牛顿法,用于对比效果。
  • 利用了自动微分工具 ForwardDiff 来计算约束曲率。

环境初始化并导入依赖库

# 激活当前文件夹下的项目环境,并确保依赖安装完成
import Pkg; Pkg.activate(@__DIR__); Pkg.instantiate()

# 导入必要的包
using LinearAlgebra # 提供线性代数工具,例如矩阵运算
using ForwardDiff  # 支持自动微分,用于梯度计算
using PyPlot       # 提供基于Python的Matplotlib绘图库,用于绘制图形

定义目标函数和梯度

# 定义二次型的权重矩阵为对角矩阵 Q
Q = Diagonal([0.5; 1])

# 定义目标函数 f(x),是一个二次型
function f(x)
    return 0.5 * (x - [1; 0])' * Q * (x - [1; 0])
end

# 定义目标函数 f(x) 的梯度 ∇f(x)
function ∇f(x)
    # 梯度公式
    return Q * (x - [1; 0])
end

# 定义目标函数 f(x) 的 Hessian 矩阵 ∇²f(x)
function ∇2f(x)
    # 对于二次型函数,Hessian 是常数矩阵 Q
    return Q
end
  • 功能
    1. Q:一个对角矩阵,定义二次型函数的权重。
    2. f(x):目标函数,二次型形式。
    3. ∇f(x):目标函数的梯度,利用矩阵的乘法进行计算。
    4. ∇2f(x):目标函数的 Hessian 矩阵,对二次型函数来说是常数矩阵 Q
  • 参数
    • x 是二维向量,表示优化变量。

定义约束和其导数

# 定义约束函数 c(x),这是一个非线性约束
function c(x)
    return x[1]^2 + 2 * x[1] - x[2]
end

# 定义约束函数 c(x) 的雅可比矩阵∂c(x)
function ∂c(x)
    return [2 * x[1] + 2, -1]
end
  • 功能
    1. c(x):定义约束函数(非线性)。
    2. ∂c(x):约束函数的雅可比矩阵。
  • 参数
    • x 是二维向量,表示优化变量。
      在这里插入图片描述

绘制目标函数和约束的图形

# 定义绘制目标函数和约束的图形
function plot_landscape()
    Nsamp = 20  # 采样点数量
    # 创建网格上的 X 和 Y 点
    Xsamp = kron(ones(Nsamp), LinRange(-4, 4, Nsamp)')
    Ysamp = kron(ones(Nsamp)', LinRange(-4, 4, Nsamp))
    Zsamp = zeros(Nsamp, Nsamp)  # 用于存储 f(x) 的值

    # 遍历每个网格点,计算目标函数 f(x) 的值
    for j = 1:Nsamp
        for k = 1:Nsamp
            Zsamp[j, k] = f([Xsamp[j, k]; Ysamp[j, k]])
        end
    end

    # 绘制目标函数的等高线图
    contour(Xsamp, Ysamp, Zsamp)

    # 绘制约束函数 c(x) 的曲线
    xc = LinRange(-3.2, 1.2, Nsamp)
    plot(xc, xc.^2 + 2.0 .* xc, "y")  
end

# 调用绘图函数,展示目标函数和约束
plot_landscape()
  • 功能
    1. 生成网格数据 XsampYsamp
    2. 计算每个点上的目标函数值 Zsamp
    3. 绘制目标函数的等高线图。
    4. 绘制约束函数 c(x) 的曲线。
  • 参数
    • Nsamp 是采样点的数量。
    • LinRange 用于生成从 -44 的均匀分布数值。

绘制二维等高线图需要网格点

  • 等高线图的本质:等高线图需要在二维平面中每个网格点计算函数值,然后通过等值线连接具有相同函数值的点。
  • 为此,我们需要在 ( x , y ) (x, y) (x,y) 的定义域上定义一个规则的网格:
    1. 每个网格点对应平面上的一个 ( x , y ) (x, y) (x,y)坐标。
    2. 每个网格点的 z z z 值由目标函数 f ( x , y ) f(x, y) f(x,y)计算得出。

生成网格的方式

Julia 中的 kron(Kronecker 积)函数被用来构造重复的矩阵。

1. 构造 -4到 4 的序列
LinRange(-4, 4, Nsamp)
  • 生成一个长度为 N s a m p = 20 Nsamp = 20 Nsamp=20 的线性序列,表示横轴或纵轴上的采样点。
2. 生成重复行的矩阵
Xsamp = kron(ones(Nsamp), LinRange(-4, 4, Nsamp)')
  • 目的:生成一个矩阵,其中每一行都是从 -4到 4 的序列,用于表示二维网格中 x x x 方向的坐标。
  • 分解解释
    1. ones(Nsamp) 生成一个长度为 N s a m p Nsamp Nsamp 的全 1 向量,用于 Kronecker 积操作。
    2. LinRange(-4, 4, Nsamp)' 转置生成的序列,变成 1 行 N s a m p Nsamp Nsamp
    3. kron(ones(Nsamp), LinRange(-4, 4, Nsamp)')
      • 取 Kronecker 积,相当于把 LinRange(-4, 4, Nsamp)' 的每一行重复 N s a m p Nsamp Nsamp次,生成一个矩阵,每一行都是相同的 -4到 4 的序列
3. 生成重复列的矩阵
Ysamp = kron(ones(Nsamp)', LinRange(-4, 4, Nsamp))
  • 目的:生成一个矩阵,其中每一列都是从 -4 到 4 的序列,用于表示二维网格中 y y y 方向的坐标。
  • 分解解释
    1. ones(Nsamp)' 转置生成的全 1 行向量。
    2. LinRange(-4, 4, Nsamp) 是纵轴的序列。
    3. kron(ones(Nsamp)', LinRange(-4, 4, Nsamp))
      • Kronecker 积相当于把 LinRange(-4, 4, Nsamp) 的每一列重复 N s a m p Nsamp Nsamp次,生成一个矩阵,每一列都是相同的 -4 到 4 的序列。

结果:二维网格的坐标点

对于 N s a m p = 3 Nsamp = 3 Nsamp=3的网格生成,横轴和纵轴的坐标矩阵如下:
在这里插入图片描述

横轴 x x x 坐标矩阵 X s a m p Xsamp Xsamp
  • LinRange(-4, 4, Nsamp)' 生成了一个行向量:[-4.0, 0.0, 4.0]
  • ones(Nsamp) 生成了一个列向量:[1.0; 1.0; 1.0](3 行 1 列)。
  • kron(ones(Nsamp), LinRange(-4, 4, Nsamp)')
    • Kronecker 积的规则:将 ones(Nsamp) 的每个元素与行向量 LinRange(-4, 4, Nsamp)' 相乘,并将结果堆叠。
    • 这里,相乘后,每一行都复制了 [-4.0, 0.0, 4.0],形成了一个 3 × 3 3 \times 3 3×3的矩阵,每一行相同。表示 x x x 坐标沿着纵轴重复。
纵轴 y y y坐标矩阵 Y s a m p Ysamp Ysamp

每一列的值相同,表示 y y y 坐标沿着横轴重复。

网格点组合 ( x , y ) (x, y) (x,y)

X s a m p [ j , k ] Xsamp[j, k] Xsamp[j,k] Y s a m p [ j , k ] Ysamp[j, k] Ysamp[j,k] 组合起来,得到网格点,对应的二维平面排列为:

(-4.0, -4.0)   (0.0, -4.0)   (4.0, -4.0)
(-4.0,  0.0)   (0.0,  0.0)   (4.0,  0.0)
(-4.0,  4.0)   (0.0,  4.0)   (4.0,  4.0)

定义牛顿法步进

# 定义牛顿法的单步更新函数
function newton_step(x0, λ0)
    # 计算目标函数的 Hessian 和约束的二阶导数项
    H = ∇2f(x0) + ForwardDiff.jacobian(x -> ∂c(x)' * λ0, x0)
    C = ∂c(x0)  # 计算约束的导数
    # 形成 KKT 系统,并求解增量 Δz
    Δz = [H C'; C 0] \ [-∇f(x0) - C' * λ0; -c(x0)]
    Δx = Δz[1:2]  # 更新变量 x 的增量
    Δλ = Δz[3]    # 更新拉格朗日乘子 λ 的增量
    return x0 + Δx, λ0 + Δλ  # 返回更新后的 x 和 λ
end
  • 功能
    1. 计算目标函数的 Hessian 和约束的 Jacobian 矩阵。
    2. 形成 KKT 系统并求解增量 Δ z = [ Δ x ; Δ λ ] \Delta z = [\Delta x; \Delta \lambda] Δz=[Δx;Δλ]
    3. 更新变量 x x x 和拉格朗日乘子 λ \lambda λ
  • 参数
    • x0:当前变量的初值。
    • λ0:当前拉格朗日乘子的初值。

使用牛顿法求解

# 初始化优化变量和拉格朗日乘子的初始值
xguess = [-3; 2]  # 初始变量 x 的值
λguess = [0.0]    # 初始拉格朗日乘子 λ 的值

# 绘制初始点和优化路径
plot_landscape()
plot(xguess[1], xguess[2], "rx")  # 标记初始点
# 执行一次牛顿法迭代
xnew, λnew = newton_step(xguess[:, end], λguess[end])
# 更新变量的轨迹
xguess = [xguess xnew]
λguess = [λguess λnew]

# 绘制更新后的路径
plot_landscape()
plot(xguess[1, :], xguess[2, :], "rx")  # 标记新的优化路径
# 计算 Hessian 矩阵和约束的二阶导数,用于调试
H = ∇2f(xguess[:, end]) + ForwardDiff.jacobian(x -> ∂c(x)' * λguess[end], xguess[:, end])
  • 功能
    1. 初始化优化变量 xguess 和拉格朗日乘子 λguess
    2. 进行一次牛顿法迭代。
    3. 绘制优化路径。
      在这里插入图片描述

定义高斯-牛顿法步进

# 定义高斯-牛顿法的单步更新函数
function gauss_newton_step(x0, λ0)
    H = ∇2f(x0)  # 仅使用目标函数的 Hessian
    C = ∂c(x0)  # 计算约束的梯度
    # 形成简化的 KKT 系统,并求解增量 Δz
    Δz = [H C'; C 0] \ [-∇f(x0) - C' * λ0; -c(x0)]
    Δx = Δz[1:2]  # 更新变量 x 的增量
    Δλ = Δz[3]    # 更新拉格朗日乘子 λ 的增量
    return x0 + Δx, λ0 + Δλ  # 返回更新后的 x 和 λ
end
  • 功能
    1. 使用目标函数的 Hessian 矩阵,省略约束的曲率项
    2. 形成简化的 KKT 系统,求解增量 Δ z \Delta z Δz
    3. 更新变量 x x x 和拉格朗日乘子 λ \lambda λ
  • 参数
    • x0:当前变量的初值。
    • λ0:当前拉格朗日乘子的初值。

使用高斯-牛顿法求解

# 重新初始化优化变量和拉格朗日乘子的初始值
xguess = [-3; 2]  # 初始变量 x 的值
λguess = [0.0]    # 初始拉格朗日乘子 λ 的值

# 绘制初始点和优化路径
plot_landscape()
plot(xguess[1], xguess[2], "rx")  # 标记初始点

# 执行一次高斯-牛顿法迭代
xnew, λnew = gauss_newton_step(xguess[:, end], λguess[end])
# 更新变量的轨迹
xguess = [xguess xnew]
λguess = [λguess λnew]

# 绘制更新后的路径
plot_landscape()
plot(xguess[1, :], xguess[2, :], "rx")  # 标记新的优化路径
  • 功能
    1. 初始化优化变量和拉格朗日乘子。
    2. 进行一次高斯-牛顿法迭代。
    3. 绘制优化路径。
  • 参数
    • xguessλguess 是初始值,最终生成优化路径。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【国产MCU】-GD32F470-串行外设接口(SPI)

串行外设接口(SPI) 文章目录 串行外设接口(SPI)1、SPI介绍1.1 SPI特性1.2 SPI信号1.3 SPI 时序和数据帧格式1.4 NSS 功能1.5 SPI运行模式2、SPI控制器寄存器列表3、SPI控制器驱动API介绍4、SPI应用4.1 SPI初始化流程4.2 数据发送与接收串行外设接口(Serial Peripheral Int…

Docker安装ubuntu1604

首先pull镜像 sudo docker run -d -P m.daocloud.io/docker.io/library/ubuntu:16.04国内使用小技巧: https://github.com/DaoCloud/public-image-mirror pull完成之后查看 sudo docker images 运行docker sudo docker run -d -v /mnt/e:/mnt/e m.daocloud.io/…

2024 年:Kubernetes 包管理的新前沿

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计&#xf…

飞凌嵌入式T113-i开发板RISC-V核的实时应用方案

随着市场对嵌入式设备的功能需求越来越高,集成了嵌入式处理器和实时处理器的主控方案日益增多,以便更好地平衡性能与效率——实时核负责高实时性任务,A核处理复杂任务,两核间需实时交换数据。然而在数据传输方面,传统串…

VSCode 汉化教程【简洁易懂】

VSCode【下载】【安装】【汉化】【配置C环境(超快)】(Windows环境)-CSDN博客 我们安装完成后默认是英文界面。 找到插件选项卡,搜索“Chinese”,找到简体(更具你的需要)(…

【Mac】VMware Fusion Pro 安装 CentOS 7

1、下载镜像 CentOS 官网阿里云镜像网易镜像搜狐镜像 Mac M1芯片无法直接使用上述地址下载的最新镜像(7.9、9),会一直卡在安装界面(在 install 界面按 enter 回车无效),想要使用需要经过一系列操作&#…

运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部…

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式,枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述,如有错误,请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…

string的实际应用 -- 大数相加 、大数相乘

前言:哎,做题好难o(╥﹏╥)o,有时候想不到,而有时候则是想到了却没办法理清思路,转化为代码。有必要反思了┓(;_`)┏,是否是做的太少了,或是自己的基础欠缺。 大学总是有些迷茫~ ​​…

STM32-- keil 的option for target使用

keil版本号 1.device界面 如:stm32f103c8t6的工程,可以直接在device这里修改成stm32f103vct6,虽然引脚不一样,但是很多一样的地方,可以直接使用,有些不修改也可以下载程序。 2.target xtal的设置不起作用了…

shell脚本9完结,保姆篇---春不晚

免责声明 学习视频来自 B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 泷羽sec官网:http…

【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)

宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…

RabbitMQ和RocketMQ相关面试题

RabbitMQ和RocketMQ面试题 RabbitMQ1.RabbitMQ各部分角色2.如何确保RabbitMQ消息的可靠性?3.什么样的消息会成为死信?4.死信交换机的使用场景是什么?5.TTL6.延迟队列7.消息堆积问题8.MQ集群 RocketMQ1.RocketMQ各部分角色2.RocketMQ如何保证高…

在kali用msfpc远程控制Windows

本次实验我们将使用msfpc生成windows下的被控端,并使用metasploit渗透工具进行远程控制。 一、实验环境 Windows主机IP: 192.168.167.1 虚拟机Kali IP: 192.168.167.100 二、实验过程 1、安装msfpc apt-get install msfpc 2、生成windows…

SDIO WIFI模组Clock EMC问题

问题: 某产品采用SDIO3.0的WIFI模组,测试3米场地辐射出现333MHz和500MHz频点超标。 分析: 1、一开始分析板子上没有对应333MHz,499.5MHz的频点倍频,因此直接拔掉产品上所有的外部接线,测试还是超标。表明辐射源头出…

MCU(一) 时钟详解 —— 以 GD32E103 时钟树结构为例

微控制器 (MCU) 的时钟系统是系统运行的核心,它提供了各模块所需的时钟信号。本文以 GD32E103 系列 MCU 为例,详细讲解其 时钟树结构(Clock Tree)。通过理解时钟源、分配与预分频器设置,可以灵活配置系统时钟以实现高性…

【方案库】从单张照片快速重建3D场景:Flash3D详解

一、Flash3D是什么? Flash3D 是一项革命性的AI技术,能够从单张普通照片快速重建3D场景。简单来说,你只需要提供一张照片,Flash3D 就能帮你还原出这个场景的立体效果。这项技术在房地产、建筑设计、虚拟现实等多个领域都有着广泛的应用前景。 二、主要特点 一张就够:只需…

QT QFormLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizonta…

如何在 Ubuntu 22.04 上安装 Metabase 数据可视化分析工具

简介 Metabase 提供了一个简单易用的界面,让你能够轻松地对数据进行探索和分析。通过本文的指导,你将能够在 Ubuntu 22.04 系统上安装并配置 Metabase,并通过 Nginx 进行反向代理以提高安全性。本教程假设你已经拥有了一个非 root 用户&…

c#:winform调用bartender实现打印(学习整理笔记)

效果 学习路径 C# winform调用Bartender进行自定义打印、批量打印、检索文件夹中的模板_哔哩哔哩_bilibili 一、初始环境搭建见: c#:winform引入bartender-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/143989473?sharetypeblogdetail&s…