📄 bend_mnbrak.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 + -