MATLAB:梯度下降法求解一元和多元函数极小值和极大值

2023-05-16

梯度下降法,顾名思义即通过梯度下降的方法。对于一个函数而言,梯度是一个向量,方向是表示函数值增长最快的方向,而大小则表示该方向的导数。下面展示了用梯度下降法求解一元函数(x-1)^2的MATLAB代码:

syms x;

y = @(x)((x-1).^2); % 定义一元函数

dy = diff(y,x); % 一元函数导数

x = 7; % 梯度初始值

l = 0.1; % 梯度下降步长

err = inf; % 定义初始误差

Total_x = []; % 存储每次梯度下降的x值

Total_y = []; % 存储每次梯度下降的y值

i = 0;

while i <= 100

i = i + 1;

y1 = y(x); % 获取当前的函数值

x = x - l * double(subs(dy,x)); % 更新x

y2 = double(subs(y,x)); % 获取进行一次梯度下降后的函数值;

err = abs(y1-y2); % 求误差

Total_x = [Total_x;x]; % 收集梯度变化的x值

Total_y = [Total_y;y2]; % 收集梯度变化的y值

if err <= 10^-10 % 当函数值变化小于阈值时,跳出循环

break;

end

end

disp(Total_x); % 输出Total_x

%% 可视化过程

x = -5:0.1:7; % 设定x范围

figure;

plot(x,y(x)); % 绘制函数曲线图像

hold on; % 在函数曲线图像上,继续绘制图像

scatter(Total_x,Total_y); % 绘制散点图

title("y = (x-1)^2"); % 取标题

仿真结果如下:

下面展示了用梯度下降法求解二元函数(x-1)^{2}+(y-1)^{2}的MATLAB代码:

syms x y;

z = @(x,y)((x-1)^2+(y-1)^2); % 定义二元函数

dzx = diff(z,x); % 一元函数导数

dzy = diff(z,y);

x = 3; % x梯度初始值

y = 3; % y梯度初始值

subs(z,x,y)

l = 0.1; % 梯度下降步长

err = inf; % 定义初始误差

Total_x = []; % 存储每次梯度下降的x值

Total_y = []; % 存储每次梯度下降的y值

Total_f = []; % 存储每次梯度下降的z值

i = 0;

while i <= 100

i = i + 1;

c_f = z(x,y); % 获取进行梯度变化前的y值

x = x - l * double(subs(dzx,x)); % 更新x

y = y - l * double(subs(dzy,y));

n_f = z(x,y); % 获取进行梯度变化后的y值

err = abs(c_f-n_f); % 求误差

Total_x = [Total_x;x];

Total_y = [Total_y;y];

Total_f = [Total_f;n_f ];

if err <= 10^-10 % 当误差小于等于指定阈值时,跳出循环

break;

end

end

disp("Total_y");

x = -2:0.1:2; % 设定x范围

y = -2:0.1:2; % 设定y范围

[xx,yy]=meshgrid(x,y);

figure;

zz = (xx-1).^2+(yy-1).^2;

surf(xx,yy,zz); % 绘制函数曲线图像

hold on; % 在函数曲线图像上,继续绘制图像

scatter3(Total_x,Total_y,Total_f); % 绘制散点图

title("y = (x-1)^2+(y-1)^2"); % 取标题

 仿真结果如下:

当然,梯度下降方法也可以求解最大值,例如:采用梯度下降法求解-(x-1)^{2}-(y-1)^{2}最大值的MATLAB代码如下:

syms x y;

z = @(x,y)(-(x-1)^2-(y-1)^2); % 定义二元函数

dzx = diff(z,x); % 一元函数导数

dzy = diff(z,y);

x = -3; % x梯度初始值

y = -3; % y梯度初始值

subs(z,x,y)

l = 0.1; % 梯度下降步长

err = inf; % 定义初始误差

Total_x = []; % 存储每次梯度下降的x值

Total_y = []; % 存储每次梯度下降的y值

Total_f = []; % 存储每次梯度下降的z值

i = 0;

while i <= 100

i = i + 1;

c_f = z(x,y); % 获取进行梯度变化前的y值

x = x + l * double(subs(dzx,x)); % 更新x

y = y + l * double(subs(dzy,y));

n_f = z(x,y); % 获取进行梯度变化后的y值

err = abs(c_f-n_f); % 求误差

Total_x = [Total_x;x];

Total_y = [Total_y;y];

Total_f = [Total_f;n_f ];

