亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dfp.cpp

?? DFP無約束情況下的
?? CPP
字號:
#include "iostream.h"
#include "math.h"

void comput_grad(double (*pf)(double *x),  int n,  double *point,  double *grad);                        //計算梯度
double line_search1(double (*pf)(double *x),  int n,  double *start,  double *direction);        //0.618法線搜索
double line_search(double (*pf)(double *x),   int n,  double *start,  double *direction);        //解析法線搜索
double DFP(double (*pf)(double *x),   int n,   double *min_point);                //無約束變尺度法



//梯度計算模塊
//參數:指向目標函數的指針,變量個數,求梯度的點,結果
void comput_grad(double (*pf)(double *x),
                                  int n,
                                  double *point,
                                  double *grad)
{
        double h=1E-3;
        int i;
        double *temp;
        temp = new double[n];
        for(i=1;i<=n;i++)
        {
                temp[i-1]=point[i-1];
        }
		//各個點梯度計算
        for(i=1;i<=n;i++)
        {
                temp[i-1]+=0.5*h;
                grad[i-1]=4*pf(temp)/(3*h);
                temp[i-1]-=h;
                grad[i-1]-=4*pf(temp)/(3*h);
                temp[i-1]+=(3*h/2);
                grad[i-1]-=(pf(temp)/(6*h));
                temp[i-1]-=(2*h);
                grad[i-1]+=(pf(temp)/(6*h));
                temp[i-1]=point[i-1];
        }
        delete[] temp;
}

//一維搜索模塊
//參數:指向目標函數的指針,變量個數,出發點,搜索方向
//返回:最優步長
double line_search(
                                   double (*pf)(double *x),
                                   int n,
                                   double *start,
                                   double *direction)
{
        int i;
        double step=0.001;
        double a=0,value_a,diver_a;
        double b,value_b,diver_b;
        double t,value_t,diver_t;
        double s,z,w;
        double *grad,*temp_point;

        grad=new double[n];
        temp_point=new double[n];
        comput_grad(pf,n,start,grad);
        diver_a=0;
        for(i=1;i<=n;i++)
                diver_a=diver_a+grad[i-1]*direction[i-1];
        do
        {
                b=a+step;
                for(i=1;i<=n;i++)
                        temp_point[i-1]=start[i-1]+b*direction[i-1];
                comput_grad(pf,n,temp_point,grad);
                diver_b=0;
                for(i=1;i<=n;i++)
                        diver_b=diver_b+grad[i-1]*direction[i-1];
                if( fabs(diver_b)<1E-10 )
                {
                        delete[] grad;
                        delete[] temp_point;
                        return(b);
                }
                if( diver_b<-1E-15 )
                {
                        a=b;
                        diver_a=diver_b;
                        step=2*step;
                }
        }while( diver_b<=1E-15 );

        for(i=1;i<=n;i++)
                temp_point[i-1]=start[i-1]+a*direction[i-1];
        value_a=(*pf)(temp_point);
        for(i=1;i<=n;i++)
                temp_point[i-1]=start[i-1]+b*direction[i-1];
        value_b=(*pf)(temp_point);
//迭代
        do
        {
                s=3*(value_b-value_a)/(b-a);
                z=s-diver_a-diver_b;
                w=sqrt( fabs(z*z-diver_a*diver_b) );       
                t=a+(w-z-diver_a)*(b-a)/(diver_b-diver_a+2*w);
                value_b=(*pf)(temp_point);
                for(i=1;i<=n;i++)
                        temp_point[i-1]=start[i-1]+t*direction[i-1];
                value_t=(*pf)(temp_point);
                comput_grad(pf,n,temp_point,grad);
                diver_t=0;
                for(i=1;i<=n;i++)
                        diver_t=diver_t+grad[i-1]*direction[i-1];
                if(diver_t>1E-6)
                {
                        b=t;
                        value_b=value_t;
                        diver_b=diver_t;
                }
                else if(diver_t<-1E-6)
                {
                        a=t;
                        value_a=value_t;
                        diver_a=diver_t;
                }
                else break;
        }while( (fabs(diver_t)>=1E-6) && (fabs(b-a)>1E-6) );

        delete[] grad;
        delete[] temp_point;
        return(t);

}

