建模算法(三)——非線性規划


一、非線性規划和線性規划不同之處

1、含有非線性的目標函數或者約束條件

2、如果最優解存在,線性規划只能存在可行域的邊界上找到(一般還是在頂點處),而非線性規划的最優解可能存在於可行域的任意一點達到。

二、非線性規划的Matlab解法

1、Matlab中非線性規划的數學模型為:

image

       其中f(x)是標量函數,A,B,Aeq,Beq是相應維數的矩陣和向量,C(x),Ceq(X)是非線性向量函數。

image

      然后我們通過一個例子來加深印象

image

         image

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) 這一塊主要是一些概念,認識了這些概念,才能繼續理解下面的思想,不得不看,不要覺得煩,就想學加減乘除,我們必須定下’+’就是加這個規則一樣,所以我們要理解這些概念。

image

(2)對於NP問題(非線性規划),可以采用迭代方法求它的最優解。基本思想就是:

       從一個選定的初始點image出發,按照某一特定的迭代規則產生一個點列image,使得當image時有窮點列時,其最后一個是NP的最優解;當image時無窮點列是,它存在極限,並且極限點就是NP的最優解

image

image

(3)求解NP問題的一般步驟

在列出步驟之前,我們要先理解一個概念(用來決定搜索的最佳方向)

image

一般步驟為:

a、選取初始點image,令k:=0

b、構造搜索方向,按照一定的規划,構造f在點image處關於K的可行下降方向作為搜索方向。

c、求出下一個迭代點,按迭代格式求出

image

    若滿足了某種終止條件,就停止迭代

d、用image代替image,繼續迭代。

(4)凸函數、凸規划

image

         這種規划的特點在於,他的局部最優解就是全局最優解,這是很棒的特性,說明這一類的NP問題很容易進行求解。

(二)無約束問題

一、一維搜索方法

    例如一維極小化問題,若f(t)是[a,b]區間上的下單峰函數,通過不斷地縮短[a,b]的長度,來搜索得到近似最優解。

   就是找到關於這個區間對稱的2點,然后比較這兩點的大小,那么t*肯定將大的那邊回縮,構造一個更小的區間來求解,這樣的話最后就取到極限值,就可以得到最優解。

1、斐波那契數列法

image

      這個方法就是用來確定步長是如何取得一種方式,是采用斐波那契分數來刻畫每次區間的差值。

      然后就是經過一系列的探索之后,使最后的探索點和最優解之間的距離不超過精度image,也就是最后的區間長度不能超過這個image,這樣子的話,我們可以通過精度,反過來確定需要探索的次數N,進行N次停下來,最終的就是最優解。

image

      下面是算法的整體思路(編程思路)

image

2、0.618法(黃金分割法)image

 

       只是將比值改為了0.618,這樣子的話,編程實現起來更加的簡單,只要將上述的第三部中的斐波那契比值改為0.618即可。

3、二次插值法(暫時略過)

4、無約束極值問題的解法

(1)一般格式為:image

(2)解析法——梯度法

      對於基本的迭代格式,我們首先要確定的是搜索方向,那么由微積分的知識可得,沿着負梯度的方向是f下降最快的方向,所以我們作為我們以為搜索的方向。

這個方法的特點就是每次搜索的方向都是下降最快的方向,於是乎我們的停止條件為:image

      具體步驟如下:

image

在此舉出一個例題

image

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)解析法——牛頓法

       其實就是用二次展開式逼近,確定出一個搜索的方向。至於中間的計算(呵呵了- -)

image

image

然后一般步驟(編程思路)

image

然后舉一題例題

image

我們可以通過計算得到

image

image

然后使用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法求逆矩陣太耗時而研究出的一種解決的方法。推到我們可以直接略過吧。

直接寫出一般步驟

image

image

(4)直接法——Powell方法

image

image

5、無約束問題的MATLAB方法。。(= =,早說,我都不寫了)

1、無約束問題的MATLAB格式

image

(1)fminunc命令

image

例子如下

image

MATLAB調用解題

image

image

(2)fminsearch命令

image

(三)約束極值問題

一、二次規划

1、定義:目標函數是x的二次函數,而且約束條件都是線性的。

2、一般數學模型

image

3、MATLAB的求解函數

image

二、外罰函數法

image

例題:

image

求解

image

image

三、MATLAB求約束極值問題

1、fminbnd函數

image

2、fseminf函數

image

image

3、fseminf函數

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM