最优化模型实验
基础训练
- 求函数极值
求一元函数 f ( x ) = e x x s i n x f(x)=e^xxsin{x} f(x)=exxsinx在区间[0, 9]内的最大值点、最大值,并绘制出函数图形,编写function程序文件返回2个参数,依次返回最大值点、最大值。
提示:调用函数fminbnd计算。
参考函数如下:
function [x0,y0]=fun
解:
function [x0,y0]=fun
%定义并画出原函数
f=inline('exp(x)*x*sin(x)');
ezplot(f,[0,9])
%绘图确定最小值大概在7-9之间
f2=inline('exp(x)*(-x)*sin(x)');
[x0,y0]=fminbnd(f2,7,9);
y0=f(x0);
a =
8.6937
b =
3.4625e+04
- 求解下列线性规划模型
m a x f ( x 1 , x 2 , x 3 ) = 2.5 x 1 + 5 x 2 + 10 x 3 {max}{f}(x_1,x_2,x_3)=\mathbf{2}.\mathbf{5}x_1+\mathbf{5}x_2+\mathbf{10}x_3 maxf(x1,x2,x3)=2.5x1+5x2+10x3
x 1 + x 2 + x 3 = 100 2.5 x 1 + 5 x 2 + 10 x 3 ≥ 50 x 3 ≤ 2 ( x 1 + x 2 ) 10 ≤ x 1 ≤ 30 0 ≤ x 2 ≤ 90 20 ≤ x 3 ≤ 80 x_1+x_2+x_3=100\\ 2.5x_1+5x_2+10x_3≥50\\ x_3≤2(x_1+x_2)\\ 10≤x_1≤30\\ 0≤x_2≤90\\ 20≤x_3≤80 x1+x2+x3=1002.5x1+5x2+10x3≥50x3≤2(x1+x2)10≤x1≤300≤x2≤9020≤x3≤80
C=[2.5 5 10];
a=[-2.5 -5 -10;-2 -2 1];
b=[-50;0];
Aeq=[1 1 1];
beq=[100];
e0=[10 0 20];
e1=[30 90 80];
X=linprog(-C,a,b,Aeq,beq,e0,e1)
max=C*X
X =
10.0000
23.3333
66.6667
max =
808.3333
- 某饲养场有5种饲料.已知各种饲料的单位价格和每百公斤饲料的蛋白质、矿物质、维生素含量如表所示,又知该场每日至少需蛋白质70单位、矿物质3单位、维生素10单位.间如何混合调配这5种饲料.才能使总成本最低? 请对本问题建立模型,并编程求解.
饲料的成分和单价
饲料种类 | 成分 | 饲料价格 | ||
---|---|---|---|---|
蛋白质/单位 | 矿物质/单位 | 维生素/单位 | ||
1 | 0.30 | 0.10 | 0.05 | 2 |
2 | 2.20 | 0.05 | 0.10 | 7 |
3 | 1.00 | 0.02 | 0.02 | 4 |
4 | 0.60 | 0.20 | 0.20 | 3 |
5 | 1.80 | 0.05 | 0.08 | 5 |
解:
C=[2 7 4 3 5];
a=[ -0.3000 -2.2000 -1.0000 -0.6000 -1.8000
-0.1000 -0.0500 -0.0200 -0.2000 -0.0500
-0.0500 -0.1000 -0.0200 -0.2000 -0.0800
-1.0000 0 0 0 0
0 -1.0000 0 0 0
0 0 -1.0000 0 0
0 0 0 -1.0000 0
0 0 0 0 -1.0000];
b=[-70;-3;-10;0;0;0;0;0];
[x,y]=linprog(C,a,b)
x =
0
0
0
39.7436
25.6410
y =
247.4359
综合训练
一.实验任务
某工厂有三种原料C1,C2,C3,其储量分别为150公斤,160公斤和180公斤。现在用来生产甲、乙两种产品。已知每生产1公斤产品甲需要原料C1 3公斤,原料C2 6公斤,原料C3 2公斤。每生产1公斤产品乙需要原料C1 5公斤,原料C2 5公斤,原料C3 6公斤。又已知生产1公斤产品甲利润为17元,生产1公斤产品乙利润为15元。请为该工厂制定生产计划,使得利润尽可能大。
二. 实验目的
认识线性规划模型。
熟悉Matlab求解线性规划模型的函数linprog。
三.实验过程
设安排生产产品甲和乙分别为x1公斤,x2公斤。
根据问题实际情况,生产每种产品都需要3种原料(C1,C2,C3),而3种原料都有上限。
使工厂获得最大利润。可将该问题转化为如下的数学模型:
C=[17 15];
a=[3 5;6 5;2 6;-1 0;0 -1];
b=[150;160;180;0;0];
x=linprog(-C,a,b)
max=C*x
x =
3.3333
28.0000
max =
476.6667
实验自评与改进方向
较好的完成了实验的任务 针对这一类问题 可以编写函数来统一的求解
个人认为倒数后两题内容有所重复 可以让我们编一个求最优化问题的函数
实验体会,收获及建议
本次上机实验不仅使我们基本了解了随机数实验的相关函数命令,了解了蒙特卡罗方法的思想,并且能用这种思想去解决一些随机分布问题、概率问题、面积体积问题。也使得我们对Matlab的–些编程技巧更加熟悉,收获很大。
在编程中遇到的一些意想不到的问题也让我意识到,要在平时多加练习,不能眼高手低。不能仅仅掌握课堂上的函数命令,在课余时间多去看一些编程,丰富自己的函数储备,并且学习思路,从而让自己的编程更加容易。
同时针对最后一题,我认为x1 x2 x3给出的范围并不合适,从输出结果来看,在x1 x2 x3所给的范围内随机摇点,最终满足结果的仅有不到百分之一,这意味着设置一百万个点仅能有不到一万个点满足要求。所以我建议根据前两个不等式,改变下未知数的范围,这可以让模拟的结果更加明显,而不至于出现:设置了十万个点所得结果仍然无法趋于稳定的情况。