一、線性規划問題
已知目標函數和約束條件均為線性函數,求目標函數的最小值(最優值)問題。
1.求解方式:用linprog函數求解
2.linprog函數使用形式:
x=linprog(f,A,b)
x=linprog(f,A,b,Aeq,beq)
x=linprog(f,A,b,Aeq,beq,lb,ub)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]=linprog(…)
[x, fval, exitflag]=linprog(…)
[x, fval, exitflag, output]=linprog(…)
[x, fval, exitflag, output, lambda]=linprog(…)
3.介紹一種最常用的:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aep,beq,lb,ub);
其中,f是目標函數系數矩陣;A和b是不等式約束條件的參數;Aeq和beq是等式約束條件的參數;lb和ub為x取值的取值范圍。
lambda.ineqlin—不等式約束A,b
lambda.eqlin—等式約束Aep,bep
lambda.upper—上界條件ub
lambda.lower—下界條件lb
4.實例:
目標函數:f(x) = –5x1 – 4x2 –6x3,
約束條件:
x1 – x2 + x3 ≤ 20
3x1 + 2x2 + 4x3 ≤ 42
3x1 + 2x2 ≤ 30
0 ≤ x1, 0 ≤ x2, 0 ≤ x3
Matlab程序:
>> f = [-5; -4; -6]; A = [1 -1 1; 3 2 4; 3 2 0]; b = [20; 42; 30]; lb = zeros(3,1); >> [x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb); >> x x = 0.0000 15.0000 3.0000 >> fval fval = -78.0000
二、二次型規划問題
理解完線性規划問題再來學習二次型規划問題就簡單得多了,可以相似類比。
1.求解方式:用quadprog函數來求解
2.quadprog函數使用形式:
x = quadprog(H,f)
x = quadprog(H,f,A,b)
x = quadprog(H,f,A,b,Aeq,beq)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
x = quadprog(problem)
[x,fval] = quadprog(H,f,...)
[x,fval,exitflag] = quadprog(H,f,...)
[x,fval,exitflag,output] = quadprog(H,f,...)
[x,fval,exitflag,output,lambda] = quadprog(H,f,...)
3.實例:
Matlab程序:
>> H = [4 -4;-4 8];f = [-6;-3];A = [1 1;4 1];b = [3;9];lb = ones(2,1); >> [x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb); >> x x = 1.9500 1.0500 >> fval fval = -11.0250
注:若求解的是最大值問題亦可轉化為求最優化問題。