def FDCheckG(self): """ Finite-difference checker for the objective function gradient. For each element in the gradient, use a five-point finite difference stencil to compute a finite-difference derivative, and compare it to the analytic result. """ Adata = self.Objective.Full(self.mvals0,Order=1)['G'] Fdata = np.zeros(self.FF.np,dtype=float) printcool("Checking first derivatives by finite difference!\n%-8s%-20s%13s%13s%13s%13s" \ % ("Index", "Parameter ID","Analytic","Numerical","Difference","Fractional"),bold=1,color=5) for i in range(self.FF.np): Fdata[i] = f1d7p(fdwrap(self.Objective.Full,self.mvals0,i,'X',Order=0),self.h) Denom = max(abs(Adata[i]),abs(Fdata[i])) Denom = Denom > 1e-8 and Denom or 1e-8 D = Adata[i] - Fdata[i] Q = (Adata[i] - Fdata[i])/Denom cD = abs(D) > 0.5 and "\x1b[1;91m" or (abs(D) > 1e-2 and "\x1b[91m" or (abs(D) > 1e-5 and "\x1b[93m" or "\x1b[92m")) cQ = abs(Q) > 0.5 and "\x1b[1;91m" or (abs(Q) > 1e-2 and "\x1b[91m" or (abs(Q) > 1e-5 and "\x1b[93m" or "\x1b[92m")) print "\r %-8i%-20s% 13.4e% 13.4e%s% 13.4e%s% 13.4e\x1b[0m" \ % (i, self.FF.plist[i][:20], Adata[i], Fdata[i], cD, D, cQ, Q)
def func1(arg): mvals = list(mvals0) mvals[pidxj] += arg return f1d5p(fdwrap(self.Objective.Full,mvals,pidxi,'X',Order=0),self.h)