最优化问题matlab求解-fminsearch()和fmincon()函数的使用

news2024/11/24 15:40:14

matlab可以求解无约束最优化问题、有约束最优化问题和线性规划、二次型规划问题等,同时实现了最小二乘法的曲线拟合方法。matlab求解优化问题的步骤为:

  1. 写标准型
  2. 描述目标函数:M-函数或匿名函数
  3. fminunc()fmincon()等函数求解原问题。
  4. 检验得出的解,如随机变换求解的初值,观察是否能得到更好的解。
  5. 传统最优化方法的最大问题是无法保证得到全局最优解,可以考虑调用matlab的进化算法,如遗传算法和粒子群算法来求解原问题。

1. 无约束最优化问题求解-fminsearch()

无约束最优化问题一般描述为:

min ⁡ x f ( x ) \min _{\boldsymbol{x}} f(\boldsymbol{x}) xminf(x)

我们的目标是选取合适的 x \boldsymbol{x} x(一个向量)使得目标函数 f ( x ) f(\boldsymbol{x}) f(x)的值最小,最小化是最优化问题的通用描述,如果要求解最大化问题,可以给目标函数 f ( x ) f(\boldsymbol{x}) f(x)添加一个负号转化为求解最小值问题。

matlab提供了基于单纯形法求解无约束的函数的fminsearch(),该函数调用格式为

[ x , f opt  , key , c ] =  fminsearch (Fun  , x 0 ,  options,附加参数 ) \left.\left[\boldsymbol{x}, f_{\text {opt }},\text {key},\text {c}\right]=\text { fminsearch (Fun }, \boldsymbol{x}_{0}, \text { options,\text{附加参数}}\right) [x,fopt ,key,c]= fminsearch (Fun ,x0, options,附加参数)

其中

  • Fun \text{Fun} Fun:要求解问题的数学描述,是一个matlab函数也可以是是一个函数句柄;
  • x 0 \boldsymbol{x}_{0} x0:自变量的起始搜索点,需要用户自己定义;
  • x \boldsymbol{x} x:寻找到最优值下的自变量的结果。
  • f o p t {f}_{\mathrm{opt}} fopt:最优化的目标函数结果。
  • key \text{key} key:函数返回的条件,正整数表示已经求解方程的解。而0或负整数表示未搜索到方程的解;
  • c \text{c} c:解的附加信息,该变量是一个结构体变量,包含 + iteration: 迭代的次数; + funcCount: 目标函数的调用次数

另外matlab最优化工具箱提供fminunc()fminsearch()的功能很像,有时候求解无约束最优化问题可以选择该函数。

1.1 例子

我们现在考虑二元函数

min ⁡ x , y f ( x , y ) = ( x 2 − 2 x ) e − x 2 − y 2 − x y \min _{{x,y}}f(x,y)=(x^2-2x)\mathrm{e}^{-x^2-y^2-xy} x,yminf(x,y)=(x22x)ex2y2xy


我们需要做变量代换:令 x 1 = x x_1=x x1=x x 2 = y x_2=y x2=y x = [ x 1 , x 2 ] T \boldsymbol{x}=[x_1,x_2]^T x=[x1,x2]T,于是转化目标函数为:

f ( x ) = ( x 1 2 x 1 ) e − x 1 2 − x 2 2 − x 1 x 2 f(\boldsymbol{x})=(x_1^2x_1)\mathrm{e}^{-x_1^2-x_2^2-x_1x_2} f(x)=(x12x1)ex12x22x1x2

f=@(x)(x(1)^2-2*x(1))*exp(-x(1)^2-x(2)^2-x(1)*x(2));
x0=rand(2,1);[x,f1]=fminsearch(f,x0)

解得:

在这里插入图片描述

2. 有约束最优化问题求解-fmincon()

