数学建模社区-数学中国

标题: lingo和matlab求解 [打印本页]

作者: simonsnow    时间: 2015-7-22 16:44
标题: lingo和matlab求解
这道题怎么做啊,求详细求解过程。matlab不写也可以,lingo怎么算
360反馈意见截图1620072084103102.png

作者: liwenhui    时间: 2015-7-22 16:44
情况1:求a分别等于 0,1,2,3,4, b分别等于2,4,6,7时的最优值,这等价于求解20个非线性最优化问题,可以用下面的程序:
  1. model:
  2.   sets:
  3.     looppt1/1..5/:a;
  4.     looppt2/1..4/:b;
  5.   endsets
  6.   data:
  7.     a=0,1,2,3,4;
  8.     b=2,4,6,7;
  9.   enddata
  10.   submodel model1:
  11.     min=4*x1^3-p1*x1-2*x2;
  12.     x1+x2<4;
  13.     2*x1+x2<5;
  14.     -x1+p2*x2>2;
  15.   endsubmodel
  16.   calc:
  17.     @for(looppt1(i):
  18.       @for(looppt2(j):
  19.         p1=a(i);
  20.         p2=b(j);
  21.         @solve(model1);
  22.       );
  23.     );
  24.   endcalc
  25. end
复制代码
情况2:求a 的值被约束为{0,1,2,3,4},b的值被约束为{2,4,6,7}的最优解,这可以考虑用一个多项式来约束a和b的值,可以试试如下的程序:
  1. model:
  2.   min=4*x1^3-a*x1-2*x2;
  3.   x1+x2<4;
  4.   2*x1+x2<5;
  5.   -x1+b*x2>2;  
  6.   a*(a-1)*(a-2)*(a-3)*(a-4)=0;
  7.   (b-2)*(b-4)*(b-6)*(b-7)=0;
  8. 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
用lingo规划  ,只能换值
用matlab,对a,b进行循环就行了

LINGO也有循环语句功能。

作者: simonsnow    时间: 2015-7-23 16:29
liwenhui 发表于 2015-7-23 15:17
你是想求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
情况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
我觉得按照前者和后者的理解本质应该是一样的吧

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

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

作者: wujianjack2    时间: 2015-7-23 18:50
liwenhui 发表于 2015-7-22 16:44
情况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
不错!
  我觉得这样会好一点:
model:

可能这是见仁见智,你给出的程序中这一段可能结构化不是很强:
  1. @bnd(0, a, 4); @gin(a);
  2.   b_p = @sum(bs(i): b(i)*b_c(i));
  3.   @for(bs(i): @bin(b_c(i)));
  4.   @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。不知你是否同意。



作者: wujianjack2    时间: 2015-7-24 12:28
liwenhui 发表于 2015-7-24 11:24
可能这是见仁见智,你给出的程序中这一段可能结构化不是很强:在a属于{0,1,2,3,4} b属于{2,4,6,7}的时候, ...

  确是见仁见智。
  我这么写的原因是让约束的形式尽量一点,这样,如果LINGO求解效果不是很好,我可以用其它工具替代。所以,我在最初写模型时就会尽量考虑写成适用于更多求解器能够求解的形式,而不是只是LINGO。
  数学上,你的式子是等价的,而我觉得本题写成prod这种约束,并不利于优化算法的求解,实际建模时我觉得应把容差考虑在内。我不知道LINGO的parser有没有那么智能,在求解时能把prod转化为更简的形式。
  就本题, 因为a的取值的特殊性,所以用的bnd,实际上和b一样可以类似处理,这个是semiint变量类型的一般化,LINGO本身不直接给出semiint函数,其内部也是转化成的这种形式。

作者: wujianjack2    时间: 2015-7-24 12:36
liwenhui 发表于 2015-7-24 11:24
可能这是见仁见智,你给出的程序中这一段可能结构化不是很强:在a属于{0,1,2,3,4} b属于{2,4,6,7}的时候, ...

  另外,你可以试一下两段不同的表述的细微的运行时间与结果的差别,在我的LINGO 15上,我这段程序用local求解器返回的结果即也是global,你的表述在我这里不是。
  也可以看看迭代步数的区别,当然,我这个表述的代价是引入了更多的变量:-)





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5