当前位置:   article > 正文

第十届数学建模新生杯比赛(A题)_湖南省研究生数学建模题目

湖南省研究生数学建模题目

问题一:

建立模型:线性规划模型

符号说明

符号含义
a写出甲类作业的数量
b写出乙类作业的数量
z目标值

列出约束条件与目标函数

约束条件:

                           1.  2a+b<10

                            2. a+b<8

                            3 .b<7

目标函数(max):z=4a+3b

调用matlab函数

1.函数介绍:

需要调用linprog函数(如用optimproblem函数要求matlab版本在2017及以上),格式如下:

[x,fval]=linprog(f,a,b,aeq,beq,lb,up,options)

1.x为取得最值时自变量x的取值

2.fval为取得最值时最值的值; f为目标函数,本题中为:z=4a+3b,表示为[4,3](线代知识)

3.a,b为不等约束,其中a为不等约束左边系数,b为不等约束右边系数

4.aeq,beq为等式约束,aeq为等式左边系数,beq为等式右边系数

5.lb,up分别为自变量自身取值范围。本题中a,b取值范围均为[0,+∞]

6.options为使用的方法种类,一般不做更改

7.注意,linprog函数默认求目标函数最小值,所以如果要求最大值需要使目标函数系数乘以-1

8.linprog函数不等约束方程里默认为Ax<b的形式,如果你得出Bx>C的约束方程,需要乘以-1变成(-B)x<-C的形式

调用解题函数代码:

  1. [x,fval]=linprog([-4,-3],[2,1;1,1;0,1],[10;8;7],[0,0;0,0;0,0],[0;0;0],[0,0],[inf,inf]);
  2. fval=-fval

输出结果:

  1. Optimal solution found.
  2. x =
  3. 2.0000
  4. 6.0000
  5. fval =
  6. 26

代码解释:

1、matlab中linprog函数默认求解目标函数最小值,而题目中为了求解最大值,所以把目标函数系数[4,3]改为[-4,-3],再由fval=-fval求出最大值。

2、由于本题没有等式约束,自变量的取值范围也没有额外要求,所以aeq,beq部分为零矩阵,lb也为零矩阵,ub为无限大。(matlab中inf为+∞),所以上述主要代码也可以缩减为:

[x,fval]=linprog([-4,-3],[2,1;1,1;0,1],[10;8;7])

问题二

建立模型:整数规划模型

 模型建立与求解

符号和建模就不细说了,下面直接分析求解:

分析:由题目可以确定,目标函数是游泳成绩之和,最优解是其最小值。约束条件是每人只能选取一种游泳方式、每种游泳方式只能一人使用。因此自变量可以设成某个人用某种游泳方式(1~20),例如甲的四种游泳方式对应编号1-4,乙的编号对应5-8…自变量的取值为0、1,表示参加与否。

代码如下(matlab):

  1. clc;
  2. clear;
  3. c = [66.8 75.6 87 58.6 ...
  4. 57.2 66 66.4 53 ...
  5. 78 67.8 84.6 59.4 ...
  6. 70 74.2 69.6 57.2 ...
  7. 67.4 71 83.8 62.4];
  8. A = zeros(5,20);
  9. for i = 1:4
  10. A(1,i)=1;A(2,i+4)=1;A(3,i+8)=1;A(4,i+12)=1;A(5,i+16)=1;
  11. end
  12. b = [1,1,1,1,1]';
  13. Aeq = zeros(4,20);
  14. for i = 0:4;
  15. Aeq(1,1+4*i)=1;Aeq(2,2+4*i)=1;Aeq(3,3+4*i)=1;Aeq(4,4+4*i)=1;
  16. end
  17. beq = [1,1,1,1];
  18. lb = zeros(1,20);
  19. ub = ones(1,20);
  20. intcon = [1:20];
  21. [x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)

结果:

蝶泳仰泳蛙泳自由泳

问题三

建立模型:灰色预测模型

模型建立与求解

直接分析问题求解了,论文不能像这样写。

解:

 

 

 

 

 代码实现(matlab):

  1. %GM(1,N)
  2. clc;
  3. clear;
  4. x0 = [4383 7625 10500 11316 17818
  5. 83 131 180 195 306
  6. 146 212 233 259 404]; % 录入数据
  7. [m,n] = size(x0);
  8. x1_d = cumsum(x0,2); %累加序列
  9. x11 = x1_d(1,:);
  10. z11=0.5*(x11(1:end-1)+x11(2:end));%紧邻均值生成
  11. b = [-z11' x1_d(2,2:end)' x1_d(3,2:end)'];
  12. y = x0(1,2:end)';
  13. u = b\y %参数矩阵
  14. %%引入条件
  15. x20 = [x0(2,:),400];
  16. x30 = [x0(3,:),500];
  17. x21 = cumsum(x20);x31 = cumsum(x30);
  18. for k = 0:length(x21)-1
  19. x1(k+1) = (x0(1,1)-u(2)/u(1)*x21(k+1)-u(3)/u(1)*x31(k+1)).*exp(-u(1)*k)+u(2)/u(1)*x21(k+1)+u(3)/u(1)*x31(k+1);
  20. end
  21. x10hat = [x1(1),diff(x1)]; %进行差分运算
  22. epsilon = x0(1,:) - x10hat(1:end-1); %计算残差
  23. delta = abs(epsilon./x0(1,:)); %计算相对误差
  24. xhat = x10hat(end) % 预测最终值

 (注:以上仅为解析,并不是评分标准)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/963058
推荐阅读
相关标签
  

闽ICP备14008679号