永发信息网

关于matlab多元非线性优化问题,大神来帮帮忙啊

答案:2  悬赏:0  手机版
解决时间 2021-12-29 14:57
  • 提问者网友:富士山上尢
  • 2021-12-28 22:07
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
最佳答案
  • 五星知识达人网友:怙棘
  • 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),这种情况下,就应该好好检查约束条件是否合理。
全部回答
  • 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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