//無約束變尺度法DFP函數聲明
//
//參數:pf指向目標函數的指針,n變量個數,min_point接受初始點、存放結果
//返回:極小點處函數值
//
double DFP(
                   double (*pf)(double *x),
                   int n,
                   double *min_point
                   )
{

//定義變量,申請內存區域
        int i,j;
        int k=0;
        double e=1E-5;							//誤差精度
        double g_norm;							//梯度長度
                
        double *g0=new double[n];               //梯度
        double *g1=new double[n];
        double *dg=new double[n];				//g的差

        double *p=new double[n];                //搜索方向 =-g
        double t;                               //一維搜索步長

        double *x0=new double[n];				//當前點
        double *x1=new double[n];
        double *dx=new double[n];				//x的差

        double **H=new double*[n];				//尺度矩陣
        for (i=0; i<n; i++)                H[i] = new double[n];

        double **tempH=new double*[n];
        for (i=0; i<n; i++)                tempH[i] = new double[n];

        double *gH=new double[n];
        double *Hg=new double[n];
        double num1;
        double num2;


//初始化
        for(i=0;i<n;i++)
                for(j=0;j<n;j++)
                {
                        if(i==j)        H[i][j]=1.0;        // H0=I
                        else        H[i][j]=0.0;
                        tempH[i][j]=0.0;
                }


        for(i=0;i<n;i++)
                x0[i]=min_point[i];  

//DFP算法開始
        comput_grad(pf,n,x0,g0);

//檢測初值是否滿足要求
        g_norm=0.0;
        for(i=0;i<n;i++)        g_norm=g_norm+g0[i]*g0[i];        
        g_norm=sqrt(g_norm);
        if (g_norm<e) 
        {
                for(i=0;i<n;i++)        min_point[i]=x0[i];

                delete[] g0;                
                delete[] g1;
                delete[] dg;
                delete[] p;
                delete[] x0;
                delete[] x1;
                delete[] dx;
                for (i=0; i<n; i++)                delete[] H[i];
                delete []H;
                for (i=0; i<n; i++)                delete[] tempH[i];
                delete []tempH;
                delete[] gH;
                delete[] Hg;

                return pf(min_point);
        }

//如果初值不滿足要求,開始進行迭代計算
		for(i=0;i<n;i++)        p[i]=-g0[i];				//初始方向設置       
//迭代
        do
        {
                t=line_search(pf,n,x0,p);                                
                for(i=0;i<n;i++)        x1[i]=x0[i]+t*p[i];
                comput_grad(pf,n,x1,g1);

				//檢測
                g_norm=0.0;
                for(i=0;i<n;i++)        g_norm=g_norm+g1[i]*g1[i];
                g_norm=sqrt(g_norm);
                //cout<<k<<"    "<<x0[0]<<"       "<<x0[1]<<"       "<<g_norm<<"\n";
                if (g_norm<e) 
                {
                        for(i=0;i<n;i++)        min_point[i]=x1[i];

                        delete[] g0;                
                        delete[] g1;
                        delete[] dg;
                        delete[] p;
                        delete[] x0;
                        delete[] x1;
                        delete[] dx;
                        for (i=0; i<n; i++)                delete[] H[i];
                        delete []H;
                        for (i=0; i<n; i++)                delete[] tempH[i];
                        delete []tempH;
                        delete[] gH;
                        delete[] Hg;
                        
                        return pf(min_point);
                }

				//求Hk+1的矩陣運算
                for(i=0;i<n;i++)
                {
                        dx[i]=x1[i]-x0[i];
                        dg[i]=g1[i]-g0[i];
                }
              
                //g*H,H*g,矩陣運算
                for(i=0;i<n;i++)
                {
                        gH[i]=0.0;
                        Hg[i]=0.0;
                }
                for(i=0;i<n;i++)
                {
                        for(j=0;j<n;j++)
                        {
                                gH[i]=gH[i]+dg[j]*H[j][i];
                                //Hg[i]=Hg[i]+H[i][j]*dg[j];
                                Hg[i]=gH[i];
                        }                        
                }

                //num1,num2
                num1=0.0;
                num2=0.0;
                for(i=0;i<n;i++)
                {
                        num1=num1+dx[i]*dg[i];
                        num2=num2+gH[i]*dg[i];
                }

                //整合計算公式,得到尺度矩陣
                for(i=0;i<n;i++)
                        for(j=0;j<n;j++)
                                tempH[i][j]=0.0;
                for(i=0;i<n;i++)
                {
                        for(j=0;j<n;j++)
                        {
                                tempH[i][j]=tempH[i][j]+H[i][j];
                                tempH[i][j]=tempH[i][j]+dx[i]*dx[j]/num1;
                                tempH[i][j]=tempH[i][j]-Hg[i]*gH[j]/num2;
                        }
                }

                for(i=0;i<n;i++)
                {
                        for(j=0;j<n;j++)
                        {
                                H[i][j]=tempH[i][j];
                        }
                }
                /////////////////////////////

                //P=-H*G,矩陣運算
                for(i=0;i<n;i++)        p[i]=0.0;
                for(i=0;i<n;i++)
                {
                        for(j=0;j<n;j++)
                        {
                                p[i]=p[i]-H[i][j]*g1[j];
                        }                        
                }

                for(i=0;i<n;i++)
                {
                        g0[i]=g1[i];
                        x0[i]=x1[i];
                }
                k=k+1;
        }while(g_norm>e);

        for(i=0;i<n;i++)        min_point[i]=x1[i];

        delete[] g0;                
        delete[] g1;
        delete[] dg;
        delete[] p;
        delete[] x0;
        delete[] x1;
        delete[] dx;
        for (i=0; i<n; i++)                delete[] H[i];
        delete []H;
        for (i=0; i<n; i++)                delete[] tempH[i];
        delete []tempH;
        delete[] gH;
        delete[] Hg;

        return pf(min_point);
}

