2024/06/13
学习时长:2小时
代码行数:没统计
博客数量:1篇
今天完成工程数学的实验五,也是最后一次实验
一、实验目的
(1) 通过一个农业生产计划优化安排的实例求解,培养学生解决实际线性规划问题的初步能力;熟悉线性规划的建模过程;掌握Matlab优化工具箱中线性规划函数的调用。
(2) 通过一个投资组合优化问题的实例求解,培养学生解决实际二次规划问题的初步能力;熟悉线性规划的建模过程;掌握Matlab优化工具箱中线性规划函数的调用。
二、实验内容
(1)线性规划应用案例的求解
1、基本要求
通过一个农业生产计划优化安排的实例求解,培养学生解决实际线性规划问题的初步能力;熟悉线性规划的建模过程;掌握Matlab优化工具箱中线性规划函数的调用。
2、主要内容
某村计划在100公顷的土地上种植a、b、c三种农作物。可以提供的劳力、粪肥和化肥等资源的数量,种植每公顷农作物所需这三种资源的数量,以及能够获得的利润如表所示。
种植投入产出表
|
用 工 |
粪肥(吨) |
化肥(千克) |
利润(元) |
a |
450 |
35 |
350 |
1500 |
b |
600 |
25 |
400 |
1200 |
c |
900 |
30 |
300 |
1800 |
可提供资源 |
63000 |
3300 |
33000 |
|
其中一个劳动力干一天为1个工。现在要求为该村制定一个农作物的种植计划,确定每种农作物的种植面积,使得总利润最大。
(2)二次规划应用案例的求解
1、基本要求
通过一个投资组合优化问题的实例求解,培养学生解决实际二次规划问题的初步能力;熟悉线性规划的建模过程;掌握Matlab优化工具箱中线性规划函数的调用。
2、上机主要内容
求解从一点(0,0,0)到超平面的最短距离,
其中,,。
通过建模构造二次规划问题,求解以上问题的最优解和最优值。
三、算法步骤、代码、及结果
1. 算法步骤
(1)
目标函数系数向量 f = [1500 1200 1800]' 表示三种农作物的利润。
约束矩阵 a 包含了种植每公顷农作物所需的劳动力、粪肥和化肥数量。
右侧约束向量 b 包含了可提供的劳动力、粪肥和化肥等资源的数量。
规定所有作物的种植面积总和等于 100 公顷。
然后调用 linprog 函数,该函数用于解决线性规划问题。通过传入参数目标函数系数 f、约束矩阵 a、右侧约束向量 b、等式约束的系数矩阵 aeq、等式约束的右侧向量 beq,以及变量下界 lb,来求解最优解
(2)
在这个问题中,我们要优化的目标是点到超平面的距离,即
minimize: (1/2) * x’ * Q * x + c’ * x
subject to: Ax = b
其中,x是超平面上任意一点的坐标向量,Q和c由目标函数决定,A和b由约束条件决定。
为了表示优化问题的目标函数和约束条件,我们需要对二次规划问题进行一些转换。首先,我们可以将距离公式中的标量乘法展开:
distance^2 = (x - P0)’ * (x - P0)
其中,P0是超平面上到点(0,0,0)最近的一点,可以通过求解Ax=b得到。将上面的公式展开得到:
distance^2 = x’ * x - 2 * P0’ * x + P0’ * P0
因此,目标函数可以表示为:
0.5 * x’ * x - P0’ * x
其中,Q = I和c = -P0。同时,约束条件为Ax=b。
2. 代码
(1)
f=[1500 1200 1800]';
f=-f;
a=[450 600 900;35 25 30;350 400 300];
b=[63000 3300 33000]';
acq=[1 1 1];
aeq=[1 1 1];
beq=[100];
lb=zeros(3,1);
[x,fval,exitflag,output,lamdba]=linprog(-f,a,b,aeq,beq,lb)
(2)
function distance = point_to_hyperplane_qp(A, b)
n = null(A)';
P0 = A \ b;
Q = eye(3);
c = -P0';
Aeq = A;
beq = b;
x0 = [0; 0; 0];
options = optimoptions('quadprog', 'Algorithm', 'interior-point-convex');
[x, ~, ~, ~, ~] = quadprog(Q, c, [], [], Aeq, beq, [], [], x0, options);
distance = norm(x);
end
>> A = [1 2 -1; -1 1 -1];
>> b = [4; 2];
>> point_to_hyperplane_qp(A, b)
3. 结果
(1)
farm
Optimal solution found.
x =
60.0000
0
40.0000
fval =
162000
exitflag =
1
output =
包含以下字段的 struct:
iterations: 3
constrviolation: 7.2760e-12
message: 'Optimal solution found.'
algorithm: 'dual-simplex'
firstorderopt: 4.3656e-11
lamdba =
包含以下字段的 struct:
lower: [3×1 double]
upper: [3×1 double]
eqlin: -3.6000e+03
ineqlin: [3×1 double]
(2)
ans =
2.0000