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

最近的算法中用到了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.mzph.cn/news/600401.shtml

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

相关文章

2024年最新51单片机+Proteus嵌入式开发入门实战完整版教程

我们为什么要学嵌入式开发&#xff1f; 嵌入式系统是一种专为特定任务或特定应用设计的计算机系统。与通用计算机系统不同&#xff0c;嵌入式系统通常具有更小的体积、更低的功耗和更强的可靠性。由于这些特点&#xff0c;嵌入式系统广泛应用于工业控制、医疗设备、智能家居、…

【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

一、关联式容器 vector/list/deque… 这些容器统称为序列式容器 因为其底层为线性序列的数据结构 里面存储的是元素本身 map/set… 这些容器统称为关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是<key, value>结构的键值对 在数据检索时…

JVM工作原理与实战(七):类的生命周期-初始化阶段

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类的生命周期 1.加载&#xff08;Loading&#xff09; 2.连接&#xff08;Linking&#xff09; 3.初始化&#xff08;Initialization&#xff09; 4.使用&#xff08;Using&…

canvas文字设置(含最大宽度)的示例

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

Linux tty命令教程:掌握Linux终端的使用(附案例详解和注意事项)

Linux tty命令介绍 tty命令在Linux中是一个简单的实用程序&#xff0c;用于检查连接到标准输入的终端。tty是“teletypewriter”的缩写&#xff0c;但通常被称为终端&#xff0c;它允许您通过将数据&#xff08;您的输入&#xff09;传递给系统并显示系统产生的输出来与系统进…

springboot + vue 前后端加密传输 RSA互相加解密、加签验签、密钥对生成

参考 二、关于PKCS#1和PKCS#8格式密钥 由于Java非对称加解密、加验签都是采用PKCS#8格式的密钥&#xff0c;PKCS#1格式的密钥跑不通&#xff0c;这里先简单介绍一下两者的区别。 1、简介 PKCS#1和PKCS#8是两个不同的数字证书标准。 PKCS#1是一个公钥加密标准&#xff0c;它…

【解决|三方工具】导入 XChart 后提示丢失关于 TMPPro 工具引用

开发平台&#xff1a;Unity 2021 版本 插件版本&#xff1a;XChart 3.0&#xff1a;官方文档 - https://github.com/XCharts-Team/XCharts   问题描述 导入 XChart 插件至 Unity 中出现 目录&#xff1a;Component、Theme 等提示丢失 TMPPro&#xff08;TextMeshPro 工具&…

微信小程序的5种打开页面方式

wx.navigateTo&#xff1a;打开新页面 使用 wx.navigateTo 可以打开一个新的页面&#xff0c;新页面会被放置在当前页面的上层。 wx.navigateTo({url: /pages/nextPage/nextPage });wx.redirectTo&#xff1a;关闭当前页面&#xff0c;打开新页面 使用 wx.redirectTo 关闭当…

2024年,Web3技术的“iPhone时刻”会出现吗?

出品&#xff5c;欧科云链研究院 关于2024年的Web3市场&#xff0c;大多数人目前是持乐观态度的。随着宏观政策稳定&#xff0c;美国和香港地区不断释放加密资产现货ETF的利好&#xff0c;叠加铭文热潮及减半周期临近&#xff0c;市场对Web3及加密资产的兴趣正持续上涨。年后的…

[蓝桥杯学习]树的直径与重心

树的直径 定义 为什么不直接说&#xff08;u,v&#xff09;是两个叶子&#xff0c;可能有如下情况&#xff1a; 这是一条链&#xff0c;且u为根&#xff0c;但&#xff0c;度数为1 下面这个情况是不经过根的。 求解方法 如果设根u的深度为0时&#xff0c;直径就是深度dep[v]…

代码随想录刷题第三十八天| 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

代码随想录刷题第三十八天 动态规划基础理论 斐波那契数 (LC 509) 题目思路&#xff1a; 代码实现&#xff1a; class Solution:def fib(self, n: int) -> int:if n<1: return ndp [0 for _ in range(n1)]dp[1] 1for i in range(2, n1):dp[i] dp[i-1]dp[i-2] …

