📄 bend_brent.cc
字号:
/* * bend_brent.cc - Brent's line minimization for bending solver * (taken from Numerical Recipe's brent.c) * * Jun Korenaga, MIT/WHOI * January 1999 */#include "bend.h"#include <cmath>#define ITMAX 100#define CGOLD 0.3819660#define ZEPS 1.0e-10#define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d);#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))double BendingSolver2d::brent(double ax, double bx, double cx, double *xmin, PF1DIM pfunc){ int iter; double a,b,d,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm; double e=0.0; a=(ax < cx ? ax : cx); b=(ax > cx ? ax : cx); x=w=v=bx; fw=fv=fx=(this->*pfunc)(x); for (iter=1;iter<=ITMAX;iter++) { xm=0.5*(a+b); tol2=2.0*(tol1=brent_tol*fabs(x)+ZEPS); if (fabs(x-xm) <= (tol2-0.5*(b-a))) { *xmin=x; return fx; } if (fabs(e) > tol1) { r=(x-w)*(fx-fv); q=(x-v)*(fx-fw); p=(x-v)*q-(x-w)*r; q=2.0*(q-r); if (q > 0.0) p = -p; q=fabs(q); etemp=e; e=d; if (fabs(p) >= fabs(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x)) d=CGOLD*(e=(x >= xm ? a-x : b-x)); else { d=p/q; u=x+d; if (u-a < tol2 || b-u < tol2) d=SIGN(tol1,xm-x); } } else { d=CGOLD*(e=(x >= xm ? a-x : b-x)); } u=(fabs(d) >= tol1 ? x+d : x+SIGN(tol1,d)); fu=(this->*pfunc)(u); if (fu <= fx) { if (u >= x) a=x; else b=x; SHFT(v,w,x,u) SHFT(fv,fw,fx,fu) } else { if (u < x) a=u; else b=u; if (fu <= fw || w == x) { v=w; w=u; fv=fw; fw=fu; } else if (fu <= fv || v == x || v == w) { v=u; fv=fu; } } } error("BendingSolver2d::Too many iterations in brent"); *xmin=x; return fx;}#undef ITMAX#undef CGOLD#undef ZEPS#undef SHFT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -