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

📄 dfpmin.cpp

📁 此程序为VC++常用数值算法这本书附赠的光盘中包含了本书中全部的源代码
💻 CPP
字号:
void dfpmin(double p[],int n,double ftol,int& iter,double& fret)
{
    int i,j,its,itmax = 200;
    double eps = 0.0000000001;
    double hessin[51][51], xi[51], g[51], dg[51], hdg[51];
    double fp = func2(p, n);
    dfunc(p, g);
    for (i = 1; i<=n; i++)
	{
        for (j = 1; j<=n; j++)
		{
            hessin[i][j] = 0.0;
        }
        hessin[i][i] = 1.0;
        xi[i] = -g[i];
    }
    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))
		{
            return;
        }
        fp = fret;
        for (i = 1; i<=n; i++)
		{
            dg[i] = g[i];
        }
        fret = func2(p, n);
        dfunc(p, g);
        for (i = 1; i<=n; i++)
		{
            dg[i] = g[i] - dg[i];
        }
        for (i = 1; i<=n; i++)
		{
            hdg[i] = 0.0;
            for (j = 1; j<=n; j++)
			{
                hdg[i] = hdg[i] + hessin[i][j] * dg[j];
            }
        }
        double fac = 0.0;
        double fae = 0.0;
        for (i = 1; i<=n; i++)
		{
            fac = fac + dg[i] * xi[i];
            fae = fae + dg[i] * hdg[i];
        }
        fac = 1.0 / fac;
        double fad = 1.0 / fae;
        for (i = 1; i<=n; i++)
		{
            dg[i] = fac * xi[i] - fad * hdg[i];
        }
        for (i = 1; i<=n; i++)
		{
            for (j = 1; j<=n; j++)
			{
				double aaa = fac*xi[i]*xi[j]-fad*hdg[i]*hdg[j];
				double bbb = fae*dg[i]*dg[j];
				hessin[i][j] = hessin[i][j] + aaa + bbb;
            }
        }
        for (i = 1; i<=n; i++)
		{
            xi[i] = 0.0;
            for (j = 1; j<=n; j++)
			{
                xi[i] = xi[i] - hessin[i][j] * g[j];
            }
        }
    }
    if (its > itmax)
	{
		cout<<" too many iterations in dfpmin"<<endl;
	}
}

⌨️ 快捷键说明

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