layout | title |
---|---|
post |
作业7 线性规划与非线性规划(课本第十章) |
求解线性规划问题:
代码:
% 定义目标函数的系数
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
求解线性规划问题:
代码:
% 定义目标函数的系数
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
求解非线性规划问题:
代码:
% 定义目标函数,即我们想要最小化的函数
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
求解非线性规划问题:
代码:
% 定义目标函数
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
**(生产计划制定)**某工厂制造甲、乙两种产品,每种产品消耗煤、电、上作日及获利如下表所示.现有煤360t, 电200kW, 工作日300个,请制定一个使总利润最大的生产计划.
产品 | 产品消耗 | 单位利润/(元•t⁻¹) | ||
---|---|---|---|---|
煤/t | 电/kW | 工作日/个 | ||
甲 | 9 | 4 | 3 | 7000 |
乙 | 5 | 5 | 10 | 12000 |
我们的目标是最大化总利润,目标函数: $$ \max Z = 7000x + 12000y $$
约束条件:
代码:
% 目标函数的系数,表示每种产品的单位利润的负值。在这个问题中,目标函数是-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
**(供煤量分配)**两个煤厂
答:定义以下变量:
-
$x_1$ : 煤厂$A_1$ 到居民区$B_1$ 的供煤量 -
$x_2$ : 煤厂$A_1$ 到居民区$B_2$ 的供煤量 -
$x_3$ : 煤厂$A_1$ 到居民区$B_3$ 的供煤量 -
$x_4$ : 煤厂$A_2$ 到居民区$B_1$ 的供煤量 -
$x_5$ : 煤厂$A_2$ 到居民区$B_2$ 的供煤量 -
$x_6$ : 煤厂$A_2$ 到居民区$B_3$ 的供煤量
目标函数是最小化总运输量,可以表示为:
约束条件:
代码:
% 目标函数的系数,表示每个路径的运输的单位成本(单位: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