目錄
基本概念
凸規(guī)劃
判別定理
二次規(guī)劃模型
非線性規(guī)劃的求解
無約束極值問題
有約束極值問題
基于求解器的解法
基于問題的求解
其他
非線性規(guī)劃:描述目標函數(shù)或約束條件條件的數(shù)學表達式中,至少有一個是非線性函數(shù)。
基本概念
記是n維歐式空間中的一個點(n維向量),,,是定義在上的實值函數(shù)。若f,g,h函數(shù)中至少有一個是x的非線性函數(shù),則稱如下為非線性規(guī)劃模型的一般形式:
?全局最優(yōu)解:若,并且都有,則稱為全局最優(yōu)解。
?局部最優(yōu)解:x的鄰域內(nèi)(也包含于可行域),x所對應的函數(shù)值是最小的,則x為局部最優(yōu)解。
無約束非線性規(guī)劃問題可以具體表示為:
凸規(guī)劃
凸規(guī)劃是一類特殊的非線性規(guī)劃問題,可以求得全局最優(yōu)解。
凸集:
?凸函數(shù):
定義在凸集上的有限個凸函數(shù)的非負線性組合仍為凸函數(shù)
判別定理
半正定矩陣的行列式非負。
黑塞矩陣:
?對于非線性規(guī)劃模型的一般形式,若f(x)為凸函數(shù),g(x)為凸函數(shù),h(x)為線性函數(shù),則稱該非線性規(guī)劃問題為凸規(guī)劃。凸規(guī)劃局部最優(yōu)解即為全局最優(yōu)解,最優(yōu)解的集合形成一個凸集。當目標函數(shù)為嚴格凸函數(shù)時,其最優(yōu)解必定唯一。
例子
f(x)和g2(x)的黑塞矩陣的行列式:
?其他約束條件為線性函數(shù),所以是一個凸規(guī)劃問題
clc,clear
prob = optimproblem;
x = optimvar('x',2,'LowerBound',0);
prob.Objective = sum(x.^2)-4*x(1)+4;
con = [-x(1)+x(2)-2 <= 0
x(1)^2-x(2)+1 <= 0];
prob.Constraints.con = con;
x0.x = rand(2,1)%非線性規(guī)劃必須賦初值,x0名字隨便取
[s,f,flag,o] = solve(prob,x0);
s.x
ans =
? ? 0.5536
? ? 1.3064
二次規(guī)劃模型
目標函數(shù)是關(guān)于決策向量的二次函數(shù),約束條件是線性的,則該模型稱為二次規(guī)劃模型,一般形式:
?其中:
?當H正定時,目標函數(shù)最小化時,模型為凸二次規(guī)劃,凸二次規(guī)劃局部最優(yōu)解就是全局最優(yōu)解。如果不是凸規(guī)劃,則建議使用fmincon函數(shù)。
例子
目標函數(shù)是最小化,但是H為負定矩陣,所以不是凸規(guī)劃。
clc,clear
x = optimvar('x',2,'LowerBound',0);
h = [-1,-0.15;-0.15,-2];
f = [98;277];
a = [1,1;1,-2];
b = [100;0];
prob = optimproblem('Objective',x'*h*x+f'*x);
prob.Constraints = a*x <= b;
[s,f,flag,o] = solve(prob);
s.x
ans =
? ? ?1
? ? ?1
[1,1]是局部最優(yōu)解,使用fmincon函數(shù):
fx = @(x)x'*h*x+f'*x;
[x,y] = fmincon(fx,rand(2,1),a,b,[],[],[0;0],[])
x =
? ?1.0e-07 *
? ? 0.2533
? ? 0.3400
y =? ?1.1901e-05
非線性規(guī)劃的求解
無約束極值問題
MATLAB工具箱中用于求解無約束極小值的函數(shù)有:
?例子
clc,clear
f = @(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1);
g = @(x) -f(x);
[m1,n1] = fminunc(f,[0,0])%求極小值
[m2,n2] = fminsearch(g,[0,0]);%求極大值
m2,-n2
m1 =
? ? 1.0000 ? -0.0000
n1 =? ? -5
m2 =? ?-3.0000 ? ?2.0000
ans =? ?31.0000
有約束極值問題
同樣有基于求解器的求解方法和基于問題的求解方法
基于求解器的解法
數(shù)學模型的標準形式為:
?例:
clc,clear
fun1 = @(x) sum(x.^2)+8;
[x,y] = fmincon(fun1,rand(3,1),[],[],[],[],zeros(3,1),[],@fun2)
function [c,ceq] = fun2(x)
c = [-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20];
ceq = [-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3];
end
基于問題的求解
clc,clear
x = optimvar('x',3,'LowerBound',0);
prob = optimproblem('Objective',sum(x.^2)+8);
con1 = [-x(1)^2+x(2)-x(3)^2 <= 0
x(1)+x(2)^2+x(3)^3 <= 20];
con2 = [-x(1)-x(2)^2+2 == 0
x(2)+2*x(3)^2 == 3];
prob.Constraints.con1 = con1;
prob.Constraints.con2 = con2;
x0.x = rand(3,1);
[s,f,flag,out] = solve(prob,x0);
s.x,f
?文章來源:http://www.zghlxwxcb.cn/news/detail-462858.html
其他
匿名函數(shù)的返回值只能有一個,可以是向量。文章來源地址http://www.zghlxwxcb.cn/news/detail-462858.html
到了這里,關(guān)于數(shù)學建模——非線性規(guī)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!