예제 #1
0
 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())
예제 #2
0
    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)
예제 #3
0
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]))