fmincon函数求解非线性超越方程的学习记录

news2024/9/24 21:19:33

最近的算法中用到了fmincon函数,寻找多变量非线性方程最小值的函数;因此学习一下;

fmincon函数的基础语法如下所示:

fmincon函数是为了求解下列方程的最小值;

b 和 beq 是向量,A 和 Aeq 是矩阵,c(x) 和 ceq(x) 是返回向量的函数,f(x) 是返回标量的函数。f(x)、c(x) 和 ceq(x) 可以是非线性函数。x、lb 和 ub 可以作为向量或矩阵传递;

1 应用一:求解线性不等式约束方程

x= fmincon(fun,x0,A,b),从 x0 开始,尝试在满足线性不等式 A*x<b 的情况下寻找 fun 中所述的函数的最小值点 xx0 可以是标量、向量或矩阵。

代码实例:

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

x0 = [-1,2];
A = [1,2];
b = 1;
x = fmincon(fun,x0,A,b)

代码功能:

函数:  f [x(1),x(2)] = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

从点[-1,2]开始求最小值,约束方程为: x(1)+2x(2) <= 1 。 这个方程的系数矩阵为 [1,2],最大值为1,因此设置 A = [1,2] , b = 1 ,最终函数以 A*x < b 形式表达此约束。

代码运行结果:

这个应用是较为简单的,总之就是通过fun设置函数;通过A和b的值设置约束方程;通过x0设值参数 x(1)和 x(2)的最小值;函数输出的结果x就是函数在满足约束条件达到最小值时的x(1)和 x(2)的大小;

2 应用二:线性不等式和等式共同约束的极值求解

在既有线性不等式约束又有线性等式约束的情况下求 Rosenbrock 函数的最小值。

将目标函数 fun 设置为 Rosenbrock 函数。

x = fmincon(fun,x0,A,b,Aeq,beq) : 在满足线性等式 Aeq * x = beq 以及不等式  A*x<b   的情况下最小化 fun。如果不存在不等式,则设置 A = [] 和 b = []

代码实例:
 

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

x0 = [0.5,0];
A = [1,2];
b = 1;
Aeq = [2,1];
beq = 1;
x = fmincon(fun,x0,A,b,Aeq,beq)

代码功能:

函数:  fun = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

从点 [0.5,0] 开始求最小值,约束为 x(1)+2x(2)≤1 和 2x(1)+x(2)=1。

  • 以 A = [1,2] 和 b = 1 为条件,以 A*x <= b 形式表达线性不等式约束。这个方程的系数矩阵为 [1,2],最大值为1,因此设置 A = [1,2] , b = 1 ,最终函数以 A*x < b 形式表达此约束。

  • 以 Aeq = [2,1] 和 beq = 1 为条件,以 Aeq*x = beq 形式表达线性等式约束。这个方程的系数矩阵为 [2,1],方程值 =1 ,因此设置 Aeq = [2,1] , beq = 1 ,最终函数以 Aeq*x  = beq 形式表达此约束。

代码运行结果:

3 应用三:具有边界约束的极值求解

在存在边界约束的情况下,求目标函数的最小值。目标函数是具有两个变量的简单代数函数。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) :对 x 中的设计变量定义一组下界和上界,使解始终在 lb  x  ub 范围内。如果不存在等式,请设置 Aeq = [] 和 beq = []。如果 x(i) 无下界,请设置 lb(i) = -Inf,如果 x(i) 无上界,请设置 ub(i) = Inf

代码实例:

fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));
% x 为正值且满足 x(1) ≤ 1 和 x(2) ≤ 2 的区域。
lb = [0,0];
ub = [1,2];
% 无任何线性约束
A = [];
b = [];
Aeq = [];
beq = [];
%尝试使用一个位于区域中部的初始点
x0 = (lb + ub)/2;
%输出结果
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

代码功能:

函数:  fun = 1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));

无任何约束,但是 x的值存在边界条件:  x 为正值且满足 x(1) ≤ 1 和 x(2) ≤ 2 , 即 x(1)的下界为0,上界为1,x(2)的下界为0,上界为2;因此设置下界与上界的矩阵 lb = [0,0]; ub = [1,2]; 表达此边界条件,最终输出结果;

值得注意的是初始点的选取;目前是尝试使用一个位于区域中部的初始点,即x0 = (lb + ub)/2;这个值不同将会影响系统的输出结果,因为求解函数的单个方向收敛的,这个初值的设置需要参考不同函数进行独立的设计。

代码运行结果:

3 应用四:具有非线性约束的极值求解