教学/直播/会议触摸一体机定制_基于展锐T820安卓核心板方案

触控一体机是一种集先进的触摸屏、工控和计算机技术于一体的设备。它取代了传统的键盘鼠标输入功能&#xff0c;广泛应用于教学、培训、工业、会议、直播、高新科技展示等领域。触摸一体机的应用提升了教学、会议和展示的互动性和信息交流。 触摸一体机方案基于国产6nm旗舰芯片…

【Spring实战】23 Spring Actuator 常用的自定义

文章目录 1. 自定义健康指示器2. 自定义端点3. 自定义端点路径4. 自定义 Actuator 端点的访问权限5. 启动服务6. 访问自定义的 custom 端点总结 Spring Actuator 是 Spring 框架的一个模块&#xff0c;为开发人员提供了一套强大的监控和管理功能。上一篇 【Spring实战】22 Spri…

1.5 CHALLENGES IN PARALLEL PROGRAMMING

是什么让并行编程变得困难&#xff1f;有人曾经说过&#xff0c;如果你不关心性能&#xff0c;并行编程很容易。你可以在一小时内编写一个并行程序。但是&#xff0c;如果你不在乎性能&#xff0c;为什么要费心写一个并行程序呢&#xff1f; 这本书解决了在并行编程中实现高性…

C语言全面学习基础阶段01—C生万物

如何学好 C 语言 1. 鼓励你&#xff0c;为你叫好。 C 生万物 编程之本 长远 IT 职业发展的首选 C 语言是母体语言&#xff0c;是人机交互接近底层的桥梁 学会 C/C &#xff0c;相当于掌握技术核心 知识点一竿子打通。 IT 行业&#xff0c;一般每 10 年就有一次变革 40 年间&a…

汽车信息安全--芯片厂、OEM安全启动汇总(2)

目录 1.STM32 X-CUBE-SBSFU 2.小米澎湃OS安全启动 3.小结 在汽车信息安全--芯片厂、OEM安全启动汇总-CSDN博客,我们描述了芯驰E3的安全启动机制,接下来我们继续看其他芯片、OEM等安全启动机制。 1.STM32 X-CUBE-SBSFU 该产品全称Secure Boot and Secure

5.2 Android BCC环境搭建(eadb版 上)

写在前面 eadb即eBPF Android Debug Bridge,它是基于adeb的重构。后者曾随aosp 10发布在platform/external目录下。 一,root权限 这里再HighLight下,当前整个专栏都是基于开发环境来展开的,也就是Android设备需要具有root权限。因此该专栏下每一篇博客都是默认了当前开发…

科锐16位汇编学习笔记01汇编基础和debug使用

为什么学习16位汇编&#xff1f; 16位操作指令最多能够操作两个字节&#xff0c;且更能够体现出与硬件的交互。16位下的指令和32位汇编的指令差不多。16位汇编的指令在32位一样使用.要学好汇编必须要了解一点点硬件知识,16汇编是直接操作硬件,32位汇编指令跟硬件隔离了 硬件运…

UICollection Compositional Layout全详解

本文字数&#xff1a;8325字 预计阅读时间&#xff1a;45分钟 01 Collection View Layout全详解 UICollectionView在iOS中是构建复杂布局的强大工具。iOS13中引入的 UICollectionViewCompositionalLayout为创建自定义布局提供了全新的可能性。本文将深入探讨Compositional Lay…

频率域滤波图像复原之带阻滤波器的python实现——数字图像处理

原理&#xff1a; 带阻滤波器&#xff08;Band-Stop Filter&#xff09;是一种在信号处理领域常用的滤波器&#xff0c;它的主要功能是去除&#xff08;或减弱&#xff09;信号中特定频率范围内的成分&#xff0c;同时允许其他频率范围的信号通过。这种滤波器在多种应用中都非…