A=[1 0 -15 0;0 1 0 -70];
b=[0;0];
vub=[900;1000;30;30];
vlb=[500;500;5;5];
[x,fval,exitflag,output,lambda,grad,hession]=fmincon('funn',x0,A,b,[],[],vlb,vub,'nonlin')
目标函数function y=funn(x)
y=x(1)*x(3)+x(2)*x(4)
非线性约束条件
function [c,y]=nonlin(x)
c(1) = -0.01*x(2)*x(4)+2500;
c(2)=-x(2)*(x(1)*x(3)+x(2)*x(4)/6+(1+(20-2*x(1)*x(3))/(20+x(2)*x(4))))+90000
y=[];
结果为
x =
1.0e+003 *
0.5660 1.0985 0.0130 0.1285
fval =
1.4847e+005
exitflag =
-2
那个结果得到的x超出vub上限了呢?
非线性约束条件是两个不等式
-0.01*x(2)*x(4)<=-2500
-x(2)*(x(1)*x(3)+x(2)*x(4)/6+(1+(20-2*x(1)*x(3))/(20+x(2)*x(4))))<=-90000
关于matlab多元非线性优化问题,大神来帮帮忙啊
答案:2 悬赏:0 手机版
解决时间 2021-12-29 14:57
- 提问者网友:富士山上尢
- 2021-12-28 22:07
最佳答案
- 五星知识达人网友:怙棘
- 2021-12-28 23:24
你的这个问题约束条件不对。
按照你给的变量范围,x2<=1000, x4<=30,那么-0.01*x(2)*x(4)>=-300,无法满足<=-2500的条件,所以根本找不到可行解。
你在上个问题中的第一个约束条件最右边的常数是220,不知道为什么这里变成了2500.
再考虑到还有Ax<=b构成的线性不等式约束,即使把上面的2500改成220,也无法找到可行解。因为该线性不等式的第一个就是x1-15*x3<=0,而x1最小值为500,x3最大值为30,不等式根本不可能满足。
优化问题并非随便一写就交给软件去计算的,而是需要对问题进行一定的分析,至少应该构造出一组初始可行解来才行。至于优化的结果,也应该根据exitflag判断是否优化成功,如果失败,可以大致知道原因,例如-2就代表找不到可行解(No feasible point was found),这种情况下,就应该好好检查约束条件是否合理。
按照你给的变量范围,x2<=1000, x4<=30,那么-0.01*x(2)*x(4)>=-300,无法满足<=-2500的条件,所以根本找不到可行解。
你在上个问题中的第一个约束条件最右边的常数是220,不知道为什么这里变成了2500.
再考虑到还有Ax<=b构成的线性不等式约束,即使把上面的2500改成220,也无法找到可行解。因为该线性不等式的第一个就是x1-15*x3<=0,而x1最小值为500,x3最大值为30,不等式根本不可能满足。
优化问题并非随便一写就交给软件去计算的,而是需要对问题进行一定的分析,至少应该构造出一组初始可行解来才行。至于优化的结果,也应该根据exitflag判断是否优化成功,如果失败,可以大致知道原因,例如-2就代表找不到可行解(No feasible point was found),这种情况下,就应该好好检查约束条件是否合理。
全部回答
- 1楼网友:旧脸谱
- 2021-12-28 23:51
错误很多:
1、按照函数fmincon的参数顺序,在非线性约束之前,还应该有变量上限,即
[x,fval,exitflag,output,lambda,grad,hession]=fmincon('funn',x0,a,b,[],[],vlb,[],'nonlin')2、非线性等式约束只需要写成方程左侧就可以了:
y=-0.01*x(2)*x(4)+220
y=-x(2)*(x(1)*x(3)+x(2)*x(4)/6+(1+(20-2*x(1)*x(3))/(20+x(2)*x(4))))+90000你原来的写法有两个等号,语法上就是错误的。
3、非线性约束函数的格式要求必须返回两个参数,即不等式和等式,如果没有不等式约束,可返回空:
function [c,y]=nonlin(x)
c = [];
y=-0.01*x(2)*x(4)+220
y=-x(2)*(x(1)*x(3)+x(2)*x(4)/6+(1+(20-2*x(1)*x(3))/(20+x(2)*x(4))))+90000
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