在非线性约束下求函数的最小值,这个非线性约束是指那些 既不是边界、也不是线性等式、也不是不等式的情况,比如某个函数在某个区域内的极小值,这个区域是一个圆或者是一个正方型区域,这个限制条件就是非线性的约束条件;

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) : 求解非线性约束 nonlcon 函数下函数极值;满足 nonlcon 所定义的非线性不等式 c(x) 或等式 ceq(x)。fmincon 进行优化,以满足 c(x) ≤ 0 和 ceq(x) = 0。如果不存在边界,请设置 lb = [] 和/或 ub = []。

代码实例:在边界约束下求 Rosenbrock 函数在圆内最小的点,理想输出结果是x1 = 0.5,x2 = 0.25

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
%  x1 = [0 0.5] , x2 = [0.2 0.8] 区域内寻找
lb = [0,0.2];
ub = [0.5,0.8];

%没有线性约束,因此将这些参数设置为 []。
A = [];
b = [];
Aeq = [];
beq = [];

%选择一个满足所有约束的初始点。
x0 = [1/4,1/4];

%求解输出(尾部定义非线性约束)
nonlcon = @circlecon;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

%同时在以 [1/3,1/3] 为圆心、半径为 1/3 的圆内寻找。将以下代码复制到您的 MATLAB® 路径上名为 circlecon.m 的文件中。

function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];
end

代码功能:在边界约束下求 Rosenbrock 函数在圆内最小的点

无任何线性约束,仅存在一个约束条件:极值必须在以 [1/3,1/3] 为圆心、半径为 1/3 的圆内寻找。

非常值得注意的是这个 nonlcon函数的撰写;

c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;   这是所需圆的表达式;由于该函数规定必须是满足 c(x) ≤ 0 。因此要表示在圆内, 将原本圆的表达式是 : (x(1)-1/3)^2 + (x(2)-1/3)^2 =(1/3)^2,转换为c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;   

假如需要增加参数之间的关系: 增加类似  c =  x(1) - x(2),表示 x(2)>= x(1)

ceq = [],此时不存在等式,这里选择为空即可;

这些都是单个约束条件 ,如果有多个约束条件就是 c(1) = .....  c(2) = ....即可

代码运行结果:

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

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

相关文章

企业级大数据安全架构(二)安全方案

作者&#xff1a;楼高 1 Knox访问控制 Apache Knox是一个为Apache Hadoop部署提供交互的应用网关&#xff0c;通过其REST API和用户友好的UI&#xff0c;为所有与Hadoop集群的REST和HTTP交互提供了统一的访问点。Knox不仅仅是一个访问网关&#xff0c;它还具备强大的访问控制…

(2024,少样本微调自适应,泛化误差界限,减小泛化误差的措施)多模态基础模型的少样本自适应:综述

Few-shot Adaptation of Multi-modal Foundation Models: A Survey 公和众和号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 多模态基础模型的预训练 3. 多模态基础模…

关于kthread_stop的疑问(linux3.16)

线程一旦启动起来后&#xff0c;会一直运行&#xff0c;除非该线程主动调用do_exit函数&#xff0c;或者其他的进程调用kthread_stop函数&#xff0c;结束线程的运行。 之前找销毁内核线程的接口时&#xff0c;发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程…

JavaScript:构造函数面向对象

JavaScript&#xff1a;构造函数&面向对象 构造函数实例化静态成员实例成员 内置构造函数引用类型基本含义常用属性方法ObjectArray 包装类型基本含义常用属性方法StringNumber 面向对象原型对象constructor对象原型原型链原型继承 构造函数 在讲解构造函数之前&#xff0…

[NISACTF 2022]bingdundun~

[NISACTF 2022]bingdundun~ wp 信息搜集 进入题目&#xff1a; 点一下 upload? &#xff1a; 注意看上面的 URL &#xff0c;此时是 ?bingdundunupload 。 随便找个文件上传一下&#xff1a; 注意看上面的 URL &#xff0c;此时变成&#xff1a;upload.php 。 那么我有理…

【力扣算法日记】无重复字符的最长子串

最近刷了很多算法题&#xff0c;这些解题过程也拓展了自己的思路&#xff0c;是个适合记录的素材。所以决定在继技术知识点详解的【一文系列】之后&#xff0c;开启新坑——【力扣算法系列】&#xff0c;来记录力扣刷题过程。 分享题目不确定&#xff0c;目前打算只分享我认为…

聊一聊 .NET高级调试 内核模式堆泄露