/////////////
double fun(double *x)
{
        return 100*( x[1]-x[0]*x[0] )*( x[1]-x[0]*x[0] ) + (1-x[0])*(1-x[0]);
}

void main()
{
        int n=2;
        double min_point[2]={-5,10};
        double min_value=DFP(fun,n,min_point);
        cout<<min_point[0]<<" and "<<min_point[1]<<"   "<<min_value<<endl;

}

//0.618法線搜索
//
//參數:指向目標函數的指針,變量個數,出發點,搜索方向
//返回:最優步長
//
double line_search1(
                                   double (*pf)(double *x),
                                   int n,
                                   double *start,
                                   double *direction)
{
        int i;
        int k;

        double l,a,b,c,u,lamda,t,e;

        double *xa=new double[n];
        double *xb=new double[n];
        double *xc=new double[n];
        double *xl=new double[n];
        double *xu=new double[n];

        
        //確定初始搜索區間
        l=0.001;
        a=0;

        k=0;
        do
        {
                k++;
                c=a+l;
                for(i=0;i<n;i++)
                {
                        xc[i]=start[i]+c*direction[i];
                        xa[i]=start[i]+a*direction[i];
                }
                l=l/3;
        }while( pf(xc) >= pf(xa) );                        // ???

        k=0;
        do
        {
                k++;
                l=2*l;
                b=c+l;
                for(i=0;i<n;i++)
                {
                        xc[i]=start[i]+c*direction[i];
                        xb[i]=start[i]+b*direction[i];
                }
                a=c;
                c=b;
        }while( pf(xb) <= pf(xc) );


        a=0;
        b=0.1;

        //尋優
        t=0.618;
        e=0.0001;

        lamda=b-t*(b-a);
        u=a+t*(b-a);
        
       	for(i=0;i<n;i++)
		{
				xl[i]=start[i]+lamda*direction[i];
				xu[i]=start[i]+u*direction[i];
		}

        k=0;
        do
        {
                k++;
                if( pf(xl)<pf(xu) )
                {
                        b=u;
                        u=lamda;
                        lamda=b-t*(b-a);
                }
                else
                {						
                        a=lamda;
						lamda=u;                        
                        u=t*(b-a);
                }
        }while( b-a>=e );

        lamda=(a+b)/2;

        delete[] xa;
        delete[] xb;
        delete[] xc;
        delete[] xl;
        delete[] xu;
        
        return lamda ;

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕亚洲欧美在线不卡| 亚洲第一会所有码转帖| 日本韩国一区二区| 不卡的电影网站| 欧美综合欧美视频| 中文字幕中文字幕一区二区| 久久久国际精品| 国产欧美一区二区精品性| 久久久精品黄色| 欧美激情一区不卡| 亚洲精品国产无套在线观| 图片区日韩欧美亚洲| 国产综合色在线视频区| jlzzjlzz国产精品久久| 在线视频欧美区| 4438成人网| 国产精品蜜臀在线观看| 日韩国产一二三区| 国产精品羞羞答答xxdd| 欧美亚日韩国产aⅴ精品中极品| 欧美三级韩国三级日本三斤| 日韩一二三四区| 国产精品嫩草影院com| 三级久久三级久久久| 国产999精品久久久久久绿帽| 色综合天天综合色综合av| 欧美一级国产精品| 亚洲黄一区二区三区| 韩日av一区二区| 91精品国产91久久久久久一区二区| 国产色爱av资源综合区| 老司机免费视频一区二区| 色欧美片视频在线观看在线视频| 久久久亚洲精华液精华液精华液| 亚洲国产精品久久久久婷婷884| 久久精品这里都是精品| 欧美一区二区播放| 中文字幕第一区第二区| 国产精品自拍毛片| 欧美精品一区二区三区蜜桃视频| 亚洲成av人片一区二区梦乃| 色综合天天综合| 一区二区三区色| 91日韩在线专区| 亚洲一区二区三区四区的| 日本伦理一区二区| 日韩精品一区第一页| 欧美日韩久久久一区| 日韩精品成人一区二区三区| 欧美精品xxxxbbbb| 奇米影视一区二区三区小说| 欧美一区午夜精品| 激情伊人五月天久久综合| 久久久激情视频| 99视频在线观看一区三区| 亚洲一卡二卡三卡四卡五卡| 欧美在线免费观看亚洲| 另类小说色综合网站| 久久久久97国产精华液好用吗| 成人三级在线视频| 午夜精品久久久久久久| 日韩精品综合一本久道在线视频| 久久99久久久欧美国产| 日韩美女久久久| 日韩免费成人网| 欧美性猛片xxxx免费看久爱| 久久成人久久爱| 午夜久久福利影院| 亚洲欧洲99久久| 久久一日本道色综合| 欧美丝袜丝交足nylons| 国产曰批免费观看久久久| 亚洲高清一区二区三区| 国产精品私人影院| 精品福利一区二区三区| 欧美美女一区二区| 91蜜桃网址入口| 成人精品一区二区三区中文字幕| 日韩高清一级片| 亚洲一区二区三区四区在线免费观看 | 色乱码一区二区三区88| 国产一区 二区 三区一级| 一区二区三区久久久| 亚洲色图在线视频| 亚洲欧美在线视频| 亚洲国产精品v| 中文字幕在线观看不卡视频| 国产亚洲精品久| 国产精品欧美久久久久无广告 | 国产精品夜夜嗨| 国产精品一级在线| 成人精品高清在线| 91色porny在线视频| 欧美亚洲国产bt| 日韩一区二区三| 亚洲精品一区在线观看| 日韩欧美成人一区二区| 国产欧美va欧美不卡在线| 亚洲日本电影在线| 免费观看日韩av| 懂色av一区二区三区免费看| 菠萝蜜视频在线观看一区| 日本高清免费不卡视频| 精品国产一区二区在线观看| 中文字幕在线观看一区| 午夜亚洲国产au精品一区二区| 美女看a上一区| 不卡av电影在线播放| 日韩视频中午一区| 国产高清无密码一区二区三区| 亚洲乱码国产乱码精品精的特点| 国产精品国产a级| 青椒成人免费视频| 91成人看片片| 中文字幕在线一区免费| 奇米色一区二区三区四区| av一本久道久久综合久久鬼色| 69p69国产精品| 亚洲日本在线a| 99国产精品久久久久久久久久久| 日韩午夜在线影院| 日韩精品福利网| 欧美日韩一区不卡| 亚洲综合在线五月| 99re热这里只有精品免费视频| 26uuu亚洲| 热久久一区二区| 日韩欧美资源站| 免费观看在线色综合| 欧美另类videos死尸| 亚洲午夜电影在线| 欧美日韩成人一区| 丝袜国产日韩另类美女| 7777精品伊人久久久大香线蕉| 亚洲精品五月天| 欧美日韩国产高清一区二区三区| 亚洲综合精品久久| 欧美久久一区二区| 日韩福利视频导航| 日韩一卡二卡三卡| 国产精品综合在线视频| 亚洲国产成人一区二区三区| 粉嫩嫩av羞羞动漫久久久| 亚洲同性gay激情无套| 91天堂素人约啪| 日韩二区三区四区| 国产精品三级av| 欧美午夜精品久久久久久超碰| 日韩综合在线视频| 国产精品无码永久免费888| 91久久精品网| 韩国视频一区二区| 亚洲大片精品永久免费| 精品日韩一区二区| 91久久精品日日躁夜夜躁欧美| 免费成人小视频| 一区二区三区在线播放| 精品av综合导航| 欧美区一区二区三区| 91网站在线播放| 国产精一区二区三区| 久久精品国产亚洲a| 亚洲综合小说图片| 最新欧美精品一区二区三区| 宅男噜噜噜66一区二区66| 99精品国产99久久久久久白柏| 老司机免费视频一区二区| 一区二区三区精品视频在线| 日韩精品在线一区二区| 欧美一区永久视频免费观看| va亚洲va日韩不卡在线观看| 国产主播一区二区| 伦理电影国产精品| 极品美女销魂一区二区三区 | 免费欧美高清视频| 亚洲成人精品一区| 午夜精品福利一区二区三区av| 亚洲精品日日夜夜| 一区二区在线免费观看| 亚洲女同ⅹxx女同tv| 一区二区三区小说| 亚洲午夜久久久久久久久电影网 | 国产精品综合久久| 国产一区二区不卡在线| 国产精品一区2区| 成人激情动漫在线观看| 99re视频精品| 粉嫩av一区二区三区在线播放| 国产伦精品一区二区三区免费迷| 国产乱人伦偷精品视频不卡 | 国产精品成人一区二区艾草| 自拍av一区二区三区| 亚洲一区二区三区四区在线免费观看 | 欧美日韩视频在线观看一区二区三区| 91久久精品一区二区三| 欧美电视剧免费观看| 中文字幕欧美国产| 午夜av区久久| 国产成人无遮挡在线视频| 欧美在线视频不卡|