frprmn.cpp

来自「工程算法 这是一个很有用的工程数值算法集锦」· C++ 代码 · 共 50 行

CPP
50
字号
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 + =
减小字号Ctrl + -
显示快捷键?