查看: 815|回复: 24|关注: 0

[已解决] 求解带约束的非线性优化时遇到问题

[复制链接]

新手

8 麦片

财富积分


050


2

主题

16

帖子

0

最佳答案
本帖最后由 hexiaohua 于 2018-12-20 07:12 编辑

我在求解一个非线性优化问题,运行后的结果出现了问题。
优化问题如下:
求 关于e1和e2的函数 (e2/2 - 2*e1^2 - 1/16)*(e2/2 - 2*e2^2 - 1/32) 的最大值,约束条件有四个:
(1)  e1 >= 0,
(2)  e2 >= 0,
(3)  e2/2 - 2*e1^2 >= 1/16,
(4)  e2/2 - 2*e2^2 >= 1/32.

很显然通过笔算结果是e1=0,e2=1/8.

但是我利用matlab专门的优化工具yalmip计算后却出现了错误,程序运行的结果为:

solution_e1 =
    0.0020
solution_e2 =
    0.1250

显然e1的结果是错误的,请问是哪里出了问题?求坛里高手赐教,谢谢!
下面是我写的代码:

e1 = sdpvar(1,1);
e2 = sdpvar(1,1);

Constraints = [e1 >= 0, e2 >= 0, e2/2 - 2*e1^2 >= 1/16, e2/2 - 2*e2^2 >= 1/32];
Objective = (e2/2 - 2*e1^2 - 1/16)*(e2/2 - 2*e2^2 - 1/32);

options  = sdpsettings('verbose',0,'solver','fmincon');
output = optimize(Constraints,-Objective,options);

    if output.problem == 0
        % Extract and display value
        solution_e1 = value(e1)
        solution_e2 = value(e2)
    else
        display('something went wrong!');
        output.info;
        yalmiperror(output.problem);
    end

新手

8 麦片

财富积分


050


2

主题

16

帖子

0

最佳答案
 楼主| 发表于 2018-12-20 07:15:26 | 显示全部楼层
这个优化问题本身很简单,是我正在研究的一个较复杂问题的特殊情况,但是程序运行却出现了错误,想了一天也没找出问题所在。希望高手看看症结所在,谢谢

论坛优秀回答者

权威

3211 麦片

财富积分



2

主题

3501

帖子

721

最佳答案
  • 关注者: 148
发表于 2018-12-20 08:00:48 | 显示全部楼层
hexiaohua 发表于 2018-12-20 07:15
这个优化问题本身很简单,是我正在研究的一个较复杂问题的特殊情况,但是程序运行却出现了错误,想了一天也 ...

得到准确值,有时是比较困难的。
对于,你的题目,增加迭代次数。
[ 0.0000000086613132666384223986, 0.12503183831766528922]

新手

8 麦片

财富积分


050


2

主题

16

帖子

0

最佳答案
 楼主| 发表于 2018-12-20 08:13:54 | 显示全部楼层
