matlab使用教程(22)—非线性优化函数的设置

1.设置优化选项

        可以使用由 optimset 函数创建的 options 结构体来指定优化参数。然后,可以将 options 作为输入传递给优化函数,例如,通过使用以下语法调用 fminbnd
x = fminbnd(fun,x1,x2,options)
        或使用以下语法调用 fminsearch
x = fminsearch(fun,x0,options)
        例如,要显示算法在每次迭代中的输出,请将 Display 选项设置为 'iter'
options = optimset( 'Display' , 'iter' );

1.1 容差和终止条件

        优化中的迭代次数取决于求解器的终止条件。这些条件包括几个可以设置的容差。一般来说,容差是一个阈值,超过阈值时将终止求解器的迭代。
        提示: 一般情况下,将 TolFun TolX 容差设置为远高于 eps 并通常高于 1e-14。设置小容差并不能保证得到精确的结果。相反,求解器在收敛时无法识别,并可能继续进行无用的迭代。容差值小于 eps 实际上是禁用了这种终止条件。此技巧不适用于 fzero ,它为 TolX 使用默认值 eps
        • TolX 是步长的下界,表示 (x i – x i+1 ) 的范数。如果求解器尝试小于 TolX 的步长,则终止迭代。求解器通常将 TolX 用作相对边界,表示在达到 |(x i – x i+1 )| < TolX *(1 + |x i |) 或类似的相对测度时终止迭代。
        • TolFun 是步长中目标函数值变化的下边界。如果 |f(x i ) – f(x i+1 )| < TolFun,则终止迭代。求解器通常将 TolFun 用作相对边界,表示在达到 |f(x i ) – f(x i+1 )| < TolFun (1 + |f(x i )|) 或类似的相对测度时终止迭代。
        • MaxIter 是求解器迭代数量的边界。 MaxFunEvals 是函数求值数量的边界。
        注意:与其他求解器不同, fminsearch 在同时满足 TolFun TolX 时停止运行。

1.2 输出结构体

        output 结构体包括函数计算次数、迭代次数和算法。当为 fminbnd fminsearch fzero 提供第四个输出参数时,将显示此结构体,如下所示
[x,fval,exitflag,output] = fminbnd(@humps,0.3,1);
        函数参考页面上提供了每个求解器的 output 结构体的详细信息。
        output 结构体选项不能选择用于 optimset 。它是 fminbnd fminsearch fzero 的可选输出。

2.优化求解器迭代输出

        通过使用 optimset Display 选项设置为 'iter',可以获取求解器采取的步骤的详细信息。显示的输出包含以下列表中的标题和项。

3. 优化求解器输出函数

        输出函数是优化函数在算法的每次迭代过程中调用的函数。通常,使用输出函数生成图输出,记录算法生成的数据的历史信息,或者根据当前迭代的数据暂停算法。可以按函数文件、局部函数或嵌套函数的形式创建输出函数。
        OutputFcn 选项可以与下列 MATLAB 优化函数配合使用:
        • fminbnd
        • fminsearch
        • fzero

3.1 创建和使用输出函数

        下面给出了输出函数的一个简单示例,该输出函数绘制优化函数生成的点。
function stop = outfun(x, optimValues, state)
stop = false;
hold on;
plot(x(1),x(2),'.');
drawnow
        在解算以下优化问题时,可以使用此输出函数绘制 fminsearch 生成的点
        为此,
        1 创建一个包含前述代码的文件,并将其作为 outfun.m 保存在 MATLAB 路径的文件夹中。
        2 options 结构体的 Outputfcn 字段的值设置为 outfun 的函数句柄。
options = optimset( 'OutputFcn' , @outfun);
        3 输入以下命令:
hold on
objfun=@(x) exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));
[x fval] = fminsearch(objfun, [-1 1], options)
hold off
        这些命令返回解
x =
0.1290 -0.5323
fval =
-0.5689
        并显示以下关于 fminsearch 生成的点的绘图:

3.2 输出函数的结构体

        输出函数的函数定义行采用以下格式:
stop = outfun(x, optimValues, state)
        其中
        • stop 是一个标志,根据优化例程是停止还是继续,该标志为 true false。。
        • x 是算法在当前迭代中计算的点。
        • optimValues 是包含当前迭代中的数据的结构体。
        • state 是算法的当前状态。。
        优化函数在每次迭代中将输入参数的值传递给 outfun