min ⁡ x f ( x )  s.t.  { A x ⩽ B A e q x = B e q x m ⩽ x ⩽ x M C ( x ) ⩽ 0 C e q ( x ) = 0 \min _{\boldsymbol{x}} f(\boldsymbol{x})\\ \text { s.t. }\left\{\begin{array}{l} \boldsymbol{A} \boldsymbol{x} \leqslant \boldsymbol{B} \\ \boldsymbol{A}_{\mathrm{eq}} \boldsymbol{x}=\boldsymbol{B}_{\mathrm{eq}} \\ \boldsymbol{x}_{\mathrm{m}} \leqslant \boldsymbol{x} \leqslant \boldsymbol{x}_{\mathrm{M}} \\ \boldsymbol{C}(\boldsymbol{x}) \leqslant \mathbf{0} \\ \boldsymbol{C}_{\mathrm{eq}}(\boldsymbol{x})=\mathbf{0} \end{array}\right. xminf(x) s.t.  AxBAeqx=BeqxmxxMC(x)0Ceq(x)=0

可以看到约束可以是线性等式约束(第1个式子)也可以是线性不等式约束(第2个式子),可以是有界约束(第3个式子),还可以是非线性约束(第4个和第5个式子)。在matlab里提供了一个fmincon()函数,专门用于求解各种约束下的最优化问题,其调用方式为:

[ x , f opt , key,c ] = fmincon ( Fun , x 0 , A , B , A e q , B e q , x m , x M , CFun,OPT ) \left[\boldsymbol{x}, f_{\text {opt}}, \text {key,c}\right]=\text {fmincon}\left(\text {Fun}, \boldsymbol{x}_{0}, \boldsymbol{A}, \boldsymbol{B}, \boldsymbol{A}_{\mathrm{eq}}, \boldsymbol{B}_{\mathrm{eq}}, \boldsymbol{x}_{\mathrm{m}}, \boldsymbol{x}_{\mathrm{M}}, \text {CFun,OPT}\right) [x,fopt,key,c]=fmincon(Fun,x0,A,B,Aeq,Beq,xm,xM,CFun,OPT)

其中

  • Fun \text{Fun} Fun:给目标函数写的m-函数;
  • x 0 \boldsymbol{x}_{0} x0:自变量的起始搜索点,需要用户自己定义;
  • 线性约束如果不存在用空矩阵来占位
  • x \boldsymbol{x} x:寻找到最优值下的自变量的结果。
  • f o p t {f}_{\mathrm{opt}} fopt:最优化的目标函数结果。
  • CFun \text{CFun} CFun:给非线性函数写的m-函数;
  • OPT \text{OPT} OPT:控制选项。
    如果在最优化过程中发现找不到可行解,在求解结束后将给出提示:No feasible solution found

有约束优化还有几种特殊的方式,如线性规划、二次型规划问题,可以使用工具箱的linprog()quadprog()函数直接求解。此外,整数规划、0-1规划等问题可以由专门的工具求解,下面给出一般非线性规划问题的最优化求解。

2.1 例子1

min ⁡ x 0.6224 x 1 x 2 x 3 x 4 + 1.7781 x 2 x 3 2 + 3.1661 x 1 2 x 4 + 19.84 x 1 2 x 3 )  s.t.  { 0.0193 x 3 − x 1 ≤ 0 0.00954 x 3 − x 2 ≤ 0 750 × 1728 − π x 3 2 x 4 − 4 π x 3 3 / 3 ≤ 0 x 4 − 240 ≤ 0 0.0625 ≤ x 1 , x 2 ≤ 6.1875 , 10 ≤ x 3 , x 4 ≤ 200 \min _{\boldsymbol{x}} 0.6224x_1x_2x_3x_4+1.7781x_2x_3^2+3.1661x_1^2x_4+19.84x_1^2x_3)\\ \text { s.t. }\left\{\begin{array}{l} 0.0193x_3-x_1\le0\\ 0.00954x_3-x_2\le0\\ 750\times 1728-\pi x_3^2x_4-4\pi x_3^3/3\le0 x_4-240\le0\\ 0.0625\le x_1,x_2\le 6.1875,10\le x_3,x_4\le 200 \end{array}\right. xmin0.6224x1x2x3x4+1.7781x2x32+3.1661x12x4+19.84x12x3) s.t.  0.0193x3x100.00954x3x20750×1728πx32x44πx33/30x424000.0625x1,x26.1875,10x3,x4200


main

% 定义目标函数
f=@(x)0.6224*x(1)*x(2)*x(3)*x(4)+1.7781*x(2)*x(3)^2+3.1661*x(1)^2*x(4)+19.84*x(1)^2*x(3);
% 定义求解条件
xm=[0.0625,0.0625,10,10];
xM=[6.1875,6.1875,200,200];
A=[];
B=[];
Aeq=[];
Beq=[];
x0=(xm+xM)/2;
ff=optimset;
ff.Tolx=1e-10;
ff.TolFun=1e-20;
[x,f]=fmincon(f,x0,A,B,Aeq,Beq,xm,xM,@constraint,ff)

由于约束函数要返回两个变量:等式约束 c e q \mathrm{ceq} ceq和不等式约束 c \mathrm{c} c。这里便不能用匿名函数来定义,原问题只有不等式约束,没有等式约束,所以返回的是空矩阵
constraint

% 定义非线性约束
function [c,ceq] = constraint(x)
c=[0.0193*x(3)-x(1);
    0.00954*x(3)-x(2);
    750*1728-pi*x(3)^2*x(4)-4*pi*x(3)^3/3;
    x(4)-240];
ceq=[];
end

运行main函数,最后我们得到的是:

在这里插入图片描述

有时候我们可能找不到最优解,这时候我们会提示:

Maximum number of function evaluations exceeded:
increase options.MaxFunEvals

这时候我们可能需要改进搜索的初值,或者修改控制参数OPT,再进行寻优,得到期望的最优值。

2.2 例子2

min ⁡ q , w , k k  s.t.  { q 3 + 9.625 q 1 w + 16 q 2 w + 16 w 2 + 12 − 4 q 1 − q 2 − 78 w = 0 16 q 1 w + 44 − 19 q 1 − 8 q 2 − q 3 − 24 w = 0 2.25 − 0.25 k ≤ q 1 ≤ 2.25 + 0.25 k 1.5 − 0.5 k ≤ q 2 ≤ 1.5 + 0.5 k 1.5 − 1.5 k ≤ q 3 ≤ 1.5 + 1.5 k \min _{\boldsymbol{q},w,k} k\\ \text { s.t. }\left\{\begin{array}{l} q_3+9.625q_1w+16q_2w+16w^2+12-4q_1-q_2-78w=0\\ 16q_1w+44-19q_1-8q_2-q_3-24w=0\\ 2.25-0.25k\le q_1\le 2.25+0.25k\\ 1.5-0.5k\le q_2\le 1.5+0.5k\\ 1.5-1.5k\le q_3\le 1.5+1.5k \end{array}\right. q,w,kmink s.t.  q3+9.625q1w+16q2w+16w2+124q1q278w=016q1w+4419q18q2q324w=02.250.25kq12.25+0.25k1.50.5kq21.5+0.5k1.51.5kq31.5+1.5k

我们首先需要对变量做替换:

x 1 = q 1 , x 2 = q 2 , x 3 = q 3 , x 4 = w , x 5 = k x_1=q_1,x_2=q_2,x_3=q_3,x_4=w,x_5=k x1=q1,x2=q2,x3=q3,x4=w,x5=k

并且需要对不等式重新进行整理:

min ⁡ x x 5  s.t.  { x 3 + 9.625 x 1 x 4 + 16 x 2 x 4 + 16 x 4 2 + 12 − 4 x 1 − x 2 − 78 x 4 = 0 16 x 1 x 4 + 44 − 19 x 1 − 8 x 2 − x 3 − 24 x 4 = 0 − 0.25 x 5 − x 1 ≤ − 2.25 x 1 − 0.25 x 5 ≤ 2.25 − 0.5 x 5 − x 2 ≤ − 1.5 x 2 − 0.5 x 5 ≤ 1.5 − 1.5 x 5 − x 3 ≤ − 1.5 x 3 − 1.5 x 5 ≤ 1.5 \min _{\boldsymbol{x}} x_5\\ \text { s.t. }\left\{\begin{array}{l} x_3+9.625x_1x_4+16x_2x_4+16x_4^2+12-4x_1-x_2-78x_4=0\\ 16x_1x_4+44-19x_1-8x_2-x_3-24x_4=0\\ -0.25x_5-x_1\le-2.25\\ x_1-0.25x_5\le 2.25\\ -0.5x_5-x_2\le-1.5\\ x_2-0.5x_5\le 1.5\\ -1.5x_5-x_3\le-1.5\\ x_3-1.5x_5\le 1.5\\ \end{array}\right. xminx5 s.t.  x3+9.625x1x4+16x2x4+16x42+124x1x278x4=016x1x4+4419x18x2x324x4=00.25x5x12.25x10.25x52.250.5x5x21.5x20.5x51.51.5x5x31.5x31.5x51.5

原问题有两个非线性等式约束,没有不等式约束。非线性约束条件描述
constraint

function [c,ceq] = constraint(x)
c=[];
ceq=[x(3)+9.625*x(1)*x(4)+16*x(2)*x(4)+16*x(4)^2+12-4*x(1)-x(2)-78*x(4);
16*x(1)*x(4)+44-19*x(1)-8*x(2)-x(3)-24*x(4)];
end

线性不等式约束我们写作 A x ≤ b \mathbf{Ax}\le \mathbf{b} Axb,其中:

A = [ − 1 0 0 0 − 0.25 1 0 0 0 − 0.25 0 − 1 0 0 − 0.5 0 1 0 0 − 0.5 0 0 − 1 0 − 1.5 0 0 1 0 − 1.5 ] , b = [ − 2.25 2.25 − 1.5 1.5 − 1.5 1.5 ] \mathbf{A}=\begin{bmatrix} -1& 0& 0 & 0 & -0.25\\ 1& 0 & 0 & 0 & -0.25\\ 0 & -1 & 0 & 0 & -0.5\\ 0 & 1 & 0 & 0 & -0.5\\ 0 & 0 & -1 & 0 & -1.5\\ 0 & 0 & 1 &0 &-1.5 \end{bmatrix},\mathbf{b}=\begin{bmatrix} -2.25\\ 2.25 \\ -1.5 \\ 1.5\\ -1.5 \\ 1.5 \end{bmatrix} A= 1100000011000000110000000.250.250.50.51.51.5 ,b= 2.252.251.51.51.51.5

该问题没有线性等式约束,也没有决策变量的下界和上界约束,所以可以将这些约束用空矩阵表示:

main

f=@(x)x(5);
xm=[];
xM=[];
A=[-1,0,0,0,-0.25;1,0,0,0,-0.25;0,-1,0,0,-0.5;0,1,0,0,-0.5;0,0,-1,0,-1.5;0,0,1,0,-1.5];
B=[-2.25;2.25;-1.5;1.5;-1.5;1.5];
Aeq=[];
Beq=[];
x0=2*rand(5,1);

[x,f]=fmincon(f,x0,A,B,Aeq,Beq,xm,xM,@constraint)

求解的时候很可能求出局部最优解 x 5 = 1.1448 x_5=1.1448 x5=1.1448,多调用几次就会得到全局最优解 x = [ 2.4544 , 1.9088 , 2.7263 , 1.3510 , 0.8175 ] T \boldsymbol{x}=[2.4544,1.9088,2.7263,1.3510,0.8175]^T x=[2.4544,1.9088,2.7263,1.3510,0.8175]T,目标函数为 0.8175 0.8175 0.8175

在这里插入图片描述

在这里插入图片描述
参考资料:
[1] 薛定宇.《控制系统仿真与计算机辅助设计》.第3版

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

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

相关文章

centos openssl升级

centos openssl升级 一、下载二、(升级)安装 一、下载 执行命令下载: wget https://www.openssl.org/source/openssl-1.1.1f.tar.gz浏览器下载,访问官网网址:https://www.openssl.org/source (1&#xff0…

汇编语言基础--nasm语法数据类型

dd //define 一个字节 例如:dd 100 dw //define 一个字 也就是两个字节 例如:dw 0xaa55 db //define 双字 也就是4个字节 例如:db 0x12345678 由于intel x86的架构采用小端存储因此二进制序列如下: 如果是16进制在后面输入h …

C++ 数据结构图(1)

1. 图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E) &#xff0c;其中&#xff1a; 顶点集合 V {x|x 属于某个数据对象集 } 是有穷非空集合 &#xff1b; E {(x,y)|x,y 属于 V} 或者 E {<x, y>|x,y 属于 V &&…

【Spring Boot 事务】万字详解Spring Boot 事务,赶快跟随良辰一起去学习Spring Boot 事务吧! ! !

前言: 大家好,我是良辰丫,这篇文章我将带领大家一起去学习Spring Boot 事务文章,我们在学习数据库的时候已经接触过事务了,来跟随我的脚步一起来瞧一下Spring Boot 事务吧.&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;…

得物社区推荐精排模型演进

1.背景 得物社区是一大批年轻人获取潮流信息、分享日常生活的潮流生活社区。其中用户浏览的信息&#xff0c;进行个性化的分发&#xff0c;是由推荐系统来决策完成的。目前得物社区多个场景接入了推荐算法&#xff0c;包括首页推荐双列流、沉浸式视频推荐、分类tab推荐流、直播…

Tomcat的安装部署及优化

tomcat安装部署 tomcat安装部署 一、概述&#xff1a;1.tomcat介绍&#xff1a;2.tomcat核心组件&#xff1a;3.tomcat处理内部请求&#xff08;数据流向图&#xff09;4.tomcat服务部署&#xff1a; 二、虚拟主机配置&#xff1a;1.创建 chan 和 baek 项目目录和文件&#xf…

Python常见的开发工具合集对比

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…

BurpSutie拓展插件推荐-漏洞扫描插件

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 fastjsonScan&#xff08;1&#xff09;工具介绍&#xff08;2&#xff09;下载地址&#xff08;3&#xff09;使用说明 02 SpringScan&#xff08;1&#xff09;工具介绍&#xff08;2&#xff09…

python接口自动化(十三)--cookie绕过验证码登录(详解)

简介 有些登录的接口会有验证码&#xff1a;短信验证码&#xff0c;图形验证码等&#xff0c;这种登录的话验证码参数可以从后台获取的&#xff08;或者查数据库最直接&#xff09;。获取不到也没关系&#xff0c;可以通过添加cookie的方式绕过验证码。&#xff08;注意&#x…

GPT模型训练实践(1)-基础概念

GPT 是 Generative Pre-trained Transformers 的缩写&#xff0c;一种先进的深度学习模型&#xff0c;旨在生成类人文本。GPT 的三个组成部分Generative、Pre-trained 和 Transformer&#xff0c;其解释如下&#xff1a; Generative生成&#xff1a;生成模型是用于生成新数据的…

【DASOU视频记录】Transformer从零详细解读

文章目录 来源transformer的全局理解位置编码多头注意力机制残差Batch NormalLayer NormalDecoder 来源 b站链接 transformer的全局理解 输入中文&#xff0c;输出英文 细化容易理解的结构&#xff0c;就是先编码&#xff0c;再解码 进一步细化的结构&#xff0c;就是多个编…

Python_闭包

目录 1.概念介绍 2.闭包初探 3.闭包陷阱 4.闭包的应用 4.1 潜在的问题 5.闭包的实现 闭包并不只是一个python中的概念&#xff0c;在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使用闭包&#xff0c;另一方面可以好好体会和思考闭包的设计思想。…

面试又问到:工作中发现的最有价值的bug?答不好offer要飞了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 这个问题&#xf…

SpringBoot--超时熔断器

需求背景 如果一个服务中有很多涉及需要服务间熔断的地方&#xff0c;就会出现N多下述代码&#xff1a; 1.N个fegnClient接口 FeignClient(name "hello-world-service", fallback HelloWorldFallback.class) public interface HelloWorldService {GetMapping(&q…

gma 2 教程(一)概述:3. 探索 GMA

组织方式 gma 整体按照库-模块-类/函数-&#xff08;方法/属性/子类&#xff09;的思路构建&#xff0c;详细思路如下所示&#xff1a; 整体架构 gma内主要模块与功能对应关系见下表&#xff1a; 模块名中文名对应主要功能io输入输出栅格/矢量数据输入输出模块crs坐标系统坐…

vim的使用方法及相关按键

目录 一、安装vim 二、vim的使用 1.打开vim 2.vim的四种模式使用 &#xff08;1&#xff09;命令模式&#xff08;快捷键的使用&#xff09; &#xff08;2&#xff09;编辑模式 &#xff08;3&#xff09;末行模式 &#xff08;4&#xff09;可视化模式 一、安装vim …

022:vue中tree结构数据变成扁平化table结构数据的示例

第022个 查看专栏目录: VUE — element UI vue在使用element UI tree的时候,有的时候是要做逆向处理的,即将树形结构的数据转化为table结构的数据,即扁平化的json数据。 如何处理呢? 效果图 原始tree结构数据: let newdata= [ {

redis pipeline

redis 执行多条连续的命令的时候为了减少网络开销RTT&#xff0c;可以使用pipeline技术。 pipeline 与 原生批命令(mset, mget) 对比&#xff1a; 原生批命令是原子性&#xff0c;pipeline是非原子性 (原子性概念:一个事务是一个不可分割的最小工作单位,要么都成功要么都失败…

基于Anime2Sketch算法那将图片转成素描

1.下载源码地址 https://github.com/Mukosame/Anime2Sketch下载项目依赖包&#xff0c;下载模型权重文件 运行看效果 python test.py --datarootE:\01_hjz\datas\00-hjz\pictures --load_size512调整自定义测试图片路径 """Test script for anime-to-sketch…

基于Java+Vue前后端分离网上书城系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…