/***************************************
Armijo线性搜索
****************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 2
float Armijo(float X[N],float d[N],float b,float r,float p);
float Fun(float X[N]);//关于x的多项式f(x)
float Fun2(float X[N],float d[N],float a);//Fun(X+a*d)
float Fun3(float X[N],float d[N]);//Fun(X+a*d)的导数
void main()
{
float x[N]={1,1};
float d1[N]={1,-1};
float y;
y=Armijo(x,d1,1,0.3,0.9);
printf("%f\n",y);
}
float Armijo(float X[N],float d[N],float b,float r,float p)
{
float ak=1,k;
k=Fun2(X,d,ak)-Fun(X)-r*ak*Fun3(X,d);
if(k>0)
{
ak=b;
while(Fun2(X,d,ak)>=Fun(X)-r*ak*Fun3(X,d))
{
ak=p*ak;
}
}
return ak;
}
float Fun(float X[N])
{
float s; s=0;
s=0.5*X[0]*X[0]+X[1]*X[1];
return s;
}
float Fun3(float X[N],float d[N])/
{
float s=0;
//s=d[0]*(X[0]+X[1]*X[1])+d[1]*(0.5*X[0]*X[0]+2*X[1]);
s=X[0]*d[0]+2*X[1]*d[1];
return s;
}
float Fun2(float X[N],float d[N],float a)
{
/*float Y[N];
for(int i=0;i<N;i++)
{
Y[i]=X[i]+a*d[i];
}
return Fun(Y[N]);*/
float s=0;
s=0.5*(X[0]+a*d[0])*(X[0]+a*d[0])+(X[1]+a*d[1])*(X[1]+a*d[1]);
return s;
}
Armiji线性搜索
最新推荐文章于 2024-01-24 21:43:56 发布