数学实验报告利用MALTAB进行线性规划.docx
《数学实验报告利用MALTAB进行线性规划.docx》由会员分享,可在线阅读,更多相关《数学实验报告利用MALTAB进行线性规划.docx(12页珍藏版)》请在冰豆网上搜索。
![数学实验报告利用MALTAB进行线性规划.docx](https://file1.bdocx.com/fileroot1/2022-12/8/bd45625f-0a16-4481-8b86-ae779dbb6969/bd45625f-0a16-4481-8b86-ae779dbb69691.gif)
数学实验报告利用MALTAB进行线性规划
数学实验报告——利用MALTAB进行线性规划
实验六线性规划
一、债券投资
㈠问题描述
给定可供购进的证券以及其信用等级、到期年限、收益。
市政证券的收益可以免税,其他证券的收益需按50%的税率纳税。
此外还有以下限制:
(1)政府及代办机构的证券总共至少要购进400万元;
(2)所购证券的平均信用等级不超过1.4;
(3)所购证券的平均到期年限不超过5年。
1、若经理有1000万元资金,应如何进行投资?
2、如果能以2.75%的利率借到不超过100万元资金,该经理应如何操作?
3、在1000万元资金情况下,若证券A的税前收益增加为4.5%,投资应够改变?
若证券C的税前收益减少为4.8%,投资应否改变?
㈡简要分析
本题是一个比较简单的线性规划+扰动分析问题,对所谓问题进行建模,可以得到线性规划如下:
设分别购入A、B、C、D、E五种证券a、b、c、d、e万元。
于是对第1问有
对第2问,增设a1,b1,c1,d1,e1分别表示用借来的资金购买证券的金额,于是规划变为
对第三问,仅需将第一问中的规划做一点修改即可。
㈢方法与公式
线性规划方法:
(1)内点算法
opt1=optimset(’largescale’,’on’);
[x,f,exitflag,output,lag]=linprog(c,A,b,[],[],[],[],[],opt1);
(2)有效集方法
opt2=optimset(’largescale’,’off’);
[x,f,exitflag,output,lag]=linprog(c,A,b,[],[],[],[],[],opt2);
(3)单纯形算法
opt3=optimset(’largescale’,’off’,’simplex’,’on’);
[x,f,exitflag,output,lag]=linprog(c,A,b,[],[],[],[],[],opt3);
㈣结果与分析
1、第一问:
最优解
最优目标值
平均
迭代
次数
平均使用
时间
内点
218.181818
8.45E-09
736.363636
2.29E-08
45.4545455
-29.8363636352
6
0.01020192
有效集
218.181818
-8.81E-16
736.363636
0
45.4545455
-29.8363636364
5
0.004822365
单纯形
218.181818
0
736.363636
0
45.4545455
-29.8363636364
4
0.009097038
使用三种方法进行计算,得到结果对比如下:
结果为:
应购买A种证券218.18万元、B种证券0元、C种证券736.36万元、D种证券0元、E种证券45.45万元;最终得到的收益约为29.8364万元。
通过对比可以发现以下几点结论:
(1)三种算法所得的计算结果基本一致,各种算法计算得到的目标值仅在小数点后第10位才有所区别;
(2)三种算法得到的最优解略有区别,其中内点算法没有得出第2、4项为0的结论(虽然已很接近),这也许只是因为计算精度的问题,但也有可能是算法本身的原因;
(3)迭代次数上,内点算法
。
但是值得注意的是,这里的问题仅仅是一个n=5的小规模规划的例子,不能以此得出“大规模算法比中、小规模算法需要更多次迭代“的结论;
(4)使用时间上,这里对三种算法分别进行了100次调用,计算得到平均使用时间。
从表格可以看出使用时间上内点算法
。
当然,这个结论在未进行进一步的实验前也不能推广
2、第二问
继续采用三种算法,计算结果如下:
最优解
内点
229.1
1.74E-07
739.3996
8.11E-06
31.52
1.09E+01
1.73E-07
7.06E+01
5.39E-06
18.478886
有效集
240
-5.32E-15
710
0
50
-1.36E-14
-6.71E-16
100
0
-8.52E-15
单纯形
240
0
710
0
50
0
0
100
0
0
将所得的最优解根据债券类型进行合并,即计算a+a1,b+b1,c+c1,d+d1,e+e1,记录如下:
最优解
最优目标值
平均
迭代
次数
平均使用时间
内点
240.00
0.00
810.00
0.00
50.00
-30.0699999606
7
0.011674
有效集
240.00
0.00
810.00
0.00
50.00
-30.0700000000
10
0.008759
单纯形
240.00
0.00
810.00
0.00
50.00
-30.0700000000
5
0.010294
结果为:
应购买A种证券240万元、B种证券0元、C种证券810万元、D种证券0元、E种证券50万元;最终得到的收益约为30.07万元。
观察表格可以发现一个有意思的现象,即通过内点算法计算得到的结果与使用有效集或单纯形算法得到的结果,虽然最终结论一样,但是在如何分配使用已有资金和贷款资金上并不相同。
产生这种现象是因为该线性规划存在不止一个最优解,即目标函数的最大值对应的不是一个点。
本次实验的结果出现了两个最优解,这意味着最优解至少是一条线。
其实从实际意义上也很好理解,题目中已有资金和贷款资金唯一的区别就是贷款资金需要交利息,而这一点在规划方程组中仅体现在目标函数中,也就是说它们在其它约束上是没有区别的,即a与a1相同,b与b1相同等等。
这样也就不难理解实验过程中出现了不止一个最优解的现象。
通过对比还可以得到以下几点结论:
(1)本例中迭代次数上
内点算法
;
(2)使用时间上内点算法
;
(3)有效集算法得到的最优解与单纯形算法得到的最优解仍略有区别,其中有效集算法没有得出第2、4项为0的结论(虽然已很接近),猜测这是算法本身的原因。
3、第三问
前面已经对三种算法进行了对比和分析,本小问不再继续采用三种算法,仅选用最经典的单纯形算法。
改变规划进行计算:
①A证券税前收益增加
结果如下:
最优解
最优目标值
迭代次数
218.1818
0
736.3636
0
45.45455
-30.27272727
4
可以看出投资方案不应改变。
但是由于个别证券收益有所提升,所以最优目标值有所“提高”。
②C证券税前收益减少
最优解
最优目标值
迭代次数
336
0
0
648
16
-29.424
3
可以看出,投资方案有所改变,而且投资组合也出现了改变,说明基解发生了变化。
由于个别证券收益有所下降,所以最优目标值“下降”理所当然。
4、总结
(1)单纯形、有效集、内点算法都能简单有效地解决线性规划基本问题。
对于小规模线性规划而言,有效集算法效率更高,单纯性算法结果更为可靠。
(2)理论上,通过分析单纯形表格法求解过程的最终表格,可以得到严格的敏感性分析结论,但是由于本题计算较为繁琐,我没有使用表格法进行计算。
观察Lagrange乘子可以在敏感性分析上得出一些基本的结论,但是无法解决目标函数变化的情况。
㈤程序清单
1、第一问
clear;
clc;
c=-[4.3e-22.7e-22.5e-22.2e-24.5e-2];
A=[0-1-1-10;0.60.6-0.4-0.43.6;410-1-2-3;11111];
b=[-400,0,0,1000];
v1=[00000];
opt1=optimset('largescale','on');
tic;
fori=1:
100
[x1,f1,exitflag1,output1,lag1]=linprog(c,A,b,[],[],v1,[],[],opt1);
end
time1=toc;
time1=time1/100;
opt2=optimset('largescale','off');
i=0;
tic;
fori=1:
100
[x2,f2,exitflag2,output2,lag2]=linprog(c,A,b,[],[],v1,[],[],opt2);
end
time2=toc;
time2=time2/100;
opt3=optimset('largescale','off','simplex','on');
i=0;
tic;
fori=1:
100
[x3,f3,exitflag3,output3,lag3]=linprog(c,A,b,[],[],v1,[],[],opt3);
end
time3=toc;
time3=time3/100;
2、第二问的线性规划
c=-[4.3e-22.7e-22.5e-22.2e-24.5e-24.3e-2-2.75e-22.7e-2-2.75e-22.5e-2-2.75e-22.2e-2-2.75e-24.5e-2-2.75e-2];
A=[0-1-1-100-1-1-10;
0.60.6-0.4-0.43.60.60.6-0.4-0.43.6;
410-1-2-3410-1-2-3;
1111100000;
0000011111];
b=[-400,0,0,1000,100];
v1=[0000000000];
3、第三问的线性规划
(1)A改变
clear;
clc;
c=-[4.5e-22.7e-22.5e-22.2e-24.5e-2];
A=[0-1-1-10;0.60.6-0.4-0.43.6;410-1-2-3;11111];
b=[-400,0,0,1000];
v1=[00000];
opt3=optimset('largescale','off','simplex','on');
[x3,f3,exitflag3,output3,lag3]=linprog(c,A,b,[],[],v1,[],[],opt3);
(2)C改变
clear;
clc;
c=-[4.3e-22.7e-22.4e-22.2e-24.5e-2];
A=[0-1-1-10;0.60.6-0.4-0.43.6;410-1-2-3;11111];
b=[-400,0,0,1000];
v1=[00000];
opt3=optimset('largescale','off','simplex','on');
[x3,f3,exitflag3,output3,lag3]=linprog(c,A,b,[],[],v1,[],[],opt3);
二、牧马
㈠问题描述
给定养马所需的最低营养需求、各种饲料中各种营养的含量以及各种饲料的价格,确定如何以最低的成本满足最低的营养需求。
㈡简要分析
这仍旧是一个比较简单的线性规划问题。
假设分别购买干草、燕麦片、饲料块、高蛋白浓缩料a,b,c,d个单位。
由题意有:
解此线性规划即可。
为继续第一题的探究,仍旧使用三种算法进行解题。
最后作为探究,通过lagrange乘子做出大致的敏感性分析,并写出其对偶问题并求解。
㈢方法与公式
线性规划方法:
(1)内点算法
opt1=optimset(’largescale’,’on’);
[x,f,exitflag,output,lag]=linprog(c,A,b,[],[],[],[],[],opt1);
(2)有效集方法
opt2=optimset(’largescale’,’off’);
[x,f,exitflag,output,lag]=linprog(c,A,b,[],[],[],[],[],opt2);
(3)单纯形算法
opt3=optimset(’largescale’,’off’,’simplex’,’on’);
[x,f,exitflag,output,lag]=linprog(c,A,b,[],[],[],[],[],opt3);
㈣结果与分析
1、解题
通过计算,得到如下结果
最优解
最优目标值
平均
迭代
次数
平均使用时间
内点
5
1.42E-13
20
1.66E-12
17
10
0.013959495
有效集
5
0
20
0
17
5
0.00425513
单纯形
5
0
20
0
17
2
0.008455142
结果为:
应购买干草5捆,饲料块20块。
总价格为17美元。
简要对比分析如下:
(1)平均迭代次数上,
。
(2)平均时间上,
。
(3)最优解中,内点算法仍旧没有计算得出0。
2、敏感性分析
单纯性算法的Lagrange乘子如下:
从ineqlin可以看出,第一项约束不是有效约束。
通过计算可以发现,当最优解取[5,0,20,0]时,蛋白质含量为45磅,超过了需求,证实这不是有效约束。
这说明,当各种饲料的蛋白质含量在某一范围内变化时,最优解以及目标函数值并不会变化。
3、对偶问题及其解
实验结果如下(这里仅选用单纯形法):
最优解
最优目标值(-f)
迭代次数
0
0.4
0.2
-17
4
可以看到,最优目标值为17,与原问题最优解一致。
这就是线性规划中的强对偶定理。
由于问题比较难以理解,这里没有得出有关其现实意义的结论。
4、总结
这道题比较简单,计算过程中没有太多问题。
第一部分有关三种算法的对比与第一道题得到的结果一致。
有关敏感性分析也与之前的想法一致。
线性规划对偶问题是很值得研究的方向。
㈤程序清单
1、原问题
clear;
clc;
c=[1.83.50.41];
A=-[0.5126;240.51;5212.5];
b=-[40,20,45];
v1=[0000];
opt1=optimset('largescale','on');
tic;
fori=1:
100
[x1,f1,exitflag1,output1,lag1]=linprog(c,A,b,[],[],v1,[],[],opt1);
end
time1=toc;
time1=time1/100;
opt2=optimset('largescale','off');
i=0;
tic;
fori=1:
100
[x2,f2,exitflag2,output2,lag2]=linprog(c,A,b,[],[],v1,[],[],opt2);
end
time2=toc;
time2=time2/100;
opt3=optimset('largescale','off','simplex','on');
i=0;
tic;
fori=1:
100
[x3,f3,exitflag3,output3,lag3]=linprog(c,A,b,[],[],v1,[],[],opt3);
end
time3=toc;
time3=time3/100;
2、对偶问题求解
clear;
clc;
c=-[402045];
A=[0.5126;240.51;5212.5]';
b=[1.83.50.41];
v1=[000];
opt3=optimset('largescale','off','simplex','on');
[x3,f3,exitflag3,output3,lag3]=linprog(c,A,b,[],[],v1,[],[],opt3);
四、体验与收获
这是本学期数学实验的第六次作业,总体来相当顺利。
由于以前有学习过运筹学,所以对线性规划、单纯形算法、对偶问题都不陌生。
本次试验中,也在各个方面实践了以前所学的知识,感觉非常好。
总体来说收获如下:
1、学习了线性规划的建立与求解过程;
2、了解了单纯性算法的基本原理;
3、了解了线性规划的敏感性分析以及对偶问题;
4、学会使用MATLAB求解基本线性规划问题;
5、初步对比了三种求解线性规划的算法;
6、学习并验证了强对偶定理。