最优解为什么用matlab和lingo差的这么多?
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 =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');=fmincon(fx,x0,[ ],[ ],[ ],[ ],[],[ ],@exm041203_nonlcon,opts)
目标函数最优解求得为 0.0081
这,这是什么情况啊?
这是非线性规划,一般只能得到局部最优解,局部最优解是依赖于初始值和算法的,所以不同的算法和初始值得到的结果是不一样的,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 static/image/common/back.gif
顶!!!!!!!!!
谢了~~~
{:3_49:}= =研究研究啊~~ 本帖最后由 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!
以上是我个人就这一问题的一点想法,仅供参考,如果有什么疑问与建议,请不吝指出,谢谢支持!
小熊伴嫁nori 发表于 2013-8-8 13:39 static/image/common/back.gif
= =研究研究啊~~
该问题我已尝试解决,你可以看看我的回复,欢迎提出你的想法,谢谢支持! madio 发表于 2013-8-6 11:46 static/image/common/back.gif
这是非线性规划,一般只能得到局部最优解,局部最优解是依赖于初始值和算法的,所以不同的算法和初始值得到 ...
感谢madio大哥的回复,对于这个问题,我已尝试解决成功,有时间您可以看看6楼我的回复,辛苦您了! 高端啊………… 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;
=fmincon(fx,x0,[ ],[ ],[ ],[ ],[],[ ],@exm041203_nonlcon)
function =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
页:
[1]