一、非線性規划和線性規划不同之處
1、含有非線性的目標函數或者約束條件
2、如果最優解存在,線性規划只能存在可行域的邊界上找到(一般還是在頂點處),而非線性規划的最優解可能存在於可行域的任意一點達到。
二、非線性規划的Matlab解法
1、Matlab中非線性規划的數學模型為:
其中f(x)是標量函數,A,B,Aeq,Beq是相應維數的矩陣和向量,C(x),Ceq(X)是非線性向量函數。
然后我們通過一個例子來加深印象
MATLAB實現:
function f=fun1(x) %定義目標函數 f=sum(x.^2)+8;
function [g,h]=fun2(x) %非線性約束條件 g=[-x(1)^2+x(2)-x(3)^2 x(1)+x(2)^2+x(3)^3-20]; h=[-x(1)-x(2)^2+2 x(2)+2*x(3)^2-3];
options = optimset('largescale','off'); [x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2',options) %初始值是個隨意的數字
2、求解線性規划的基本迭代格式
(1) 這一塊主要是一些概念,認識了這些概念,才能繼續理解下面的思想,不得不看,不要覺得煩,就想學加減乘除,我們必須定下’+’就是加這個規則一樣,所以我們要理解這些概念。
(2)對於NP問題(非線性規划),可以采用迭代方法求它的最優解。基本思想就是:
從一個選定的初始點
出發,按照某一特定的迭代規則產生一個點列
,使得當
時有窮點列時,其最后一個是NP的最優解;當
時無窮點列是,它存在極限,並且極限點就是NP的最優解
(3)求解NP問題的一般步驟
在列出步驟之前,我們要先理解一個概念(用來決定搜索的最佳方向)
一般步驟為:
b、構造搜索方向,按照一定的規划,構造f在點
處關於K的可行下降方向作為搜索方向。
c、求出下一個迭代點,按迭代格式求出
若滿足了某種終止條件,就停止迭代
(4)凸函數、凸規划
這種規划的特點在於,他的局部最優解就是全局最優解,這是很棒的特性,說明這一類的NP問題很容易進行求解。
(二)無約束問題
一、一維搜索方法
例如一維極小化問題,若f(t)是[a,b]區間上的下單峰函數,通過不斷地縮短[a,b]的長度,來搜索得到近似最優解。
就是找到關於這個區間對稱的2點,然后比較這兩點的大小,那么t*肯定將大的那邊回縮,構造一個更小的區間來求解,這樣的話最后就取到極限值,就可以得到最優解。
1、斐波那契數列法
這個方法就是用來確定步長是如何取得一種方式,是采用斐波那契分數來刻畫每次區間的差值。
然后就是經過一系列的探索之后,使最后的探索點和最優解之間的距離不超過精度
,也就是最后的區間長度不能超過這個
,這樣子的話,我們可以通過精度,反過來確定需要探索的次數N,進行N次停下來,最終的就是最優解。
下面是算法的整體思路(編程思路)
2、0.618法(黃金分割法)
只是將比值改為了0.618,這樣子的話,編程實現起來更加的簡單,只要將上述的第三部中的斐波那契比值改為0.618即可。
3、二次插值法(暫時略過)
4、無約束極值問題的解法
(2)解析法——梯度法
對於基本的迭代格式,我們首先要確定的是搜索方向,那么由微積分的知識可得,沿着負梯度的方向是f下降最快的方向,所以我們作為我們以為搜索的方向。
這個方法的特點就是每次搜索的方向都是下降最快的方向,於是乎我們的停止條件為:![]()
具體步驟如下:
在此舉出一個例題
MATLAB實現
function [f,df]=detaf(x) f=x(1)^2+25*x(2)^2; df=[2*x(1) 50*x(2)];
x=[2;2]; [f0,g]=detaf(x); while norm(g)>1e-6 p=-g/norm(g); t=1.0; f=detaf(x+t*p); while f>f0 t=t/2; f=detaf(x+t*p); end x=x+t*p; [f0,g]=detaf(x); end x,f0
最后極值趨近於0,差不多= =。
(3)解析法——牛頓法
其實就是用二次展開式逼近,確定出一個搜索的方向。至於中間的計算(呵呵了- -)
然后一般步驟(編程思路)
然后舉一題例題
我們可以通過計算得到
然后使用MATLAB編程求解(其實用C也可以。。)
function [f,df,d2f]=nwfun(x) f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2; df=[4*x(1)^3+2*x(1)*x(2)^2 100*x(2)^3+2*x(1)^2*x(2)]; d2f=[12*x(1)^2+2*x(2)^2,4*x(1)*x(2) 4*x(1)*x(2),300*x(2)^2+2*x(1)^2];
x=[2;2]; [f0,g1,g2]=nwfun(x); while norm(g1)>0.00001 p=-inv(g2)*g1; x=x+p; [f0,g1,g2]=nwfun(x); end x,f0
然后如果目標函數不是二次函數,那么一般來說Newton法不能保證求得最優解。
為了提高計算精度,我們在迭代的時候依舊可以使用變步長的方法。
x=[2;2]; [f0,g1,g2]=nwfun(x); while norm(g1)>0.00001 p=-inv(g2)*g1; p=p/norm(p); t=1.0; f=nwfun(x+t*p); while f>f0 t=t/2; f=nwfun(x+t*p) end x=x+t*p; [f0,g1,g2]=nwfun(x); end x,f0
(3)解析法——變尺度法
這是用來解決Newton法求逆矩陣太耗時而研究出的一種解決的方法。推到我們可以直接略過吧。
直接寫出一般步驟
(4)直接法——Powell方法
5、無約束問題的MATLAB方法。。(= =,早說,我都不寫了)
1、無約束問題的MATLAB格式
(1)fminunc命令
例子如下
MATLAB調用解題
(2)fminsearch命令
(三)約束極值問題
一、二次規划
1、定義:目標函數是x的二次函數,而且約束條件都是線性的。
2、一般數學模型
3、MATLAB的求解函數
二、外罰函數法
例題:
求解






































