MathExpA

作业7 线性规划与非线性规划(课本第十章)

1(课本习题1)

求解线性规划问题:

\[\min f = - 3x_{1} + 4x_{2} - 2x_{3} + 5x_{4}\] \[s.t.\begin{cases}4x_1-x_2+2x_3-x_4=-2\\\ x_1+x_2+3x_3-x_4\leq14\\\ -2x_1+3x_2-x_3+2x_4\geq2\\\ x_1,x_2,x_3\geq0,x_4\text{无约束}.&\end{cases}\]

代码:

% 定义目标函数的系数
f = [-3;4;-2;5];

% 定义线性不等式约束条件,A*x <= b
A =[1,1,3,-1;2,-3,1,-2];
b = [14;-2];

% 定义线性等式约束条件,Aeq*x = beq
Aeq = [4,-1,2,-1];
beq = -2;

% 定义变量的下界
i = 1:3;
lb(i) = zeros(3,1);
lb(4) = -inf;

% 使用linprog函数求解该线性规划问题
% 返回最优解x和目标函数在最优解处的值feval
[x,feval] =linprog(f,A,b,Aeq,beq,lb)

输出:

找到最优解。

x = ​ 0 ​ 8.0000 ​ 0 ​ -6.0000 feval = ​ ​ 2.0000

2(课本习题2)

求解线性规划问题:

\[\min f = 5x_{1} + 4x_{2} + 8x_{3}\] \[s.t.\begin{cases}x_1+2x_2+x_3=6\\\ -2x_1+x_2\geq -4\\\ 5x_1+3x_2\leq 15 \\\ x_j\geq0,\quad j=1,2,3.\end{cases}\]

代码:

% 定义目标函数的系数
f = [5;4;8];

% 定义线性不等式约束条件,A*x <= b
A =[2,-1,0;5,3,0];
b = [4;15];

% 定义线性等式约束条件,Aeq*x = beq
Aeq = [1,2,1];
beq = 6;

% 定义变量的下界
lb = [0,0,0];

% 使用linprog函数求解该线性规划问题
% 返回最优解x和目标函数在最优解处的值feval
[x,feval] =linprog(f,A,b,Aeq,beq,lb)

输出:

找到最优解。

x = ​ 0 ​ 3 ​ 0

feval = ​ 12

3(课本习题11)

求解非线性规划问题:

\[\max f = x_{1}x_{2}x_{3}\] \[s.t.\begin{cases}-x_1+2x_2+x_3\geq0\\\ x_1+2x_2+2x_3\leq72\\\ 10\leq x_2\leq20\\\ x_1-x_2=10.\end{cases}\]

代码:

% 定义目标函数,即我们想要最小化的函数
f = @(x) -x(1)*x(2)*x(3);

% 定义线性不等式约束条件,A*x <= b
A=[1 -2 -2;1 2 2];
b=[0;72];

% 定义变量的下界和上界
lb=[-inf;10;-inf];
ub=[inf;20;inf];

% 定义线性等式约束条件,Aeq*x = Beq
Aeq=[1 -1 0];
Beq=10;

% 使用fmincon函数求解该优化问题
% 返回最优解x和目标函数在最优解处的值feval
[x,feval]=fmincon(f,[20,10,0],A,b,Aeq,Beq,lb,ub,[])

输出:

找到满足约束的局部最小值。

优化已完成,因为目标函数沿可行方向在最优性容差值范围内呈现非递减,并且在约束容差值范围内满足约束。

x = 1×3
​ 22.5850 12.5850 12.1225 feval = -3.4456e+03

4

求解非线性规划问题:

\[\min{f(x)} = x_{1}^{2} - 4x_{1} - 8x_{1}x_{2} + 15\] \[s.t.\begin{cases}-x_1^2-x_2^2\leq-9\\\ 2x_1+3x_2\leq2\\\ x_1-x_2\leq5\end{cases}\]

代码:

% 定义目标函数
fun = @(x) x(1)^2 - 4*x(1) - 8*x(1)*x(2) + 15;

% 定义非线性约束条件
nonlcon = @(x) deal([-(x(1)^2 + x(2)^2 + 9); 2*x(1) + 3*x(2) - 2; x(1) - x(2) - 5], []);

% 定义初始点
x0 = [0, 0];

% 调用fmincon函数求解
options = optimoptions('fmincon','Display','iter','Algorithm','interior-point');
[x,fval] = fmincon(fun,x0,[],[],[],[],[],[],nonlcon,options)

输出:

找到满足约束的局部最小值。

优化已完成,因为目标函数沿可行方向在最优性容差值范围内呈现非递减,并且在约束容差值范围内满足约束。

x = ​ 0.7368 0.1754 fval = ​ 11.5614

