Matlab求解非线性规划(fmincon函数的使用)[通俗易懂]

Matlab求解非线性规划(fmincon函数的使用)[通俗易懂]最近写文章需要用到fmincon函数(寻找约束非线性多变量函数的最小值)做优化,于是抽空学习一下;按照惯例,继续开个博文记录一下学习的过程。

大家好,又见面了,我是你们的朋友全栈君。

最近写文章需要用到fmincon函数做优化,于是抽空学习一下;按照惯例,继续开个博文记录一下学习的过程

参考资料:
[寻找约束非线性多变量函数的最小值 – MathWorks]
[Matlab求解非线性规划,fmincon函数的用法总结 – 博客园]
[Matlab非线性规划 – 博客园]

1. 介绍

在Matlab中,fmincon 函数可以求解带约束的非线性多变量函数(Constrained nonlinear multivariable function)的最小值,即可以用来求解非线性规划问题

matlab中,非线性规划模型的写法如下

m i n    f ( x ) s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q c ( x ) ≤ 0 c e q ( x ) = 0 l b ≤ x ≤ u b min \; f(x) \\ s.t. \begin{cases} A·x ≤b \\ Aeq·x = beq \\ c(x)≤0\\ ceq(x) = 0\\ lb≤x≤ub \end{cases} minf(x)s.t.AxbAeqx=beqc(x)0ceq(x)=0lbxub

  • A、Aeq 为线性约束对应的矩阵
  • b、beq 为线性约束对应的向量
  • C(x),Ceq(x) 为非线性约束(返回向量的函数)
  • f(x) 为目标函数(返回标量的函数)

2. 语法

Matlab求解命令为:
x = f m i n c o n ( f u n , x 0 , A , b , A e q , b e q , l b , u b , n o n l c o n , o p t i o n s ) x = fmincon(fun,x0,A, b,Aeq,beq,lb,ub,nonlcon,options) x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

  • x的返回值是决策向量x的取值,fval的返回值是目标函数f(x)的取值
  • fun是用M文件定义的函数f(x),代表了(非)线性目标函数
  • x0是x的初始值
  • A, b, Aeq, beq定义了线性约束,如果没有线性约束,则A=[], b=[], Aeq=[], beq=[]
  • lb和ub是变量x的下界和上界,如果下界和上界没有约束,则lb=[], ub=[], 也可以写成lb的各分量都为 -inf, ub的各分量都为inf
  • nonlcon是用M文件定义的非线性向量函数约束
  • options定义了优化参数,不填写表示使用Matlab默认的参数设置

3. 示例

求下列非线性规划问题:
m i n    f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 s . t . { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 2 + x 2 2 + x 3 2 ≤ 20 − x 1 2 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 min \; f(x) = x_{1}^2 + x_{2}^2+x_{3}^2+8 \\ s.t. \begin{cases} x_{1}^2-x_{2} +x_{3}^2≥0 \\ x_{1}^2+x_{2}^2 +x_{3}^2≤20 \\ -x_{1}^2-x_{2}^2 +2=0\\ x_{2} +2x_{3}^2=3\\ x_{1}, x_{2} ,x_{3}≥0 \end{cases} minf(x)=x12+x22+x32+8s.t.x12x2+x320x12+x22+x3220x12x22+2=0x2+2x32=3x1,x2,x30

3.1 编写M函数fun1.m,定义目标函数

function f = fun1(x)
f = x(1).^2 + x(2).^2 + x(3).^2 + 8;
end

3.2 编写M函数fun2.m,定义非线性约束条件

function [g,h] = fun2(x)
g(1) = - x(1).^2 + x(2) - x(3).^2;
g(2) = x(1) + x(2).^2 + x(3).^3 - 20;
% g代表不等式约束,Matlab中默认g<=0,所以这里取相反数
h(1) = - x(1).^2 - x(2).^2 + 2;
h(2) = x(2) + 2 * x(3).^2 - 3;
% h代表等式约束        
end

3.3 编写主程序函数

options = optimset;
[x, y] = fmincon('fun1', rand(3, 1), [], [], [], [], zeros(3, 1), [], 'fun2', options)
% 'fun1'代表目标函数,rand(3, 1)随机给了x初值,zeros(3, 1)代表下限为0,即x1, x2, x3>=0, 'fun2'即刚才写的约束条件

所得结果,x为最优解,y为最优值:
x 1 = 0.6312 , x 2 = 1.2656 , x 3 = 0.9312 y = 10.8672 x_{1}=0.6312,x_{2}=1.2656,x_{3}=0.9312\\ y=10.8672 x1=0.6312,x2=1.2656,x3=0.9312y=10.8672

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138937.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • navicat手动激活码【2021最新】

    (navicat手动激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • java多线程并发之旅-14-lock free queue 无锁队列[通俗易懂]

    java多线程并发之旅-14-lock free queue 无锁队列[通俗易懂]无锁队列能实现吗?上面说的加锁的环形队列,可以保证线程安全。但是加锁能不能去掉呢?答案是肯定的,请看下面的娓娓道来。i++是原子操作吗?i++和++i是原子操作吗?有一个很多人也许都不是很清楚的问题:i++或++i是一个原子操作吗?在上一节,其实已经提到了,在SMP(对称多处理器)上,即使是单条递减汇编指令,其原子性也是不能保证的。那么在单处理机系统中呢?在编译器对C/C++源代码…

  • 京东商城2020年销售额_天猫精灵怎么激活互联网

    京东商城2020年销售额_天猫精灵怎么激活互联网今日看点✦2020天猫双11全球狂欢季总成交额4982亿,超450个品牌成交额过亿✦京东11.11全球热爱季累计下单金额超2715亿,再创纪录✦百度整合好看视频和全民小视频,升级为…

    2022年10月25日
  • Doc2Vec,Word2Vec文本相似度 初体验。

    Doc2Vec,Word2Vec文本相似度 初体验。

  • 随机抽奖小程序_在线随机抽号小程序

    随机抽奖小程序_在线随机抽号小程序本实例使用随机数字生成5位抽奖号码,并显示在窗体的5个文本框中。当用户单击"开始"按钮时,将启动一个线程对象为5个文本框生成随机数字。单击"抽奖"按钮时,线程对

  • U盘启动和量产_u盘量产容量恢复

    U盘启动和量产_u盘量产容量恢复  今天装系统,光盘启动老是不行,心血来潮就想做一个U盘启动,刚好有个金士顿的Datatravalor16G的U盘,就下载USBBoot作启动盘,zip模式直接不行,HDD倒是可以格,格完后,就只有2G了。在系统管理里可以看到剩余的空间,但无法使用。  于是找芯片识别,找量产工具,完全不会用,试了2个小时,才找到门路:先用F1程序生成配置文件,其实就是U盘想做成什么样子,然后在量产工具中加载…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号