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

 

posted @ 2024-06-14 00:08  伐木工熊大  阅读(4)  评论(0编辑  收藏  举报