一、簡介
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 2×1 + 5×2
subject to
2×1 + 3×2 <= 12
x1 + 4×2 <= 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 2×1 + 3×2
subject to
3×1 + 4×2 >= 24
2×1 + 5×2 >= 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 3×1 + 2×2
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 3×1 + 2×2
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
原創文章,作者:VIQH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144686.html