3.3 嵌套输出函数的示例

        示例不需要输出函数在每次迭代后保留数据。如果不需要保存各次迭代之间的数据,可以将输出函数编写为函数文件,并从命令行直接调用优化函数。但是,要使输出函数在每次迭代后记录数据,请编写一个用于实现以下目的的文件:
        • 以嵌套函数的形式包括输出函数 - 有关详细信息,请参阅 MATLAB 编程基础中的“嵌套函数”。
        • 调用优化函数。
        在以下示例中,函数文件还包含目标函数作为局部函数。您也可以将目标函数编写为单独的文件或匿名函数。
        嵌套函数可以访问其所在的文件中的变量。因此,此方法使输出函数能够在每次迭代后保留变量。
        以下示例使用输出函数记录以下求解中的 fminsearch 迭代:

        输出函数以矩阵(称为 history)的形式返回点序列。要运行此示例,请执行下列步骤:
        1使用 MATLAB 编辑器打开一个新文件。
        2 将以下代码复制并粘贴到此文件。
function [x fval history] = myproblem(x0)
history = [];
options = optimset( 'OutputFcn' , @myoutput);
[x fval] = fminsearch(@objfun, x0,options);
function stop = myoutput(x,optimvalues,state);
stop = false;
if isequal(state, 'iter' )
history = [history; x];
end
end
function z = objfun(x)
z = exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));
end
end
        3 将文件作为 myproblem.m 保存到 MATLAB 路径上的某个文件夹中。
        4 在 MATLAB 提示符下,输入
        [x fval history] = myproblem([-1 1]);
        函数 fminsearch 返回最佳点 x 及 x 处的目标函数值 fval
x,fval
x =
0.1290 -0.5323
fval =
-0.5689
        此外,输出函数 myoutput 向 MATLAB 工作区返回矩阵 history,该矩阵包含算法在每次迭代中生成的点。 history 的前四行为
history(1:4,:)
ans =
-1.0000 1.0000
-1.0000 1.0000
-1.0750 0.9000
-1.0125 0.8500
        history 最后一行的点与最佳点 x 相同。
history(end,:)
ans =
0.1290 -0.5323
objfun(history(end,:))
ans =
-0.5689

3.4 optimValues 中的字段

        下表列出了由优化函数 fminbnd fminsearch fzero 提供的 optimValues 结构体的字段。表的“命令行显示标题”列中列出了将 options Display 参数设置为 'iter' 时显示的标题。

3.5 算法的状态

        下表列出了 state 的可能值:

 

        下面的代码演示输出函数如何使用 state 的值来确定要在当前迭代中执行的任务。
switch state
case 'init'
% Setup for plots or dialog boxes
case 'iter'
% Make updates to plots or dialog boxes as needed
case 'interrupt'
% Check conditions to see whether optimization
% should quit
case 'done'
% Cleanup of plots, dialog boxes, or final plot
end

3.6 Stop 标签

        输出参数 stop true false 的标签。此标志通知优化函数优化是停止 ( true ) 还是继续 ( false)。下面的示例演示了使用 stop 标签的典型方法。
        1)根据 optimValues 中的数据停止优化
        输出函数可以根据 optimValues 中的当前数据在任何迭代中停止优化。例如,下面的代码在目标函数值小于 5 时将 stop 设置为 true
function stop = myoutput(x, optimValues, state)
stop = false;
% Check if objective function is less than 5.
if optimValues.fval < 5
stop = true;
end
        2)基于对话框输入停止优化
        在设计 UI 来执行优化时,可以采用控件(例如停止按钮)使输出函数停止优化。以下代码显示如何执行此回调。代码假定 停止 按钮回调将值 true 存储在名为 hObject handles 结构体的 optimstop 字段中,而该结构体又存储在 appdata 中。
function stop = myoutput(x, optimValues, state)
stop = false;
% Check if user has requested to stop the optimization.
stop = getappdata(hObject, 'optimstop' );

