数学建模社区-数学中国

标题: 最优解为什么用matlab和lingo差的这么多? [打印本页]

作者: 百年孤独    时间: 2013-8-6 11:36
标题: 最优解为什么用matlab和lingo差的这么多?
QQ截图20130806113608.png


lingo:
min=(4*x1^2+2*x2^2+4*x1*x2+2*x2+1)*@exp(x1);
x2*@sqrt(x1+20)-2*x1<=11;
x2*@abs(0.1*x1+1.8)+x1>=-11;
目标函数最优解求得为1

matlab:
function [cx,ceqx]=exm041203_nonlcon(x)
cx=[(-x(1)+x(2)*sqrt(x(1)+20)-11);(-x(1)-x(2)*abs(0.1*x(1)+1.8)-11)];
ceqx=[ ];

fx=@(x)(exp(x(1)).*(4*x(1).^2+2*x(2).^2+4*x(1).*x(2)+2*x(2)+1));
x0=[-16,-12,-8;10,4,-2];
opts = optimset('Algorithm','active-set');[x,fval]=fmincon(fx,x0,[ ],[ ],[ ],[ ],[],[ ],@exm041203_nonlcon,opts)
目标函数最优解求得为 0.0081

这,这是什么情况啊?

作者: madio    时间: 2013-8-6 11:46
这是非线性规划,一般只能得到局部最优解,局部最优解是依赖于初始值和算法的,所以不同的算法和初始值得到的结果是不一样的,lingo是专业在优化领域的,相对来说求解的解要好很多,lingo也有全局求解器,可以在Lingo->options中开启,这样就可以得到全局最优解了。

  Linearization components added:
      Constraints:           4
      Variables:             4
      Integers:              1

  Global optimal solution found.
  Objective value:                              1.000000
  Objective bound:                              1.000000
  Infeasibilities:                              0.000000
  Extended solver steps:                               0
  Total solver iterations:                            31

  Model Class:                                     MINLP

  Total variables:                      6
  Nonlinear variables:                  3
  Integer variables:                    1

  Total constraints:                    7
  Nonlinear constraints:                3

  Total nonzeros:                      17
  Nonlinear nonzeros:                   6

                                Variable           Value        Reduced Cost
                                      X1        0.000000            1.000000
                                      X2        0.000000            2.000000

                                     Row    Slack or Surplus      Dual Price
                                       1        1.000000           -1.000000
                                       2        11.00000            0.000000
                                       3        11.00000            0.000000

作者: 秋晨之梦    时间: 2013-8-6 13:38
顶!!!!!!!!!
作者: 百年孤独    时间: 2013-8-6 14:27
秋晨之梦 发表于 2013-8-6 13:38
顶!!!!!!!!!

谢了~~~

作者: 小熊伴嫁nori    时间: 2013-8-8 13:39
= =研究研究啊~~
作者: wujianjack2    时间: 2013-8-11 19:16
本帖最后由 wujianjack2 于 2013-8-11 19:58 编辑

   楼主提了一个很好的问题!也很感谢madio大哥的解答,在此给出我就这一问题的想法。
   首先要指出的是楼主的MATLAB程序中出现的一处小疏漏:
   由题意,“cx=[(-x(1)+x(2)*sqrt(x(1)+20)-11);(-x(1)-x(2)*abs(0.1*x(1)+1.8)-11)];”
   应为“cx=[(-2*x(1)+x(2)*sqrt(x(1)+20)-11);(-x(1)-x(2)*abs(0.1*x(1)+1.8)-11)];”这样约束才与原题相同。
经过这个修改后,再次用MATLAB计算得:
   当x1=-0.9071,x2=-2.1604时,取得最优值feval=0.0475。

  再看用LINGO解决该问题的方案,之所以与MATLAB求解的结果出现如此大的不同,是因为LINGO默认变量非负,而由MATLAB结果知,最优点的x1,x2均取负值,解决的办法是取消对变量非负的限制,修改后的程序代码如下:
min=(4*x1^2+2*x2^2+4*x1*x2+2*x2+1)*@exp(x1);
x2*@sqrt(x1+20)-2*x1<=11;
x2*@abs(0.1*x1+1.8)+x1>=-11;
@free(x1);@free(x2);

一般我们先尝试不勾选Global Solver求解,得到的结果如下:
  Linearization components added:
      Constraints:           4
      Variables:             4
      Integers:              1

  Local optimal solution found.
  Objective value:                             0.4753628E-01
  Objective bound:                           0.4753628E-01
  Infeasibilities:                                  0.4746425E-11
  Extended solver steps:                            2
  Total solver iterations:                            37

  Variable           Value        Reduced Cost
      X1         -9.070999         0.000000
      X2         -2.160377         0.000000
从这个结果来看,与MATLAB的结果是一致的。

然而,本问题是一个非线性规划问题,局部最优解不一定是全局最优解,勾选Global Solver后求解结果如下:
  Global optimal solution found.
  Objective value:                             0.8053973E-14
  Objective bound:                           -0.1000000E-09
  Infeasibilities:                                   0.000000
  Extended solver steps:                         100
  Total solver iterations:                         11510

  Variable           Value        Reduced Cost
      X1         0.5000000         0.000000
      X2         -1.000000          0.000000
最优点与之前求解的有明显不同,可见之前求解的局部最优解不是全局最优解。
事实上,将X1=0.5,X2=-1代入原式中发现最优解结果就是0!

以上是我个人就这一问题的一点想法,仅供参考,如果有什么疑问与建议,请不吝指出,谢谢支持!

作者: wujianjack2    时间: 2013-8-11 19:47
小熊伴嫁nori 发表于 2013-8-8 13:39
= =研究研究啊~~

该问题我已尝试解决,你可以看看我的回复,欢迎提出你的想法,谢谢支持!
作者: wujianjack2    时间: 2013-8-11 19:50
madio 发表于 2013-8-6 11:46
这是非线性规划,一般只能得到局部最优解,局部最优解是依赖于初始值和算法的,所以不同的算法和初始值得到 ...

感谢madio大哥的回复,对于这个问题,我已尝试解决成功,有时间您可以看看6楼我的回复,辛苦您了!
作者: warriorIverson    时间: 2014-2-6 19:26
高端啊…………
作者: shengshengchina    时间: 2015-7-25 09:11
function sh
fx=@(x)(exp(x(1)).*(4*x(1).^2+2*x(2).^2+4*x(1).*x(2)+2*x(2)+1));
%  x0=[-16,-12,-8;10,4,-2];这个初值费解,怎么是这样呢?
x0=zeros(1,2)-1;
[x,fval]=fmincon(fx,x0,[ ],[ ],[ ],[ ],[],[ ],@exm041203_nonlcon)
function [cx,ceqx]=exm041203_nonlcon(x)
cx=[(-2*x(1)+x(2)*sqrt(x(1)+20)-11);(-x(1)-x(2)*abs(0.1*x(1)+1.8)-11)];
ceqx=[ ];


结果:
x =

    0.5000   -1.0000


fval =

  4.5312e-010





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5