5(课本习题5)

(生产计划制定)某工厂制造甲、乙两种产品,每种产品消耗煤、电、上作日及获利如下表所示.现有煤360t, 电200kW, 工作日300个,请制定一个使总利润最大的生产计划.

产品 产品消耗 单位利润/(元•t⁻¹)
煤/t 电/kW 工作日/个
9 4 3 7000
5 5 10 12000

答:我们设x为甲产品的生产量,y为乙产品的生产量。

我们的目标是最大化总利润,目标函数: \(\max Z = 7000x + 12000y\)

约束条件:

\[s.t.\begin{cases}9x+5y\leq360\text{ (煤的消耗不能超过360t)}\\\ 4x+5y\leq200\text{ (电的消耗不能超过200kW)}\\\ 3x+10y\leq300\text{ (工作日不能超过300个)}\\\ x,y\geq0\text{ (生产量不能为负)}&\end{cases}\]

代码:

% 目标函数的系数,表示每种产品的单位利润的负值。在这个问题中,目标函数是-7x -12y(取负值以最大化)。
f =-[7,12];  

% 不等式约束的系数矩阵。每一行代表一种资源(煤、电、工作日),每一列代表一个产品(甲、乙)。
A = [9,5;  % 9x + 5y  <= 360
    4,5;   % 4x + 5y  <= 200
    3,10]; % 3x + 10y <= 300

% 不等式约束的右侧向量。代表每种资源的总量。
b = [360;200;300];  

% 决策变量的下界。表示产品的生产量不能为负。
lb = [0;0]; % x,y >= 300

% 使用linprog函数求解线性规划问题。返回的x是最优解,即每种产品的最佳生产量;
% feval是在最优解处的目标函数值,即最大总利润的负值。
[x,feval] = linprog(f,A,b,[],[],lb)

输出:

找到最优解。

x = ​ 20.0000 ​ 24.0000

feval = -428.0000

6(课本习题6)

(供煤量分配)两个煤厂 $A_{1}$ 和 $A_{2}$ 每月进煤量分别为60t和100t,联合供应三个居民区 $B_{1}$ , $B_{2}$ 和 $B_{3}$ .三个居民区每月对煤的需求量依次为50t, 70 t, 40 t.煤厂 $A_{1}$ 离三个居民区 $B_{1}$ , $B_{2}$ 和 $B_{3}$ 的距离分别为10 km,5km和6km; 煤厂 $A_{2}$ 离三个居民区 $B_{1}$ , $B_{2}$ 和 $B_{3}$ 的距离分别为4km, 8km和12 km.问如何分配供煤量使得运输量(单位: t· km)达到最小?

:定义以下变量:

目标函数是最小化总运输量,可以表示为:

\[\min Z = 10x_1 + 5x_2 + 6x_3 + 4x_4 + 8x_5 + 12x_6\]

约束条件:

\[s.t.\begin{cases} x_1 + x_2 + x_3 = 60 \quad \text{(煤厂$A_1$的供煤能力)} \\\ x_4 + x_5 + x_6 = 100 \quad \text{(煤厂$A_2$的供煤能力)} \\\ x_1 + x_4 = 50 \quad \text{(居民区$B_1$的需求量)} \\\ x_2 + x_5 = 70 \quad \text{(居民区$B_2$的需求量)} \\\ x_3 + x_6 = 40 \quad \text{(居民区$B_3$的需求量)}\\\ x_i \geq 0 \quad \text{for all } i \in \{1,2,3,4,5,6\} &\end{cases}\]

代码:

% 目标函数的系数,表示每个路径的运输的单位成本(单位:t·km)。
f =[10,5,6,4,8,12];  

% 决策变量的下界。表示运输量不能为负。
lb = zeros(6,1);

% 等式约束的系数矩阵。每一行代表一个约束条件,约束煤厂的总供应量和居民区的总需求量。
Aeq = [1,1,1,0,0,0; % x1 + x2 + x3 = 60
    0,0,0,1,1,1;    % x4 + x5 + x6 = 100
    1,0,0,1,0,0;    % x1 + x4 = 50
    0,1,0,0,1,0;    % x2 + x5 = 70
    0,0,1,0,0,1;];  % x3 + x6 = 40

% 等式约束的右侧向量。代表每个煤厂的供应量和每个居民区的需求量。
beq = [60;100;50;70;40];

% 使用linprog函数求解线性规划问题。返回的x是最优解,即每个路径的最佳运输量;
% fval是在最优解处的目标函数值,即最小总运输量。
[x,fval] = linprog(f,[],[],Aeq,beq,lb)

输出:

找到最优解。 x = ​ 0 ​ 20 ​ 40 ​ 50 ​ 50 ​ 0 fval = ​ 940