• <th id="ix9b8"></th>
    1. <tbody id="ix9b8"><noscript id="ix9b8"></noscript></tbody><li id="ix9b8"><object id="ix9b8"><u id="ix9b8"></u></object></li>
      1. <li id="ix9b8"><acronym id="ix9b8"></acronym></li>
      2. 工程優化目標函數的幾種極值求解方法c++編程 - 下載本文

        目標函數極值求解的幾種方法

        題目:分別用最速下降法,牛頓法,共軛梯度法,擬牛頓法求函數

        f?(x1?1)?5(x2?5)?(x3?1)?5(x4?5)2222的最小值,初始點自擬。

        一維搜索法:

        迭代下降算法大都具有一個共同點,這就是得到點x?k?后需要按某種規則確定一個方向d?k?,再從x?k?出發,沿方向d?k?在直線(或射線)上求目標函數的極小點,從而得到x?k?的后繼點x?k?1?,重復以上做法,直至求得問題的解,這里所謂求目標函數在直線上的極小點,稱為一維搜索。

        一維搜索的方法很多,歸納起來大體可以分為兩類,一類是試探法:采用這類方法,需要按某種方式找試探點,通過一系列的試探點來確定極小點。另一類是函數逼近法或插值法:這類方法是用某種較簡單的曲線逼近本來的函數曲線,通過求逼近函數的極小點來估計目標函數的極小點。這里采用的是第一類試探法中的黃金分割法。實現過程如下:

        ⑴ 置初始區間[a1,b1]及精度要求L>0,計算試探點?1和?1,計算函數值

        f??1?和f??1?,計算公式是:?1?a1?0.382?b1?a1?,?1?a1?0.618?b1?a1?。令

        k=1。

        ⑵ 若

        bk?ak?Lf??k?則停止計算。否則,當f??K?>時,轉步驟⑶;當

        f??K??f??k?時,轉步驟⑷ 。

        ⑶ 置數值

        f??k?1?ak?1??k,

        bk?1?bk,

        ?k?1??k,

        ?k?1?ak?1?0.618?bk?1?ak?1?,計算函

        ,轉⑸。

        ak?1?ak ⑷ 置函數值

        f??k?1?,

        bk?1??k,

        ?k?1??k,

        ?k?1?ak?1?0.382?bk?1?ak?1?,計算

        ,轉⑸。

        最速下降法

        實現原理描述:在求目標函數極小值問題時,總希望從一點出發,選擇一個目

        標函數值下降最快的方向,以利于盡快達到極小點,正是基于這樣一種愿望提出的最速下降法,并且經過一系列理論推導研究可知,負梯度方向為最速下降方向。

        最速下降法的迭代公式是x?k?1??x?k???kd?k?,其中d?k?是從x?k?出發的搜索方向,這里取在點x?k?處最速下降方向,即d?k????f?xk?。?k是從x?k?出發沿方向d?k?進行的一維搜索步長,滿足f?x?k???kd?k???minf?x?k???d?k??。

        ??0實現步驟如下:

        ⑴ 給定初點x?1??Rn ,允許誤差??0,置k=1。

        ⑵ 計算搜索方向d?k????f?xk?, 若d?k???,則停止計算;否則,從x?k?出發,沿方向d?k?進行的一維搜索,求?k,使f?x?k???kd?k???minf?x?k???d?k??。

        ??0 ⑶ x?k?1??x?k???kd?k?,置k=k+1返回步驟 ⑵。

        牛頓法

        牛頓法迭代公式:x?k?1??x?k???kd?k?,d?k?是在點x?k?處的牛頓方向,

        d?k????f?x2?k???1?f?x?k??,?k是從x?k?出發沿牛頓方向d?k?進行搜索的最優步長。

        ⑴ 給定初點x?1??Rn ,允許誤差??0,置k=1。

        ⑵ 計算g?k???f?xk?, 若g?k???,則停止計算;否則,轉⑶。 ⑶ 計算d?k????2f?x?k??gk,從x?k?出發,沿方向d?k?進行的一維搜索,

        ?1求?k,使f?x?k???kd?k???minf?x?k???d?k??,x?k?1??x?k???kd?k?,置k=k+1返回

        ??0步驟 ⑵。

        共軛梯度法

        若d?1?,d?2?,?,d?k?是Rn中k個方向,它們兩兩關于A共軛,即滿足

        d?i?TAd?j??0,i?j;i,j?1,?,k,稱這組方向為A的k個共軛方向。共軛梯度法的

        基本思想是把共軛性與最速下降法相結合,利用已知點處的梯度構造一組共軛方

        向,并沿這組方向進行搜索,求出目標函數的極小點,根據共軛方向的基本性質這種方法具有二次終止性。

        實現步驟如下:

        ⑴ 給定初點x?1??Rn ,允許誤差??0; ⑵ 若?f(x1)??,則停止計算;否則,轉⑶; ⑶ 置d?1????f?x?1??,k=1。

        ⑷ 作一維搜索,求?k,滿足f?x?k???kd?k???minf?x?k???d?k??;

        ??0⑸ 令x?k?1??x?k???kd?k?,求g?k?1???f?x?k?1??。 ⑹ 若g?k?1???,則停止計算;否則,轉⑺; ⑺ 若k=n,則令x?1??x?n?1?,轉⑶;否則,轉8);

        gx⑻ 令d?k?1???g(k?1)??kd?k?,其中?k???k?1??k??22gx??,置k=k+1,轉⑷。

        程序

        #include #include #include

        #define N 100

        double F(double x[],double p[],double xi[],double ba[],int n,double t) { }

        double f=0; int i;

        for(i=0;i

        f=f+xi[i]*(x[i]+t*p[i]-ba[i])*(x[i]+t*p[i]-ba[i]); return f;

        double HJFC(double x[],double p[],double xi[],double ba[],int n) {

        double a=0,b=10,x1,x2,f1,f2,e=0.0001,y; x2=a+0.618*(b-a); f2=F(x,p,xi,ba,n,x2); x1=a+0.382*(b-a); f1=F(x,p,xi,ba,n,x1);

        while(fabs(b-a)>e) {

        if(f1

        b=x2;x2=x1;f2=f1; x1=a+0.382*(b-a); f1=F(x,p,xi,ba,n,x1); }

        else if(f1==f2) {

        a=x1;b=x2;

        x2=a+0.618*(b-a); f2=F(x,p,xi,ba,n,x2); x1=a+0.382*(b-a); f1=F(x,p,xi,ba,n,x1); }

        else {

        a=x1;x1=x2;f1=f2; x2=a+0.618*(b-a); f2=F(x,p,xi,ba,n,x2); } }

        y=0.5*(b+a); return y;

        }

        void zuisu(double x[],double xi[],double ba[],int n) {

        int i,k=1;

        double sum,eps,arph,g[N],p[N];

        eps=0.000001; sum=0; for(i=0;i

        } i=0;

        while(sqrt(sum)>eps&&i

        sum=0;

        arph=HJFC(x,p,xi,ba,n); for(i=0;i

        sum=sum+p[i]*p[i];

        {

        x[i]=x[i]+arph*p[i]; g[i]=2*xi[i]*(x[i]-ba[i]); p[i]=-g[i]; sum=sum+p[i]*p[i]; }

        printf(\第%d次迭代:\\n\\n\

        printf(\步長lambda=%f\\n\ for(i=0;i

        printf(\

        printf(\ k++;

        }

        printf(\最后結果為:\\n\

        for(i=0;i

        }

        void gonge(double x[],double xi[],double ba[],int n) {

        int k=1,i;

        double sum1,sum2,eps,bita,arph,g[N],p[N];

        eps=0.000001; sum1=0;

        for(i=0;i

        g[i]=2*xi[i]*(x[i]-ba[i]); sum1+=g[i]*g[i];

        }

        while((sqrt(sum1)>eps)&&(k

        if(k==1) {

        for(i=0;i

        bita=0; } else

        {

        bita=sum1/sum2; for(i=0;i

        p[i]=-g[i]+bita*p[i];

        }

        arph=HJFC(x,p,xi,ba,n); sum1=0;





        午夜夫妻一级生活片,一级毛片免费完整视频,日本三级香港三级人妇