本帖最后由 hexiaohua 于 2018-12-20 09:07 编辑
maple1314168 发表于 2018-12-20 08:00
得到准确值,有时是比较困难的。
对于,你的题目,增加迭代次数。
[ 0.0000000086613132666384223986, 0. ...

请问怎么增加迭代次数呢?我最近刚学,麻烦贴下代码,谢谢啦!
另外还想请教两个问题:(1) 解我贴的这个问题最好选择哪个solver器进行求解?还是说不需要自己选择由计算机自己决定?(2) 解这种小规模的非线性优化问题最好的策略是什么?yalmip工具箱是我一个朋友推荐的,不知道是不是可靠?

论坛优秀回答者

中级

893 麦片

财富积分


5001500


0

主题

2279

帖子

194

最佳答案
  • 关注者: 127
发表于 2018-12-20 09:39:52 | 显示全部楼层
1#的问题当e2等于后取决于0.125时,只要e1大概小于1e-5,都可以满足约束(从数值计算精度看),说是多解也可以:
1:
目标函数值(最大): 0
e1: 1.11919490680349E-5
e2: 0.125000000942311

2:
目标函数值(最大): 0
e1: 6.12935852842461E-6
e2: 0.125000001028228

3:
目标函数值(最大): 0
e1: 8.77206345017773E-6
e2: 0.125000000877404

新手

8 麦片

财富积分


050


2

主题

16

帖子

0

最佳答案
 楼主| 发表于 2018-12-20 09:51:08 | 显示全部楼层
shihe 发表于 2018-12-20 09:39
1#的问题当e2等于后取决于0.125时,只要e1大概小于1e-5,都可以满足约束(从数值计算精度看),说是多解也 ...

谢谢,可以贴下代码么?要是程序运行结果e1<10^-5那还是可以接受的,我目前算的这个差的太离谱了

论坛优秀回答者

中级

893 麦片

财富积分


5001500


0

主题

2279

帖子

194

最佳答案
  • 关注者: 127
发表于 2018-12-20 10:17:32 | 显示全部楼层
自己用1stOpt计算试试,很简单:

  1. Parameter e1 >= 0, e2 >= 0;
  2. MaxFunction (e2/2 - 2*e1^2 - 1/16)*(e2/2 - 2*e2^2 - 1/32);
  3.   e2/2 - 2*e1^2 >= 1/16;
  4.   e2/2 - 2*e2^2 >= 1/32;
复制代码

新手

8 麦片

财富积分


050


2

主题

16

帖子

0

最佳答案
 楼主| 发表于 2018-12-20 10:36:50 | 显示全部楼层
本帖最后由 hexiaohua 于 2018-12-20 10:38 编辑
shihe 发表于 2018-12-20 10:17
自己用1stOpt计算试试,很简单:

一楼的问题只是我研究问题的一个特例,我现在想知道的就是如何使用yalmip求解。因为如果稍微复杂一点,maxfuntion应该算不了吧。比如下面这个优化问题:
最大化如下关于e1和e2的最大化问题:
  1. (e1^0.011*e2^(1-0.011)*(8/9) - 2*e1^2 - 2^0.011*0.011^0.011*(1-0.011)^(1-0.011)*(1+0.011)^(-1-0.011)*(2^(4+2*0.011)/324))*(e1^0.011*e2^(1-0.011)*(2/9) - 2*e2^2 - 2^(0.011-1)*0.011^0.011*(1-0.011)^(1-0.011)*(1+0.011)^(1-0.011)*(2^(2+2*0.011)/324))
复制代码

约束条件为以下四个:
  1. e1 >= 0,

  2. e2 >= 0,

  3. e1^0.011*e2^(1-0.011)*(8/9) - 2*e1^2 >= 2^0.011*0.011^0.011*(1-0.011)^(1-0.011)*(1+0.011)^(-1-0.011)*(2^(4+2*0.011)/324),

  4. e1^0.011*e2^(1-0.011)*(2/9) - 2*e2^2 >= 2^(0.011-1)*0.011^0.011*(1-0.011)^(1-0.011)*(1+0.011)^(1-0.011)*(2^(2+2*0.011)/324)
复制代码

就必须求数值解了吧。
所以我想知道该怎么用yalmip解决?

新手

8 麦片

财富积分


050


2

主题

16

帖子

0

最佳答案
 楼主| 发表于 2018-12-20 10:43:51 | 显示全部楼层
shihe 发表于 2018-12-20 10:17
自己用1stOpt计算试试,很简单:

楼上有人说问题是由于迭代次数不够造成的,请问你知道怎么增加迭代次数吗?我最近初学matlab,还不太熟悉。另外解这类小型的非线性优化问题选用哪种solver求解器最好呢?

论坛优秀回答者

中级

893 麦片

财富积分


5001500


0

主题

2279

帖子

194

最佳答案
  • 关注者: 127
发表于 2018-12-20 11:44:45 | 显示全部楼层
hexiaohua 发表于 2018-12-20 10:36
一楼的问题只是我研究问题的一个特例,我现在想知道的就是如何使用yalmip求解。因为如果稍微复杂一点,max ...

目标函数值(最大): 1.85576177727578E-7
e1: 0.0406768271726109
e2: 0.0600069862224229

约束函数:
1: e1^0.011*e2^(1-0.011)*(8/9) - 2*e1^2-(2^0.011*0.011^0.011*(1-0.011)^(1-0.011)*(1+0.011)^(-1-0.011)*(2^(4
+2*0.011)/324)) = 0.0027689057376655
2: e1^0.011*e2^(1-0.011)*(2/9) - 2*e2^2-(2^(0.011-1)*0.011^0.011*(1-0.011)^(1-0.011)*(1+0.011)^(1-0.011)
*(2^(2+2*0.011)/324)) = 6.70214862149984E-5
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表