求解线性规划问题:
\[\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
求解线性规划问题:
\[\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
求解非线性规划问题:
\[\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
求解非线性规划问题:
\[\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
(生产计划制定)某工厂制造甲、乙两种产品,每种产品消耗煤、电、上作日及获利如下表所示.现有煤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
(供煤量分配)两个煤厂 $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