一、简介
linprog函数是MATLAB中用来求解线性规划问题的函数,其中lin代表线性,prog代表规划。它可以通过单纯形法或是内点法来求解问题。单纯形法是一种经典的方法,内点法则是相对较新的方法。
二、用法
1. 构造线性规划问题
在使用linprog之前,需要先构造线性规划问题,即将问题转化为一个线性规划目标函数和线性约束的形式。
f = [-5; -4]; A = [1, 4; 2, 3; 2, 1]; b = [170; 140; 90]; lb = [0; 0];
其中f是问题的目标函数,A和b是问题的约束条件,lb是问题的变量下界。
2. 求解线性规划问题
在构造完线性规划问题后,可以通过linprog函数来求解问题。
[x, fval, exitflag, output] = linprog(f, [], [], A, b, lb);
其中x是问题的解,fval是问题的目标函数值,exitflag是求解过程的状态,output则是一些运行结果的统计信息。如果exitflag为1,则表示求解成功。
3. 输出结果
在求解完成后,可以将结果输出。
fprintf('x1=%f, x2=%f, fval=%f\n', x(1), x(2), fval);
其中%f是用于输出实数的占位符。
4. 单纯形法和内点法选择
通过指定options参数,可以选择使用单纯形法或是内点法来求解问题。
options = optimoptions('linprog','Algorithm','interior-point'); [x, fval, exitflag, output] = linprog(f, [], [], A, b, lb, [], options);
其中Algorithm参数可以选择simplex或是interior-point,分别对应单纯形法和内点法。
三、示例
1. 最大化目标函数
假设有以下的线性规划问题:
maximize 2x1 + 5x2
subject to
2x1 + 3x2 <= 12
x1 + 4x2 <= 16
x1, x2 >= 0
可以通过下面的代码来求解问题:
f = [-2; -5]; A = [2, 3; 1, 4]; b = [12; 16]; lb = [0; 0]; [x, fval, exitflag, output] = linprog(-f, [], [], A, b, lb); fprintf('x1=%f, x2=%f, fval=%f\n', x(1), x(2), -fval);
输出结果为:
x1=4.000000, x2=1.333333, fval=13.333333
2. 最小化目标函数
假设有以下的线性规划问题:
minimize 2x1 + 3x2
subject to
3x1 + 4x2 >= 24
2x1 + 5x2 >= 20
x1, x2 >= 0
可以通过下面的代码来求解问题:
f = [2; 3]; A = [-3, -4; -2, -5]; b = [-24; -20]; lb = [0; 0]; [x, fval, exitflag, output] = linprog(f, [], [], A, b, lb); fprintf('x1=%f, x2=%f, fval=%f\n', x(1), x(2), fval);
输出结果为:
x1=4.000000, x2=0.000000, fval=8.000000
3. 不等式约束
假设有以下的线性规划问题:
maximize 3x1 + 2x2
subject to
x1 + x2 <= 4
x1 - x2 >= 1
x1, x2 >= 0
可以通过下面的代码来求解问题:
f = [-3; -2]; A = [1, 1; -1, 1]; b = [4; -1]; lb = [0; 0]; [x, fval, exitflag, output] = linprog(-f, [], [], A, b, lb); fprintf('x1=%f, x2=%f, fval=%f\n', x(1), x(2), -fval);
输出结果为:
x1=1.500000, x2=2.500000, fval=10.000000
4. 等式约束
假设有以下的线性规划问题:
maximize 3x1 + 2x2
subject to
x1 + x2 = 4
x1, x2 >= 0
可以通过下面的代码来求解问题:
f = [-3; -2]; Aeq = [1, 1]; beq = 4; lb = [0; 0]; [x, fval, exitflag, output] = linprog(-f, [], [], Aeq, beq, lb); fprintf('x1=%f, x2=%f, fval=%f\n', x(1), x(2), -fval);
输出结果为:
x1=2.000000, x2=2.000000, fval=10.000000