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

📄 amebsa.c

📁 适合大型数值计算代码 现在网络上已经找不到了 购买需要20$
💻 C
字号:
#include <math.h>#define NRANSI#include "nrutil.h"#define GET_PSUM \					for (n=1;n<=ndim;n++) {\					for (sum=0.0,m=1;m<=mpts;m++) sum += p[m][n];\					psum[n]=sum;}extern long idum;float tt;void amebsa(float **p, float y[], int ndim, float pb[], float *yb, float ftol,	float (*funk)(float []), int *iter, float temptr){	float amotsa(float **p, float y[], float psum[], int ndim, float pb[],		float *yb, float (*funk)(float []), int ihi, float *yhi, float fac);	float ran1(long *idum);	int i,ihi,ilo,j,m,n,mpts=ndim+1;	float rtol,sum,swap,yhi,ylo,ynhi,ysave,yt,ytry,*psum;	psum=vector(1,ndim);	tt = -temptr;	GET_PSUM	for (;;) {		ilo=1;		ihi=2;		ynhi=ylo=y[1]+tt*log(ran1(&idum));		yhi=y[2]+tt*log(ran1(&idum));		if (ylo > yhi) {			ihi=1;			ilo=2;			ynhi=yhi;			yhi=ylo;			ylo=ynhi;		}		for (i=3;i<=mpts;i++) {			yt=y[i]+tt*log(ran1(&idum));			if (yt <= ylo) {				ilo=i;				ylo=yt;			}			if (yt > yhi) {				ynhi=yhi;				ihi=i;				yhi=yt;			} else if (yt > ynhi) {				ynhi=yt;			}		}		rtol=2.0*fabs(yhi-ylo)/(fabs(yhi)+fabs(ylo));		if (rtol < ftol || *iter < 0) {			swap=y[1];			y[1]=y[ilo];			y[ilo]=swap;			for (n=1;n<=ndim;n++) {				swap=p[1][n];				p[1][n]=p[ilo][n];				p[ilo][n]=swap;			}			break;		}		*iter -= 2;		ytry=amotsa(p,y,psum,ndim,pb,yb,funk,ihi,&yhi,-1.0);		if (ytry <= ylo) {			ytry=amotsa(p,y,psum,ndim,pb,yb,funk,ihi,&yhi,2.0);		} else if (ytry >= ynhi) {			ysave=yhi;			ytry=amotsa(p,y,psum,ndim,pb,yb,funk,ihi,&yhi,0.5);			if (ytry >= ysave) {				for (i=1;i<=mpts;i++) {					if (i != ilo) {						for (j=1;j<=ndim;j++) {							psum[j]=0.5*(p[i][j]+p[ilo][j]);							p[i][j]=psum[j];						}						y[i]=(*funk)(psum);					}				}				*iter -= ndim;				GET_PSUM			}		} else ++(*iter);	}	free_vector(psum,1,ndim);}#undef GET_PSUM#undef NRANSI
#include <math.h>
#define NRANSI
#include "nrutil.h"

extern long idum;
extern float tt;

float amotsa(float **p, float y[], float psum[], int ndim, float pb[],
	float *yb, float (*funk)(float []), int ihi, float *yhi, float fac)
{
	float ran1(long *idum);
	int j;
	float fac1,fac2,yflu,ytry,*ptry;

	ptry=vector(1,ndim);
	fac1=(1.0-fac)/ndim;
	fac2=fac1-fac;
	for (j=1;j<=ndim;j++)
		ptry[j]=psum[j]*fac1-p[ihi][j]*fac2;
	ytry=(*funk)(ptry);
	if (ytry <= *yb) {
		for (j=1;j<=ndim;j++) pb[j]=ptry[j];
		*yb=ytry;
	}
	yflu=ytry-tt*log(ran1(&idum));
	if (yflu < *yhi) {
		y[ihi]=ytry;
		*yhi=yflu;
		for (j=1;j<=ndim;j++) {
			psum[j] += ptry[j]-p[ihi][j];
			p[ihi][j]=ptry[j];
		}
	}
	free_vector(ptry,1,ndim);
	return yflu;
}
#undef NRANSI

⌨️ 快捷键说明

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