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

📄 frprmn.cpp

📁 实现共轭梯度法的实例
💻 CPP
字号:
#include "stdafx.h"
#include <math.h>
#include <stdio.h>
#include "linmin.h"

#define ITMAX 1000
#define EPS 1.0e-10

void frprmn(double p[],int n,\
			double ftol,int *iter,double *fret,\
			double (*func)(double[]),\
			void (*dfunc)(double[],double[]))
{
	int j,its;
	double gg,gam,fp,dgg;
	double *g,*h,*xi;

	g=new double[n+1];
	h=new double[n+1];
	xi=new double[n+1];
	fp=(*func)(p);
	(*dfunc)(p,xi);
	for (j=1;j<=n;j++) {
		g[j] = -xi[j];
		xi[j]=h[j]=g[j];
	}
	for (its=1;its<=ITMAX;its++) {
		*iter=its;
		linmin(p,xi,n,fret,func);
		if (2.0*fabs(*fret-fp) <= ftol*(fabs(*fret)+fabs(fp)+EPS)) {
			delete xi,g,h;
			return;
		}
		fp=(*func)(p);
		(*dfunc)(p,xi);
		dgg=gg=0.0;
		for (j=1;j<=n;j++) {
			gg += g[j]*g[j];
/*		  dgg += xi[j]*xi[j];	*/
			dgg += (xi[j]+g[j])*xi[j];
		}
		if (gg == 0.0) {
			delete xi,h,g;
			return;
		}
		gam=dgg/gg;
		for (j=1;j<=n;j++) {
			g[j] = -xi[j];
			xi[j]=h[j]=g[j]+gam*h[j];
		}
	}
	printf("Too many iterations in FRPRMN");
}

#undef ITMAX
#undef EPS

⌨️ 快捷键说明

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