matlab进阶:求解在约束条件下的多元目标函数最值(fmincon函数详解)

news2024/11/18 14:27:59

🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅

欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,联系最后的横幅!
喜欢的朋友可以关注下,私信下次更新不迷路!

资源链接:点击这里获取众多源码、数模资料、思路精讲、论文模板latex和word、学习书籍等


文章目录

  • 💧 fmincon函数说明
    • 目标优化问题的基本形式
    • fmincon语法和参数
  • 💧 算例实战
    • 初始解x0的设定
    • 线性等式和不等式约束
    • 非线性等式和不等式约束
    • 含有求和公式目标函数

💧 fmincon函数说明

Matlab 的 fmincon 函数:寻找约束非线性多变量函数的最小值

适用于:

  • 线性函数
  • 非线性函数
  • 线性等式和不等式约束
  • 非线性等式和不等式约束

目标优化问题的基本形式

min ⁡ f ( x ) \min f(x) minf(x)

s . t . { A ⋅ x ≤ b A e q ⋅ x = B e q l b ≤ x ≤ u b c ( x ) ≤ 0 c e q ( x ) = 0 s.t. \begin{cases} A \cdot x \leq b \\ Aeq \cdot x = Beq \\ lb \leq x \leq ub \\ c(x) \leq 0 \\ ceq(x) = 0 \end{cases} s.t. AxbAeqx=Beqlbxubc(x)0ceq(x)=0

fmincon语法和参数

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
输入参数:

  • fun :目标函数,注意需要单引号,或者@,(即写为符号函数)
  • x0:函数fun参数值的初始化;
  • A, b:参数值的线性不等式约束(A * x <= b)
  • Aeq, beq:参数值的等式线性约束 (Aeq * x = beq)
  • lb, ub:参数值的下界和上界
  • options:使用所指定的优化选项执行,options 可设置这些选项
  • nonlcon:非线性约束,其参数值一般为约束函数。如果没有非线性不等式或等式约束,设置为 nonlcon = []

输出参数:

  • x:输出最优参数值
  • fval:输出 fun 在X参数的值
  • exitflag: 输出fmincon额外条件值
  • lambda :结构体,其字段包含解 x 处的拉格朗日乘数。
  • grad:fun 在解 x 处的梯度。
  • hessian:fun 在解 x 处的黑塞矩阵。请参阅fmincon Hessian 矩阵。

💧 算例实战

算例都是比较简单的,希望大家好好理解,单元和多元区别不大,进阶的话重点是关于fmincon求解结果的分析,目标函数属于凸函数还是非凸,是否全局最优还是局部最优,还得考虑fmincon求解的约束容限等。

初始解x0的设定

初始解的设定也很重要,得结合你所选用的算法。下面我都是直接设定x0=rand(2,1),大家可以尝试修改初始解,看看结果有什么不同。

线性等式和不等式约束

min ⁡ f ( x ) = 3 ⋅ x 1 + 5 ⋅ x 2 \min f(x)=3 \cdot x_1 +5 \cdot x_2 minf(x)=3x1+5x2

s . t . { x 1 + 3 x 2 ≤ 20 2 x 1 + x 2 ≤ 30 x 1 + x 2 = 10 0 ≤ x 1 ≤ 10 3 ≤ x 2 ≤ 8 s.t. \begin{cases} x_1+3 x_2 \leq 20 \\ 2 x_1+x_2 \leq 30 \\ x_1+x_2 = 10 \\ 0 \leq x_1 \leq 10 \\ 3 \leq x_2 \leq 8 \\ \end{cases} s.t. x1+3x2202x1+x230x1+x2=100x1103x28

将其与前面目标规划问题的基本形式对照即可,代码如下:

clc
clear
close all
fun=@(x) 3*x(1)+ 5*x(2);
x0=rand(1,2);
A=[1,3;2,1];
b=[20;30];
Aeq=[1,1];
beq=[10];
lb=[0,3];
ub=[10,8];
[x,fval,exitflag]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

非线性等式和不等式约束

这里注意非线性部分得移项成标准形式,即非线性部分≤0非线性部分=0的形式,下方换成上面形式得移向变号,大家看到负号别讶异。

min ⁡ f ( x ) = 3 ⋅ x 1 2 + 5 ⋅ x 2 2 \min f(x)=3 \cdot x_1^2 +5 \cdot x_2^2 minf(x)=3x12+5x22

s . t . { x 1 + 3 x 2 ≤ 20 2 x 1 + x 2 ≤ 30 x 1 + x 2 = 10 0 ≤ x 1 ≤ 10 3 ≤ x 2 ≤ 8 x 1 2 − x 2 ≥ 0 x 1 − x 2 2 + 1 = 0 s.t. \begin{cases} x_1+3 x_2 \leq 20 \\ 2 x_1+x_2 \leq 30 \\ x_1+x_2 = 10 \\ 0 \leq x_1 \leq 10 \\ 3 \leq x_2 \leq 8 \\ x_1^2-x_2 \geq 0 \\ x_1-x_2^2 + 1 = 0 \end{cases} s.t. x1+3x2202x1+x230x1+x2=100x1103x28x12x20x1x22+1=0
主函数:

clc
clear
close all
fun=@(x) 3*x(1)^2+ 5*x(2)^2;
x0=rand(1,2);
A=[1,3;2,1];
b=[20;30];
Aeq=[1,1];
beq=[10];
lb=[0,3];
ub=[10,8];
[x,fval,exitflag]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,'mycon')

新建mycon.m函数

function [c,ceq]=mycon(x)
c=-x(1)^2+x(2);
ceq=-x(1)-x(2)^2+1;

含有求和公式目标函数

若目标函数含有求和公式,如何用代码表示呢?

min ⁡ f ( x ) = ∑ i 50 ( x i − 1 ) 2 \min f(x)= \sum_i^{50}(x_i-1)^2 minf(x)=i50(xi1)2

  • 其中x为自变量,c为已知量

则我们的目标函数为

function f = fun(x)
f = 0;
for i=1:50
	f = f + (x(i) - 1)^2
end

在这里插入图片描述

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

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

相关文章

【C#教程】零基础从入门到精通

今天给大家分享一套零基础从入门到精通&#xff1a;.NetCore/C#视频教程&#xff1b;这是2022年最新整理的、590G的开发教程资料。课程涵盖了.Net各方面的知识&#xff0c;跟着这个教程学习&#xff0c;就足够了。 课程分类 1、C#从基础到精通教程&#xff1b; 2、Winform从…

6.生成随机数、猜数字游戏(rand函数、srand函数、time函数)

猜数字游戏 1.生成随机数1.1 rand函数1.2 srand函数1.3 time函数1.4 设置随机数的范围 2.猜数字游戏 1.生成随机数 1.1 rand函数 函数原型如下&#xff1a; int rand(void); 所需头文件&#xff1a;stdlib.h 作用&#xff1a;调用后随机返回一个伪随机数&#xff0c;随机数范…

QtXlsx: no such file or directory

Qt项目&#xff0c;引用了QtXlsx&#xff0c;准备运行&#xff0c;提示报错&#xff1a; QtXlsx: No such file or directory 奇怪。按理说&#xff0c;安装QtXlsx的三个步骤都已经执行成功了&#xff1a; qmake make make install 把生成的so库文件拷贝到相关目录也是无效。…

解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo

&#x1f600;前言 解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#x…

c++ 的reinterpret_cast 与const_cast 类型转换举例

&#xff08;1&#xff09;const_cast 转换&#xff0c;可以使得给常量赋值。reinterpret_cast 转换&#xff0c;可以把一种类型转换为无关的另一种类型。 图中给出了一个例子。成功给指针 p 写进去了内容。先去除指针p 的常量属性&#xff0c;再把p这个变量当成 B 类型的变量…

C语言之#define以及预处理详讲解

目录 #define #define的使用方法 #define 替换规则 #和##的作用 带副作用的宏参数 宏和函数对比 #undef 文件包含 头文件被包含的方式&#xff1a; 嵌套文件包含 在C语言中&#xff0c;一段程序运行时会执行四个步骤&#xff1a;预编译、编译、汇编、链接。在程序预编…

初学者如何选择自己的第一种编程语言?

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

Just Mask and Sum 手搓 自然语言模型

背景 在这个每天都能看到&#xff0c;各种新LLM论文&#xff0c;出现的今天&#xff0c;大家讨论的都是如何将transformer &#xff0c;或者说是将attention 进行线性化。 很少有人讨论&#xff0c;注意力机制是必要的吗&#xff08;attention is must&#xff09;&#xff1f;…

CentOS 7.6使用yum安装stress,源码安装stree-ng 0.15.06,源码安装sysstat 12.7.2

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64 yum install stress sysstat -y安装stress和sysstat。 使用pidstat -u 5 1没有%wait项&#xff1a; 原因是CentOS 7仓…

数电模电基础知识学习笔记汇总

文章目录&#xff1a; 数电和模电的关系 一&#xff1a;模电学习笔记 二&#xff1a;数电学习笔记 三&#xff1a;福利 1.NI Multisim14.0电路仿真软件的下载安装 2.进制转换 3.电路常用公式 4.好的参考笔记 4.1 笔记 3.1.1 模电 3.1.1 数电 4.2 网站 5.八股文 …

LeetCode130.Surrounded-Regions<被围绕的区域>

题目&#xff1a;被围绕的区域 思路&#xff1a; 好吧&#xff0c;这题不会。 bfs递归 dfs非递归 dfs并查集 - 被围绕的区域 - 力扣&#xff08;LeetCode&#xff09; 将问题转化为与边界O相连的O。有点像岛屿问题了。 代码是&#xff1a; //codeclass Solution { public:vo…

【ARM】内核驱动之设备树的学习-长文

❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑! 文章目录 一、什么是设备树,为什么叫设备树?二、如何编译设备树?三、…

妙用指针实现qsort

妙用指针实现qsort qsort是什么qsort代码使用例子冒泡排序引言冒泡排序模拟qsort函数 qsort是什么 是一个可以对任意类型进行排序的函数 函数为&#xff1a; void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *));参数解释 参数base …

【数据结构与算法】基数排序

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…

学C的第三十一天【通讯录的实现】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十天【自定义类型&#xff1a;结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求&#xff1a; 实现一个通讯录&#xff0c; 通讯录中存放保存人的信息&#xff1…

【WebGL】初探WebGL,我了解到这些

WebGL&#xff08;Web图形库&#xff09;是一种强大的技术&#xff0c;允许您在Web浏览器中直接创建交互式的3D图形和动画。它利用现代图形硬件的能力来呈现令人惊叹的视觉效果&#xff0c;使其成为Web开发人员和计算机图形爱好者必备的技能。 WebGL基础知识 WebGL基于OpenGL …

1.3 eureka+ribbon,完成服务注册与调用,负载均衡源码追踪

本篇继先前发布的1.2 eureka注册中心&#xff0c;完成服务注册的内容。 目录 环境搭建 采用eurekaribbon的方式&#xff0c;对多个user服务发送请求&#xff0c;并实现负载均衡 负载均衡原理 负载均衡源码追踪 负载均衡策略 如何选择负载均衡策略&#xff1f; 饥饿加载…

数据结构07:查找[C++][线性查找]

图源&#xff1a;文心一言 考研笔记整理~&#x1f95d;&#x1f95d; 在数据结构和算法中&#xff0c;查找是一种常见的操作&#xff0c;它的目的是在一个数据集合中找到一个满足条件的元素。本文将介绍三种常用的查找方法&#xff0c;分别是顺序查找、折半查找和分块查找~&a…

61 # http 数据处理

node 中的核心模块 http 可以快速的创建一个 web 服务 const http require("http"); const url require("url");// req > request 客户端的所有信息 // res > respone 可以给客户端写入数据 const server http.createServer();server.on("r…

使用Spring Boot AOP实现日志记录

目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目&#xff0c;无需选择依赖 2.2 设置好本地Maven配置后&#xff0c;在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务 2.5 在单元测试运行结果 …