一&#xff1a;背景 1. 讲故事 前几天有位朋友找到我&#xff0c;说他的机器内存在不断的上涨&#xff0c;但在任务管理器中查不出是哪个进程吃的内存&#xff0c;特别奇怪&#xff0c;截图如下&#xff1a; 在我的分析旅程中都是用户态模式的内存泄漏&#xff0c;像上图中的…

【JVM】类加载器ClassLoader

一、简介 在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是一个关键的组件&#xff0c;它负责将字节码文件加载到内存并转换成Java类。Java的类加载器主要可以分成两类&#xff1a;系统提供的和由Java应用开发人员编写的。Java开发者可以根据需要创建自己的…

ES集群分片数据的高可用

文章目录 ES集群分片数据的高可用1. 集群设置索引节点2. 集群新增文档数据3.查看集群中文档数据分片节点4. 让节点9201宕机&#xff0c;查看其分片变化5. 让节点9201&#xff0c;查看分片变化 ES集群分片数据的高可用 集群中的索引主分片和副分片在不同的计算机上&#xff0c;如…

揭开 JavaScript 作用域的神秘面纱(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

pyqtgraph 教程

pyqtgraph 教程 简介 PyQtGraph 是一个用于科学和工程数据可视化的开源库&#xff0c;基于 PyQt 和 NumPy 构建而成。它提供了丰富的绘图工具和交互功能&#xff0c;可以用于创建高性能的实时数据图表、图像显示和信号处理应用。 以下是 PyQtGraph 的一些特点和功能&#xf…

.NET Standard 支持的 .NET Framework 和 .NET Core

.NET Standard 是针对多个 .NET 实现推出的一套正式的 .NET API 规范。 推出 .NET Standard 的背后动机是要提高 .NET 生态系统中的一致性。 .NET 5 及更高版本采用不同的方法来建立一致性&#xff0c;这种方法在大多数情况下都不需要 .NET Standard。 但如果要在 .NET Framewo…

基于sumo实现交通灯控制算法的模板

基于sumo实现交通灯控制算法的模板 目录 在windows安装run hello world networkroutesviewsettings & configurationsimulation 交通灯控制系统 介绍文件生成器类&#xff08;FileGenerator&#xff09;道路网络&#xff08;Network&#xff09;辅助函数生成道路网络&am…

从细菌基因组中提取噬菌体变异序列工具PhaseFinder的介绍、安装和使用方法

PhaseFinder ## 概览&#xff0c;不翻译了&#xff0c;大家自己看吧 The PhaseFinder algorithm is designed to detect DNA inversion mediated phase variation in bacterial genomes using genomic or metagenomic sequencing data. It works by identifying regions flank…

Java学习笔记(四)——正则表达式

文章目录 正则表达式基本规则字符类(只匹配一个字符)预定义字符(只匹配一个字符)数量词练习正则表达式插件 爬虫利用正则表达式获取想要的内容爬取网络信息练习有条件的爬取贪婪爬取非贪婪爬取正则表达式在字符串中的使用 分组捕获分组正则表达式外部使用非捕获分组正则表达式忽…

公共用例库计划--个人版(二)主体界面设计

1、任务概述 计划内容&#xff1a;完成公共用例库的开发实施工作&#xff0c;包括需求分析、系统设计、开发、测试、打包、运行维护等工作。 1.1、 已完成&#xff1a; 需求分析、数据库表的设计&#xff1a;公共用例库计划–个人版&#xff08;一&#xff09; 1.2、 本次待…

神经网络-卷积层

卷积 输入通道数&#xff0c; 输出通道数&#xff0c;核大小 参数具体含义 直观理解各个参数的网站(gif) https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md大概长这样&#xff0c;cyan是青色的意思 channel数&#xff08;终于理解论文里图片放好多层的原因…

VMware ESXI 8 安装ipmitool 调整戴尔服务器风扇转速

本文内容适合ESXI 8版本安装ipmitool &#xff0c;进行管理&#xff0c;已知的是8.0以上版本无法安装社区的vib.所以需要自己编译文件&#xff0c;7.0及之前的版本可以安装vib版本的ipmtools。 一、编译好的适用于esxi8的ipmitool下载 ipmitool下载 二、安装ipmitool 1、开…

铁塔基站数字化管理监测解决方案

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…

new FormData 同时发送表单 json 以及文件二进制流

需要新增时同时发送表单 json 以及对应的文件即可使用以下方法传参 let formDataParams new FormData(); 首先通过 new FormData&#xff08;&#xff09; 创建你需要最后发送的表单 接着将你的对象 json 存储&#xff0c;注意使用 new Blob 创建大表单转换成 json 格式。以…