simonsnow 发表于 2015-7-22 16:44

lingo和matlab求解

这道题怎么做啊,求详细求解过程。matlab不写也可以,lingo怎么算

liwenhui 发表于 2015-7-22 16:44

情况1:求a分别等于 0,1,2,3,4, b分别等于2,4,6,7时的最优值,这等价于求解20个非线性最优化问题,可以用下面的程序:model:
  sets:
    looppt1/1..5/:a;
    looppt2/1..4/:b;
  endsets
  data:
    a=0,1,2,3,4;
    b=2,4,6,7;
  enddata
  submodel model1:
    min=4*x1^3-p1*x1-2*x2;
    x1+x2<4;
    2*x1+x2<5;
    -x1+p2*x2>2;
  endsubmodel
  calc:
    @for(looppt1(i):
      @for(looppt2(j):
        p1=a(i);
        p2=b(j);
        @solve(model1);
      );
    );
  endcalc
end情况2:求a 的值被约束为{0,1,2,3,4},b的值被约束为{2,4,6,7}的最优解,这可以考虑用一个多项式来约束a和b的值,可以试试如下的程序:model:
  min=4*x1^3-a*x1-2*x2;
  x1+x2<4;
  2*x1+x2<5;
  -x1+b*x2>2;  
  a*(a-1)*(a-2)*(a-3)*(a-4)=0;
  (b-2)*(b-4)*(b-6)*(b-7)=0;
end在MATLAB中应该也有类似的方法。

liwenhui 发表于 2015-7-23 15:17

你是想求a分别等于 0,1,2,3,4, b分别等于2,4,6,7时的值呢?还是想求a 的值被约束为{0,1,2,3,4},b的值被约束为{2,4,6,7}的值?

Sassoon 发表于 2015-7-23 15:48

用lingo规划  ,只能换值
用matlab,对a,b进行循环就行了

liwenhui 发表于 2015-7-23 16:22

Sassoon 发表于 2015-7-23 15:48 static/image/common/back.gif
用lingo规划  ,只能换值
用matlab,对a,b进行循环就行了

LINGO也有循环语句功能。

simonsnow 发表于 2015-7-23 16:29

liwenhui 发表于 2015-7-23 15:17 static/image/common/back.gif
你是想求a分别等于 0,1,2,3,4, b分别等于2,4,6,7时的值呢?还是想求a 的值被约束为{0,1,2,3,4},b ...

题目就是这么出的,我的理解应该是后者

simonsnow 发表于 2015-7-23 16:35

liwenhui 发表于 2015-7-23 16:30 static/image/common/back.gif
情况1:求a分别等于 0,1,2,3,4, b分别等于2,4,6,7时的最优值,这等价于求解20个非线性最优化问题,可以 ...

我觉得按照前者和后者的理解本质应该是一样的吧

liwenhui 发表于 2015-7-23 16:47

simonsnow 发表于 2015-7-23 16:35 static/image/common/back.gif
我觉得按照前者和后者的理解本质应该是一样的吧

本质上不太一样,
前者其实可以看作一种情景分析,即参数取不同值时的最优解;
后者就是一个简单混合非线性优化问题;

就看你的研究目的是什么。

wujianjack2 发表于 2015-7-23 18:50

liwenhui 发表于 2015-7-22 16:44 static/image/common/back.gif
情况1:求a分别等于 0,1,2,3,4, b分别等于2,4,6,7时的最优值,这等价于求解20个非线性最优化问题,可以 ...

  不错!
  我觉得这样会好一点:
model:
  sets:
  bs/1..4/: b, b_c;
  endsets
  data:
  b = 2, 4, 6, 7;
  enddata
  min=4*x1^3-a*x1-2*x2;
  x1+x2<4;
  2*x1+x2<5;
  -x1+b_p*x2>2;  
  @bnd(0, a, 4); @gin(a);
  b_p = @sum(bs(i): b(i)*b_c(i));
  @for(bs(i): @bin(b_c(i)));
  @sum(bs(i): b_c(i)) = 1;
end

liwenhui 发表于 2015-7-24 11:24

wujianjack2 发表于 2015-7-23 18:50 static/image/common/back.gif
不错!
  我觉得这样会好一点:
model:


可能这是见仁见智,你给出的程序中这一段可能结构化不是很强:@bnd(0, a, 4); @gin(a);
  b_p = @sum(bs(i): b(i)*b_c(i));
  @for(bs(i): @bin(b_c(i)));
  @sum(bs(i): b_c(i)) = 1;在a属于{0,1,2,3,4} b属于{2,4,6,7}的时候,你的表述可以实现。但如果 a属于{1,4,5,6,7,10} b属于{4,5,9,15,-2,0}的时候,你的约束条件就会变。同时,你这种约束方法虽可行,但繁琐。

如果用多项式来约束的话结合@prod,可以用更简洁、紧凑,结构化更强。比如,我可以表示为 @prod(set_a:a-pet)=0。不知你是否同意。


页: [1] 2
查看完整版本: lingo和matlab求解