def setUp(self): t = Numeric.arange(self._getn()) y = testfunc(t, self.A, self.lambda_, self.b) sigma = Numeric.ones(self._getn()) * 0.1 self.data = Numeric.array((t, y, sigma), Float) self.sys = multifit_nlin.gsl_multifit_function_fdf( exp_f, exp_df, exp_fdf, self.data, self._getn(), self._getp())
def setup(self): """ Setup for GSL """ data = numx.array([self.data_x, self.data_y, self.data_e]) n = len(self.data_x) p = len(self.initial_params) pinit = numx.array(self.initial_params) self._residual_methods = ['lmsder', 'lmder'] self._function_methods_no_jac = ['nmsimplex', 'nmsimplex2'] self._function_methods_with_jac = [ 'conjugate_pr', 'conjugate_fr', 'vector_bfgs', 'vector_bfgs2', 'steepest_descent' ] # set up the system if self.minimizer in self._residual_methods: mysys = multifit_nlin.gsl_multifit_function_fdf( self._prediction_error, self._jac, self._fdf, data, n, p) self._solver = getattr(multifit_nlin, self.minimizer)(mysys, n, p) elif self.minimizer in self._function_methods_no_jac: mysys = multiminimize.gsl_multimin_function( self._chi_squared, data, p) self._solver = getattr(multiminimize, self.minimizer)(mysys, p) elif self.minimizer in self._function_methods_with_jac: mysys = multiminimize.gsl_multimin_function_fdf( self._chi_squared, self._jac_chi_squared, self._chi_squared_fdf, data, p) self._solver = getattr(multiminimize, self.minimizer)(mysys, p) else: raise UnknownMinimizerError("No {} minimizer for GSL".format( self.minimizer)) # Set up initialization parameters # # These have been chosen to be consistent with the parameters # used in Mantid. initial_steps = 1.0 * numx.array(np.ones(p)) step_size = 0.1 tol = 1e-4 self._gradient_tol = 1e-3 self._abserror = 1e-4 self._relerror = 1e-4 self._maxits = 500 if self.minimizer in self._residual_methods: self._solver.set(pinit) elif self.minimizer in self._function_methods_no_jac: self._solver.set(pinit, initial_steps) else: self._solver.set(pinit, step_size, tol)
def run_fdfsolver(): A = 1. lambda_ = .1 b = .5 n = 40 p = 3 t = numx.arange(n) y = testfunc(t, A, lambda_, b) sigma = numx.ones(n) * 0.1 data = numx.array((t, y, sigma), ) mysys = multifit_nlin.gsl_multifit_function_fdf(exp_f, exp_df, exp_fdf, data, n, p) solver = multifit_nlin.lmsder(mysys, n, p) #solver = multifit_nlin.lmder(mysys, n, p) x = numx.array((1.0, 0.0, 0.0)) solver.set(x) print("# Testing solver ", solver.name()) print("# %5s %9s %9s %9s %10s" % ("iter", "A", "lambda", "b", "|f(x)|")) for iter in range(20): status = solver.iterate() x = solver.getx() dx = solver.getdx() f = solver.getf() J = solver.getJ() tdx = multifit_nlin.gradient(J, f) status = multifit_nlin.test_delta(dx, x, 1e-8, 1e-8) fn = numx.sqrt(numx.sum(f * f)) if status == errno.GSL_SUCCESS: print("# Convereged :") if status == errno.GSL_SUCCESS: break print(" %5d % .7f % .7f % .7f % .7f" % (iter, x[0], x[1], x[2], fn)) else: raise ValueError("Number of Iterations exceeded!") J = solver.getJ() covar = multifit_nlin.covar(solver.getJ(), 0.0) print("# A = % .5f +/- % .5f" % (x[0], covar[0, 0])) print("# lambda = % .5f +/- % .5f" % (x[1], covar[1, 1])) print("# b = % .5f +/- % .5f" % (x[2], covar[2, 2]))