matlab解决一般的一元/多元函数的非线性优化问题

  在之前《matlab中解决线性规划问题》与《matlab解决有约束的的二次规划问题》两篇博文中,我们已经成功解决了两种多项式优化问题,现在我们来看更一般的情况。

  这里需要使用函数fmincon()。

  先使用help fmincon查看fmincon()的调用格式

help fmincon
fmincon - Find minimum of constrained nonlinear multivariable function

    This MATLAB function starts at x0 and attempts to find a minimizer x of the
    function described in fun subject to the linear inequalities A*x ≤ b.

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

   与《matlab解决有约束的的二次规划问题》(https://blog.csdn.net/qq_42138454/article/details/100132822)中quadprog()函数对比,可以看到,fmincon的调用格式与求解非线性约束的二次规划时所用的quadprog()函数基本相同,在线性约束部分,同样含有A,b,Aeq,beq,lb,ub,这些参数,并且意思完全相同,不同之处在于非线性约束函数目标函数fun的定于与非线性约束条件nonlcon的定义。

任然使用例子来解释

【例】求解优化问题

【分析】

  • 目标函数的定义

需要使用函数句柄定义,或者新建一个脚本文件,对

把s和t分别当作x(1)与x(2)

新建一个脚本fun.m,并且输入

function y=fun(x)
y=x(1)^4-4*x(1)-8*x(2)+15;
  • 非线性约束条件的定义

同目标函数的定义,使用函数句柄或者新建脚本来创建约束条件。

对照约束函数的标准形式:

可以知道:

1.需要将约束条件转化成“不等式左边为式子,右边为0”的形式。

(注意不等号的方向!)

2.标准形式中这里的Ceq表示等式约束,与二次规划中是类似的,当不含有等式约束时,Ceq为空,即Ceq=[]

新建脚本cons.m

function [c,ceq]=cons(x)
c=[9-x(1)^2-x(2)^2];
ceq=[];

注意这个函数的函数头function [c,eq]=cons(x),有两个返回参数,c与ceq。同时注意返回参数的计算方法!

以上便完成了非线性约束条件的定义(线性约束条件还未定义!)

注:如果含有多个非线性约束条件

这个为例,则需要写成

function [c,eq]=cons(x)

c=[x(1)*x(2)+x(1)-x(2)+1.5;

10-x(1)*x(2)];

ceq=[];

  • fmincon()函数的调用

按照上文中利用help fmincon找出的调用格式,调用fmincon()即可。注意下面代码中的[1 2]这个参数,分别表示s和t的迭代初值是1和2。所谓“迭代”,这一词源于matlab中fmincon()函数的求解方法——迭代法,可以理解为一个接近与s和t的解的初值。   

其中A和b表示线性约束部分,可以参考https://blog.csdn.net/qq_42138454/article/details/100132822一文

%A与b表示线性约束部分
A=[2 3;1 -1];  
b=[2;5];
[x,fval,exitflag,output]=fmincon(@fun,[1 2],A,b,[],[],[],[],@cons)

输出结果:

x =

   -2.1454    2.0969


val =

   27.9921


exitflag =

     1


output = 

  包含以下字段的 struct:

         iterations: 9
          funcCount: 37
    constrviolation: 0
           stepsize: 8.8282e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4874e-05
       cgiterations: 0
            message: '太长省略'

成功完成!

发布了29 篇原创文章 · 获赞 6 · 访问量 3424

猜你喜欢

转载自blog.csdn.net/qq_42138454/article/details/100141583
今日推荐