📄 frprmn.cpp
字号:
void frprmn(double p[],int n,double ftol,int& iter,double& fret)
{
int j,its,itmax = 200;
double eps = 0.0000000001;
double g[551], h[51], xi[51];
double fp = func2(p, n);
dfunc(p, xi);
for (j = 1; j<=n; j++)
{
g[j] = -xi[j];
h[j] = g[j];
xi[j] = h[j];
}
for (its = 1; its<=itmax; its++)
{
iter = its;
linmin(p, xi, n, fret);
if (2.0 * fabs(fret - fp)<=ftol*(fabs(fret)+fabs(fp)+eps))
{
break;
}
fp = func2(p, n);
dfunc(p, xi);
double gg = 0.0;
double dgg = 0.0;
for (j = 1; j<=n; j++)
{
gg = gg + g[j] * g[j];
//dgg = dgg + xi(j) * xi(j) //polak-ribiere 法
dgg = dgg + (xi[j] + g[j]) * xi[j]; //fletcher-reeves 法
}
if (gg == 0.0)
{
break;
}
double gam = dgg / gg;
for (j = 1; j<=n; j++)
{
g[j] = -xi[j];
h[j] = g[j] + gam * h[j];
xi[j] = h[j];
}
}
if (iter > itmax)
{
cout<<" frpr maximum iterations exceeded";
cout<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -