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

📄 bend_mnbrak.cc

📁 二维射线追踪地震层析成像
💻 CC
字号:
/* * bend_mnbrak.cc - initial bracket search for bending solver *                  (taken from Numerical Recipe's mnbrak.cc) * * Jun Korenaga, MIT/WHOI * January 1999 */#include "bend.h"#include <math.h>#define GOLD 1.618034#define GLIMIT 100.0#define TINY 1.0e-20#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))static double maxarg1,maxarg2;#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\        (maxarg1) : (maxarg2))void BendingSolver2d::mnbrak(double *ax, double *bx, double *cx,			     double *fa, double *fb, double *fc,			     PF1DIM pfunc){	double ulim,u,r,q,fu,dum;		*fa=(this->*pfunc)(*ax);	*fb=(this->*pfunc)(*bx);	if (*fb > *fa) {		SHFT(dum,*ax,*bx,dum)		SHFT(dum,*fb,*fa,dum)	}	*cx=(*bx)+GOLD*(*bx-*ax);	*fc=(this->*pfunc)(*cx);	while (*fb > *fc) {		r=(*bx-*ax)*(*fb-*fc);		q=(*bx-*cx)*(*fb-*fa);		u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/			(2.0*SIGN(FMAX(fabs(q-r),TINY),q-r));		ulim=(*bx)+GLIMIT*(*cx-*bx);		if ((*bx-u)*(u-*cx) > 0.0) {			fu=(this->*pfunc)(u);			if (fu < *fc) {				*ax=(*bx);				*bx=u;				*fa=(*fb);				*fb=fu;				return;			} else if (fu > *fb) {				*cx=u;				*fc=fu;				return;			}			u=(*cx)+GOLD*(*cx-*bx);			fu=(this->*pfunc)(u);		} else if ((*cx-u)*(u-ulim) > 0.0) {			fu=(this->*pfunc)(u);			if (fu < *fc) {				SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx))				SHFT(*fb,*fc,fu,(this->*pfunc)(u))			}		} else if ((u-ulim)*(ulim-*cx) >= 0.0) {			u=ulim;			fu=(this->*pfunc)(u);		} else {			u=(*cx)+GOLD*(*cx-*bx);			fu=(this->*pfunc)(u);		}		SHFT(*ax,*bx,*cx,u)		SHFT(*fa,*fb,*fc,fu)	}}#undef GOLD#undef GLIMIT#undef TINY#undef SHFT

⌨️ 快捷键说明

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