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.hqwc.cn/news/325696.html

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

相关文章

基于python的leetcode算法介绍之动态规划

文章目录 零 算法介绍一 例题介绍 使用最小花费爬楼梯问题分析 Leetcode例题与思路[118. 杨辉三角](https://leetcode.cn/problems/pascals-triangle/)解题思路题解 [53. 最大子数组和](https://leetcode.cn/problems/maximum-subarray/)解题思路题解 [96. 不同的二叉搜索树](h…

进阶C语言学习前序

我们前期用了二十天的时间&#xff0c;学习了各种函数&#xff0c;我们已经初步具有敲写代码的能力&#xff0c;但是我们想要使用C语言去学习单片机的东西还是远远不够的&#xff0c;那么我们就需要深入了解和掌握更加深入的C语言知识&#xff0c;就有了接下来的学习计划&#…

基于JavaWeb+SSM+Vue校车购票微信小程序的设计与实现系统的设计和实现

基于JavaWebSSMVue校车购票微信小程序的设计与实现系统的设计和实现 源码获取入口KaiTi 报告Lun文目录前言主要技术系统设计功能截图 源码获取入口 KaiTi 报告 一、选题的目的和意义 本次开发的校车购票微信小程序相对于传统的APP脱离了平台的限制&#xff0c;只要完成开发即…

Java字符串:构建和操作字符序列的动态工具

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、常用方法1、字符串构造2、String对象的比较Ⅰ、比较是否引用同一个对象Ⅱ、 按照字典序比较 3、转换Ⅰ、数值和字符串的转换…

分布式事务问题

传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a;ACID原则 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&#xff1a; 跨数据源的分布式事务 跨服务的分布式事务 综合情况 在分布式…

OpenHarmony之消息机制实现

OpenHarmony之消息机制实现 背景 在之前的介绍&#xff08;OpenHarmony之HDF驱动框架&#xff09;中&#xff0c;了解到OpenHarmony的消息机制主要有以下两种&#xff1a; 用户态应用发送消息到驱动。用户态应用接收驱动主动上报事件。 下面我们分别来看看两种机制用户态的…

网络调试 TCP,开发板用静态地址-入门7

用两台电脑&#xff08;无线网络&#xff09;做实验 1.1, 在电脑A上设置为Server如下&#xff1a; 选择TCP Server后&#xff0c;直接跳出用本机IP做为“本地主机地址” 1.2在 电脑B上设置为Client, 远程主机地址设置为Server的 IP 1.3, 在A, B两台电脑上能够互相发送数据 用…

西门子PLC联网数据采集:借助HiWoo Box实现高效监控与管理

在工业自动化领域&#xff0c;西门子PLC作为一种广泛应用的控制器&#xff0c;对于工厂的生产线具有至关重要的作用。如何实现西门子PLC的联网数据采集&#xff0c;提高生产效率和管理水平&#xff0c;成为了许多企业的关注焦点。而HiWoo Box作为一款功能强大的工业网关&#x…

跑通大模型领域的 hello world

跑通书生浦语大模型的 3 个趣味 demo&#xff08;InternLM-Chat-7B 智能对话、Lagent工具调用解简单数学题、浦语灵笔多模态图文创作和理解&#xff09;视频和文档。 1、两个框架 InternLM 是⼀个开源的轻量级训练框架&#xff0c;旨在⽀持⼤模型训练⽽⽆需⼤量的依赖。 Lage…

一种DevOpts的实现方式:基于gitlab的CICD(一)

写在之前 笔者最近准备开始入坑CNCF毕业的开源项目&#xff0c;看到其中有一组开源项目的分类就是DevOpts。这个领域内比较出名的项目是Argocd&#xff0c;Argo CD 是一个用于 Kubernetes 的持续交付 (Continuous Delivery) 工具&#xff0c;它以声明式的方式实现了应用程序的…

工会排队规则:深度解析

工会排队规则&#xff1a;深度解析在当今的消费市场中&#xff0c;工会排队规则作为一种创新的营销策略&#xff0c;正逐渐受到广大商家和消费者的青睐。这一规则不仅为商家带来了可观的利润&#xff0c;同时也为消费者提供了一种全新的购物体验。本文将对工会排队规则进行深入…

【开源项目】超经典开源项目实景三维数字孪生智慧工厂

数字孪生工厂&#xff0c;以模型驱动的自动化&#xff0c;与数据驱动的人工智能技术紧密融合与协同&#xff0c;实现机器、工件与组件间全面的和点对点的数据通信。飞渡科技基于自研DTS平台&#xff0c;将物联网IOT、人工智能、大数据、云计算等技术应用于工厂&#xff0c;实现…