草庐IT

【MATLAB】求解约束条件下的目标函数最值(fmincon用法解析)

何为xl 2023-04-13 原文

【MATLAB】求解约束条件下的目标函数最值(fmincon用法解析)

一、简介

Matlab 的函数 fmincon 用来求最小约束非线性多变量函数,是一个非线性编程求解器,算出指定的问题的最小值。

注: fmincon 同样可以用来求约束条件下的最大值,主要将目标函数取反(前面加一个负号)即可。

二、fmincon()的基本形式与参数

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

输入参数:

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

输出参数:

  1. X 输出最优参数值
  2. Fval 输出 fun 在X参数的值
  3. Exitflag 输出fmincon额外条件值

fmincon 求解函数的基本形式:

三、约束条件类型与参数写法

约束条件下的函数极值有是三种情况
(1)线性不等式约束;
(2)线性等式约束;
(3)非线性不等式和等式约束;

1.线性不等式约束(参数写法)

线性不等式约束条件如下:


将不等式化为矩阵形式:

fmincon函数的参数可以确定为:

A = [1,2; 3,4; 5,6]; 
b = [10; 20; 30];

2.线性等式约束(参数写法)

线性等式约束条件如下:

同理转换为矩阵后,可知约束参数为:

Aeq = [1,2,3; 2,4,1]; 
beq = [10; 20];

3.非线性约束(参数写法)


非线性约束条件如下:

确认为参数时,需要设置为函数形式、。

function [c,ceq]=mycon(x)
c=-x(1)^2+x(2);  %此处不要忘记将不等式改成不等式<=0的标准形式
ceq=-x(1)-x(2)^2+2;

注:函数调用时,nonlcon 参数值为 ‘函数名’

四、例题

(1)线性不等式约束下求最值示例

以上是关于求目标函数

f = 100 ∗ ( x 2 − x 1 ) 2 + ( 1 − x 1 ) 2 f=100 *(x_2-x_1)^2+(1-x_1)^2 f=100x2x12+(1x1)2

在线性约束 x 1 + 2 x 2 ≤ 1 x_1+2x_2\le1 x1+2x21 条件下的最小值,结果如下:

目标函数:

function f = fminx(x)
    f = 100 * (x(2) - x(1)).^2 + (1-x(1)).^2;
end

fmincon函数的使用:

[x,fval,exitflag] = fmincon(@(x) fminx(x),[0,0],[1,2],[1])

结果:

x =

    0.3363    0.3319


fval =

    0.4425


exitflag =

     1

注:结果含义为 在 x 1 = 0.3363 , x 2 = 0.3319 时,取最小值: y = 0.4425 x_1=0.3363, x_2=0.3319时,取最小值:y=0.4425 x1=0.3363,x2=0.3319时,取最小值:y=0.4425

(2)线性不等式和等式约束条件下求最值示例

目标函数: f = 100 ∗ ( x 2 − x 1 ) 2 + ( 1 − x 1 ) 2 f=100 *(x_2-x_1)^2+(1-x_1)^2 f=100x2x12+(1x1)2
约束条件:

这次使用目标函数为匿名函数的方式,一步到位:

fun=@(x)100*(x(2)-x(1))^2+(1-x(1))^2;
x0=[0,0];
A=[1,2];
b=10;
Aeq=[3,4];
beq=20;
[x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq)

结果为:

x =

    2.8511    2.8617


fval =

    3.4378


exitflag =

     1

(3)非线性约束下求最值示例

上面两题只有目标函数是非线性的,如果其约束条件也是非线性的,我们又该怎么办呢?

示例1:

目标函数求值代码:

fun = @(x)x(1)^2+x(2)^2+12;
x0 = rand(2,1);
A=[];   
Aeq=[];
b=[];
beq=[];
lb=[0,0];
ub=[];
exitflag=1;
[x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,'mycon')

非线性约束条件:

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

结果为:

x =

    1.2471
    0.0000


fval =

   13.5552


exitflag =

    -2

示例2:

目标函数为: f u n = 100 ∗ ( x 2 − x 1 ) 2 + ( 1 − x 1 ) 2 fun = 100*(x_2-x_1)^2 +(1-x_1)^2 fun=100(x2x1)2+(1x1)2

约束条件:在以 ( 1 / 3 , 1 / 3 ) (1/3,1/3) 1/31/3为圆心,1/3 为半径, 0 ≤ x 1 ≤ 0.5 , 0.2 ≤ x 2 ≤ 0.8 0 ≤ x _1 ≤ 0.5 , 0.2≤x_2≤0.8 0x10.50.2x20.8 的边界约束

function f=fun1(x)
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
end

function [g,h]=fun2(x)
g=(x(1)-1/3)^2+(x(2)-1/3)^2-1/9;
h=[];
end

[x,y] = fmincon('fun1',[1/3,1/3],[],[],[],[],lb,ub,'fun2')

结果如下:

x =
    0.5000    0.2500
y =
    0.2500

五、总结

非线性规划求最值的fmincon函数其实和线性规划的improg大同小异,关键是对非线性约束条件的把握,即nonlcon,以及option(一般情况下我们不用管,默认值就可以了,有需求具体查阅使用即可)。

参考博客|:

https://blog.csdn.net/qq_52753078/article/details/121244164

https://blog.csdn.net/qq_36932020/article/details/98670486

有关【MATLAB】求解约束条件下的目标函数最值(fmincon用法解析)的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  5. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  6. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  7. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  8. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  9. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  10. ruby-on-rails - 将字符串转换为 ruby​​-on-rails 中的函数 - 2

    我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。

随机推荐