4.优化求解器绘制函数

        options 结构体的 PlotFcns 字段指定优化函数在每次迭代时调用的一个或多个函数,用于绘制各种进度测度。传递函数句柄或函数句柄的元胞数组。绘图函数的结构体与输出函数的结构体相同。
        PlotFcns 选项可以与下列 MATLAB 优化函数配合使用:
        • fminbnd
        • fminsearch
        • fzero
        这些优化函数的预定义绘图函数包括:
        • @optimplotx 绘制当前点
        • @optimplotfval 绘制函数值
        • @optimplotfunccount 绘制函数计数(不适用于 fzero
        要查看或修改预定义的绘图函数,请使用 MATLAB 编辑器打开函数文件。例如,要查看函数文件以便绘制当前点,请输入:
edit optimplotx.m
        例如,想要查看使用 fminsearch 与绘图函数 @optimplotfval 求最小值的进度:
        1 为目标函数编写一个文件。在本示例中,使用:
function f = onehump(x)
r = x(1)^2 + x(2)^2;
s = exp(-r);
f = x(1)*s+r/20;
        2 设置 options 以便使用绘图函数:
options = optimset( 'PlotFcns' ,@optimplotfval);
        3 从 [2,1] 起调用 fminsearch
[x ffinal] = fminsearch(@onehump,[2,1],options)
        4 MATLAB 返回以下内容:
x =
-0.6691 0.0000
ffinal =
-0.4052

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

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

相关文章

C#与西门子PLC1500的ModbusTcp服务器通信4--搭建ModbusTcp客户端

1、客户端选择 客户端可以是一个程序或一个设备&#xff0c;这里我以C#WINFORM程序来实现客户机与PLC的Modbustcp服务器通信&#xff0c;开发环境是VS2019&#xff0c;.NET Framework版本是4.7.2 2、创建winform程序 3、引入Nmodbus4协议 找到项目&#xff0c;找到引用&…

[k8s] 基于ubuntu22部署k8s1.28记录

k8s1.28部署已经不依赖docker了&#xff0c;所以不需要安装docker。同理&#xff1a;如果想查看镜像和运行容器&#xff0c;也不能用docker命令去查询了&#xff1a;需要使用crictl。不过crictl命令参数兼容docker&#xff0c;所以使用上手没有啥难度。 1. 配置安装源 根据k8…

IntelliJ IDEA maven配置,设置pom.xml的配置文件

IntelliJ IDEA项目&#xff0c;选择 文件 设置&#xff0c;弹窗 构建、执行、部署 构建工具 Maven就可以 maven配置好以后&#xff0c;在pom.xml的配置文件中就可以设置对应的jar包了&#xff0c;这样构建的时候自动需要的jar&#xff0c;在项目中导入即 需要的jar包设置在po…

大数据Flink(六十六):Flink的重要概念和小结

文章目录 Flink的重要概念和小结 一、​​​​​​​​​​​​​​数据流图(Dataflow Graph)

软考高级系统架构设计师系列论文七十二:论虚拟现实技术的应用与发展

软考高级系统架构设计师系列论文七十二:论虚拟现实技术的应用与发展 一、摘要二、正文三、总结一、摘要 本文介绍了虚拟现实技术的主要技术和应用,并结合作者本人参加的国家重点实验室的自然科学基金项目,重点讨论了基于图像的建模与绘制在虚拟现实中的重要地位与应用,详细…

解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题

解锁ChatGLM-6B的潜力&#xff1a;优化大语言模型训练&#xff0c;突破任务困难与答案解析难题 LLM&#xff08;Large Language Model&#xff09;通常拥有大量的先验知识&#xff0c;使得其在许多自然语言处理任务上都有着不错的性能。 但&#xff0c;想要直接利用 LLM 完成…

【rust/egui】(四)看看template的app.rs:update以及组件TopBottomPanelButton

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 update update实际上还是eframe::App的…

粒子物理学导言

核物理 凝聚态物理天体物理核技术应用 粒子物理学导言 粒子物理学导言 正电子的发现 C.D.Anderson1932年8月2日&#xff0c;美国加州理工学院C.D.Anderson在云室照片中发现一条与电子径迹相似&#xff0c;方向相反的径迹相对论电子波动方程---狄拉克方程 中微子的发现 1914…

前端命令npm 、 cnpm、 pnpm、yarn 、 npx、nvm的区别

大名鼎鼎的npm(Node Package Manager)是随同NodeJS一起安装的包管理工具&#xff0c;NPM本身也是Node.js的一个模块。 npm的含义有两层: npm服务器&#xff0c;npm服务器网址为https://www.npmjs.org&#xff0c;npm是 Node 包的标准发布平台&#xff0c;用于 Node 包的发布、…

自研分布式IM-HubuIM RFC草案

HubuIM RFC草案 消息协议设计 基本协议 评估标准 【性能】协议传输效率&#xff0c;尽可能降低端到端的延迟&#xff0c;延迟高于200ms用户侧就会有所感知 【兼容】既要向前兼容也要向后兼容 【存储】减少消息包的大小&#xff0c;降低空间占用率&#xff0c;一个字节在亿…

最新AI系统ChatGPT程序源码/微信公众号/H5端+搭建部署教程+完整知识库

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

二级MySQL(五)——完整性约束练习

在MYSQL中&#xff0c;通常用来指定一个已有数据库作为当前数据库的语句是【USE】 下列选项中不是MYSQL中常用数据类型的是【VAR】 在MYSQL中&#xff0c;常用【NULL】表示一个字段没有值或缺值 在CREATE TABLE语句中&#xff0c;通常使用【PRIMARY KEY】关键字来指定主键 …

IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤

dc3 windows 本地搭建步骤&#xff1a; ​​ 必要软件环境 进入原网页# 务必保证至少需要给 docker 分配&#xff1a;1 核 CPU 以及 4G 以上的运行内存&#xff01; JDK : 推荐使用 Oracle JDK 1.8 或者 OpenJDK8&#xff0c;理论来说其他版本也行&#xff1b; Maven : 推荐…

nodejs根据pdf模板填入数据并生成新的pdf文件

导入pdf-lib库 npm install pdf-lib fs 具体代码 const { PDFDocument, StandardFonts } require(pdf-lib); const fs require(fs);async function fillPdfTemplate(templatePath, outputPath, fieldData) {const templateBytes await fs.promises.readFile(templatePath…

【视觉SLAM入门】5.2. 2D-3D PNP 3D-3D ICP BA非线性优化方法 数学方法SVD DLT

"养气之学&#xff0c;戒之躁急" 1. 3D-2D PNP1.1 代数法1.1.1 DLT(直接线性变换法)1.1.2. P3P 1.2 优化法BA (Bundle Adjustment)法 2. 3D-3D ICP2.1 代数法2.1.1 SVD方法 2.2 优化(BA)法2.2.2 非线性优化方法 前置事项&#xff1a; 1. 3D-2D PNP 该问题描述为&am…

记录《现有docker中安装spark3.4.1》

基础docker环境中存储hadoop3--方便后续查看 参考&#xff1a; 实践&#xff1a; export JAVA_HOME/opt/apache/jdk1.8.0_333 export SPARK_MASTER_IP192.168.0.220 export SPARK_WORKER_MEMORY4g export SPARK_WORKER_CORES2 export SPARK_EXECUTOR_MEMORY4g export HADOOP_H…

Mongodb两种启动方法

一、命令行启动 1.修改存放数据库的位置 说明&#xff1a;E:\data\mongodb&#xff1b;我在E盘创建的文件夹mongodb mongod --dbpathE:\data\mongodb 2.成功启动 说明&#xff1a;默认端口27017&#xff0c;代表已经启动成功 &#xff0c;并在mongodb自动创建文件 二、配置项…

华为AR路由器 典型配置案例——以太网交换

目录 Eth-Trunk 例&#xff1a;配置三层链路聚合 组网需求 操作步骤 检查配置结果 配置脚本 VLAN 举例&#xff1a;配置基于接口划分VLAN&#xff0c;实现同一VLAN内的互通&#xff08;同设备&#xff09; 组网需求 操作步骤 检查配置结果 配置脚本 举例&#xff…

TCP半连接队列和全连接队列

目录 什么是 TCP 半连接队列和全连接队列&#xff1f; TCP 全连接队列溢出 如何知道应用程序的 TCP 全连接队列大小&#xff1f; 如何模拟 TCP 全连接队列溢出的场景&#xff1f; 全连接队列溢出会发生什么 ? 如何增大全连接队列呢 ? TCP 半连接队列溢出 如何查看 TC…

22款美规奔驰S500升级原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶&#xff0c;可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出&#xff0c;并且在关闭后能够立刻散去。车内气味不会永久改变&#xff0c;香氛…