--- trunk/OOPSE/libmdtools/NLModel0.cpp 2004/01/28 22:44:44 996 +++ trunk/OOPSE/libmdtools/NLModel0.cpp 2004/01/30 21:47:22 1000 @@ -1,6 +1,5 @@ #include "NLModel.hpp" - /** * calculate gradient using backward finite difference * df(Xk)/dXi = (f(Xk) - f(Xk - h*ei)) /h @@ -34,7 +33,6 @@ vector NLModel0::BackwardGrad(const vector NLModel0::CentralGrad(const vector& h){ +SymMatrix NLModel0::FiniteHessian(vector& x, double fx, vector& h){ SymMatrix H(ndim); + vector tempX; + vector fi(ndim); + vector hi; + double fij; + + tempX = x; + //calculate f(X+ h*ei) for(int i = 0; i < ndim; i++){ +#ifndef IS_MPI + + hi[i] = copysign(h[i],tempX[i]); + + tempX[i] += hi[i]; + + fi[i] = calcF(tempX); + + tempX[i] -= hi; + +#else + + if(procMappingArray[i] == myRank){ + + hi[i] = copysign(h[i],tempX[i]); + + tempX[i] += hi[i]; + } + + fi[i] = calcF(tempX); + + if(procMappingArray[i] == myRank){ + tempX[i] -= hi[i]; + } + +#endif + } + +#ifndef IS_MPI + + for(int i = 0; i < ndim; i++){ + + tempX[i] += hi[i] * 2; + + fii = calcF(tempX); + + H(i,j) = ((fx - fi[i]) + (fii - fi[i])) / (hi[i]*hi[i]); + + tempX[i] -= hi[i]; + for(int j = i + 1; j < ndim; j++){ + tempX[j] += hi[j]; + + fij = calcF(tempX); + + H(i,j) = ((f - fi[i]) + (fij - fi[j])) / (hi[i]*hi[j]); + + tempX[j] -= hi[j]; } + + tempX[i] -= hi[i]; } - + +#else + for(int i = 0; i < ndim; i++){ + + if(procMappingArray[i] == myRank){ + tempX[i] += hi[i] * 2; + } + + fii = calcF(tempX); + + H(i,j) = ((fx - fi[i]) + (fii - fi[i])) / (hi[i]*hi[i]); + + if(procMappingArray[i] == myRank){ + tempX[i] -= hi[i]; + } + + for(int j = i + 1; j < ndim; j++){ + + if(procMappingArray[j] == myRank){ + tempX[j] += hi[j]; + } + + fij = calcF(tempX); + H(i,j) = ((f - fi[i]) + (fij - fi[j])) / (hi[i]*hi[j]); + + if(procMappingArray[j] == myRank){ + tempX[j] -= hi[j]; + } + + } + + if(procMappingArray[i] == myRank){ + tempX[i] -= hi[i]; + } + + } + +#endif + + return H; }