📄 line_search0618.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 + -