if err <= 10^-10 % 当误差小于等于指定阈值时,跳出循环

break;

end

end

disp("Total_y");

x = -2:0.1:2; % 设定x范围

y = -2:0.1:2; % 设定y范围

[xx,yy]=meshgrid(x,y);

figure;

zz = -(xx-1).^2-(yy-1).^2;

surf(xx,yy,zz); % 绘制函数曲线图像

hold on; % 在函数曲线图像上,继续绘制图像

scatter3(Total_x,Total_y,Total_f); % 绘制散点图

title("y = -(x-1)^2-(y-1)^2"); % 取标题

 仿真结果如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB:梯度下降法求解一元和多元函数极小值和极大值 的相关文章

  • MATLAB中给定一组向量,如何获得最大独立向量?

    如果给我一组向量 它们可以作为矩阵的列向量提供 并且我想获得最大独立向量 那么最好的方法是什么 我可以一次向结果集中添加一个向量 看看新形成的矩阵的秩是否增加 但我感觉效率不是很高 当然 我可以回去做高斯消元法来解决这个问题 但我只是想知道
  • 在 MATLAB 中使用 sprintf 显示变量的小数

    我不明白接下来会发生什么sprintf http www mathworks se help techdoc ref sprintf html命令 gt gt vpa exp 1 53 ans 2 718281828459045534884
  • 如何在matlab中检查字符串中的模式?

    我想检查字符串中是否存在特定模式来执行某些操作 filename pathname uigetfile fullpath pathname filename 在我的程序中 我只会浏览图片 所有图片都以该模式命名 cam1 jpg cam1
  • 如何在循环中连接字符串?

    我想创建一个 inputdlg 其中包含具有相似名称的各种行 例如测试 1 测试 2 测试 3 等 所以我正在寻找某种方法来连接字符串for环形 我尝试过类似的东西 formatSpec Test d a sprintf formatSpe
  • 如何绘制频谱图函数的结果?

    在我的图中 我有两个轴 第一个是信号的时间序列 第二个是信号的时间序列ifft信号的 我想添加包含信号频谱图的第三个轴 我怎样才能做到这一点 Create the raw signal fs 40 t 0 1 fs 4 y1 sin 2 p
  • 在 MATLAB 中数值计算复值函数的导数

    我想在 MATLAB 中以数值方式计算复值函数 全纯函数 的导数 我已经计算了复平面上网格中的函数 并且尝试使用柯西 黎曼关系来计算导数 鉴于 u 实数 f v imag f x 实数 点 y imag 点 导数应由下式给出 f du dx
  • Matlab - 神经网络训练

    我正在努力创建一个具有反向传播的 2 层神经网络 神经网络应该从 20001x17 向量获取数据 该向量在每行中包含以下信息 前 16 个单元格包含从 0 到 15 的整数 它们充当变量 帮助我们确定在看到这些变量时要表达的 26 个字母中
  • 将 3D 矩阵与 2D 矩阵相乘

    假设我有一个AxBxC matrix X and a BxD matrix Y 是否有一种非循环方法可以将每个C AxB矩阵与Y 作为个人喜好 我希望我的代码尽可能简洁和可读 这是我会做的 尽管它不符合您的 无循环 要求 for m 1 C
  • 使用 MATLAB 读取 CSV 文件?

    我正在尝试使用 MATLAB 读取 csv 文件 这是我的代码 csvread out2 csv out2 csv 如下所示 03 09 2013 23 55 12 129 32 129 33 03 09 2013 23 55 52 129
  • 分割车牌字符

    我在从车牌图像中分割字符时遇到问题 我应用了以下方法来提取车牌字符 车牌图像的自适应阈值 选择具有特定纵横比的轮廓 如果车牌图像中有任何阴影 如附件中所示 由于二值化不正确 我无法正确分割字符 图像中的阴影合并图像中的相邻字符 我已经对具有
  • Matlab更新子图并坚持下去

    我在更新子图时遇到问题 我将我的问题归结为以下示例 win figure 1 win sub1 subplot 2 2 1 win sub2 subplot 2 2 2 win sub3 subplot 2 2 3 win sub4 sub
  • MATLAB - 函数的多个返回值?

    我正在 matlab 中编写 2 个函数 一个初始化函数和一个将项目插入数组的函数 将其视为双向链表 但是 我的初始化函数仅返回 ans 和初始化的数组 我怎样才能让它也设置其他变量的值 这是我的代码 function array list
  • 隐藏图中某些图形对象的 MATLAB 图例条目

    MATLAB 图例列出了绘图中的所有内容 包括您在绘图上放置的指南 绕过这个问题的软糖就是要做的 Plot Add legend Add guidelines 然而 MATLAB 将最新的行放在前面 这意味着指南将位于显示的数据之上 丑陋且
  • MatLab 中的输出有小数点的上限 [重复]

    这个问题在这里已经有答案了 我修改了 MatLab 中的一些代码 以便它可以给出函数 cos x 3 x 的根 当我运行代码并要求它返回 xnew 的值 因为 xnew 应该等于函数的根 时 它仅将 xnew 返回到小数点后 4 位 我希望
  • DYMOLA:opc 服务器如何使用 MATLAB 使用 dsin.txt 或 mat 文件进行初始化

    我在 DYMOLA 中创建了一个 OPC 服务器 现在我在 DYMOSIM 中有这个可以单击并初始化 使用 dsin txt 的 MAT 文件 现在我在 MATLAB 中创建了一个 GUI 文件 并获取变量的输入并创建了一个 mat 文件
  • 使用 Polyfit 进行垂直线拟合

    这只是一个基本问题 我正在使用拟合线来分散点polyfit 在某些情况下 我的散点具有相同的 X 值并且polyfit无法在其上放置一条线 必须有某种东西可以处理这种情况 毕竟 它只是一个线配合 我可以尝试交换 X 和 Y 然后再画一条线
  • SPMD 与 Parfor

    我对 matlab 中的并行计算很陌生 我有一个创建分类器 SVM 的函数 我想用几个数据集来测试它 我有一个 2 核工作站 所以我想并行运行测试 有人可以向我解释一下以下之间的区别 dataset array dataset1 datas
  • MATLAB 颜色条刻度标记错误?

    我正在绘制 9 个子图 如下图所示 其中一个颜色条代表三个子图 在这里我想将颜色条中的最高值显示为 gt value 令人惊讶的是 当我手动将刻度标签编辑为h TickLabels end gt h TickLabels end 颜色条开始
  • 使用二进制遮罩遮罩 RGB 图像

    我在 MATLAB 中读入了一个 RGB 图像 M x N x 3 矩阵 我还有一个图像的二进制掩码 M x N 矩阵 对于某些感兴趣的区域来说它只是 0 而其他地方都是 1 我正在尝试找出如何使用该二进制掩码来掩蔽 RGB 图像 我尝试过
  • 笛卡尔散点图上的极坐标网格线

    我有一个脚本来创建散点图 使用gscatter 基于另一个脚本生成的 x y 数据 离散数据点 不连续 由于这些数据点实际上是圆形空间中某些对象的位置 因此添加极坐标网格线将使绘图更有意义 有谁知道如何在笛卡尔散点图上显示极坐标网格线 或者

随机推荐

  • 妄图用多线程控制ROS的消息回调函数的输出-_-!

    今天需要用一个标志位来决定回调函数是否执行 xff0c 那这边先写一个chatter的publish xff0c 10Hz外发 xff1b 这边准备额外多一个线程控制唤醒回调函数 首先在接收节点程序中 xff0c 写一个互斥锁和条件变量 x
  • 韦东山:机会总是留给有准备的人(转)

    最近电子发烧友 xff08 以下称 39 发烧友 39 xff09 采访了韦东山老师 xff0c 本文是采访原稿 xff0c 展示出来让大家更深入了解韦老师的同时也进一步学习嵌入式Linux经验 机会总是留给有准备的人 发烧友 为什么要学习
  • MYSQL:Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    使用Qt5 11 0运行代码时 xff0c 在对表进行操作时出该错误 xff0c 报错为 xff1a Expression 2 of SELECT list is not in GROUP BY clause and contains no
  • Ubuntu 20.04 搜狗输入法安裝

    本文基于 解决Ubuntu 18 04中文输入法的问题 xff0c 安装搜狗拼音 修改 参考 ubuntu 20 04 安装好搜狗输入法无法输入中文 xff0c 只能输入英文的问题 xff0c 因为没有安装依赖 如果本篇还解决不了问题 xf
  • www服务

    www服务 1 概述 1 1 WWW服务简介 www服务全称为World Wide Web xff0c 常称为Web xff0c 中文译为 万维网 它是目前互联网上最受用户欢迎的信息服务形式 HTTP协议的WWW服务应用的默认端口为80 x
  • NUC11 PAHi5 拆机及清理灰尘

    这个NUC买了两年了 xff0c 现在正值春天 xff0c 温度还算适中 xff0c 20度左右 xff0c NUC就挂了两个下载任务 xff0c 开了网页 xff0c 风扇就狂转不停 xff0c 一查看cpu温度达到了70度 xff0c
  • 华为云服务器使用教程

    华为云服务器初始化 账户密码初始化远程登录的问题命令行界面登录文件传输图形界面win10的远程桌面登录centos6 账户 账户根据你选择的服务器的系统来定 xff0c 如果是Linux则是root xff0c 如果是windows则是ad
  • 一劳永逸解决Matplotlib中文和负号显示错误并给出RuntimeWarning的问题

    出错情况 xff1a 提示 xff1a RuntimeWarning Glyph XXXXX missing from current font font set text s 0 0 flags 61 flags 同时中文 负号以方框代替
  • 使用Python实现二分图的KM算法在出租车订单匹配上的应用

    1 需求 想要使用Python实现一个出租车仿真环境 xff0c 其中每个时间窗口内产生的request及其周围的taxi满足一个二分图的关系 原本计划request与taxi之间的匹配按照接客时间权值最小为目标进行匹配 xff0c 但是后
  • 人脸识别Haar算法总结

    参考https blog csdn net zhangbijun1230 article details 81676792
  • 【转帖】【详细】Notepad++使用心得和特色功能介绍 -> notepad/ultraedit的最好的替代品...

    notepad 43 43 简介 Notepad 43 43 是旨在替代Windows默认的notepad而生 xff0c 比notepad的功能强大很多很多 Notepad 43 43 有两个版本 xff0c 一个是ANSI版本 xff0
  • stm32--工程结构的简单理解

    作为一个新手入门stm32的同学 xff0c 我也就做了一个比较简单的工程 xff0c 但是感觉自己并没有对这个stme32有一个比较好的理解 xff0c 因此 xff0c 由于工作原因 xff0c 需要帮别人调试程序 xff0c 在移植工
  • FreeRTOS移植STM32

    第一步 xff1a FreeRTOS官网 https www freertos org https www freertos org 第二步 xff1a OS移植文件 复制 FreeRTOSv202104 00 FreeRTOS Sourc
  • freeOS-----primask faultmask basepri中断屏蔽寄存器

    primask暂时屏蔽中断寄存器 在许多应用中 需要暂时屏蔽所有的中断一执行一些对时序要求严格的任务 这个时候就 可以使用 PRIMASK 寄存器 PRIMASK 用于禁止除 复位 NMI 不可屏蔽中断 和 HardFalut 硬故障寄存器
  • freeOS快速笔记-----任务4种状态

    运行态 当一个任务正在运行时 那么就说这个任务处于运行态 处于运行态的任务就是当前正在 使用处理器的任务 如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态 就绪态 处于就绪态的任务是那些已经准备就绪 这些任务没有被阻
  • freeOS笔记-----列表与列表项

    xff08 2 xff09 uxNumberOfItems 用来记录列表中列表项的数量 xff08 3 xff09 pxIndex 用来记录当前列表项索引号 用于遍历列表 xff08 4 xff09 列表中最后一个列表项 用来表示列表结束
  • FreeRTOS快速笔记————队列

    队列 xff08 任务之间 全局变量 xff09 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行 消息传递一般使用全局变量的
  • FreeRTOS快速笔记——信号量

    信号量的阻塞时间 单位是系统的节拍周期configTICK RATE HZ 为100 xff0c 则系统节拍时钟周期为10ms xff0c 设置0就是不等待 xff0c 设置1 无限就是按时钟节拍算时间 xff0c 设置portMAX DE
  • Python获取Excel中超链接并下载至本地

    在这一任务的处理中 xff0c 我是用的是 xlrd模块 xff0c 它是用来读取Excel表格数据的模块 特别注意 xff1a 高版本的xlrd目前去除了对xlsx格式的支持 xff0c 仅支持 xls格式 xlrd biffh XLRD
  • MATLAB:梯度下降法求解一元和多元函数极小值和极大值

    梯度下降法 xff0c 顾名思义即通过梯度下降的方法 对于一个函数而言 xff0c 梯度是一个向量 xff0c 方向是表示函数值增长最快的方向 xff0c 而大小则表示该方向的导数 下面展示了用梯度下降法求解一元函数的MATLAB代码 xf