⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 line_search0618.c

📁 拟牛顿法求函数极小值
💻 C
字号:
double line_search0618(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;
        double *xb;
        double *xc;
        double *xl;
        double *xu;
xa=dvector(0,n-1);
xb=dvector(0,n-1);
xc=dvector(0,n-1);
xl=dvector(0,n-1);
xu=dvector(0,n-1);
        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.000001;
        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;
free_dvector(xa,0,n-1);
free_dvector(xb,0,n-1);
free_dvector(xc,0,n-1);
free_dvector(xl,0,n-1);
free_dvector(xu,0,n-1);
        return lamda ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -