Solve for the parameters, using an initial guess.

        This uses the Levenberg-Marquardt optimizer described in
        :mod:`pwkit.lmmin`.

        Returns *self*.

def solve(self, guess):
        """Solve for the parameters, using an initial guess.

        This uses the Levenberg-Marquardt optimizer described in
        :mod:`pwkit.lmmin`.

        Returns *self*.

        """
        guess = np.array(guess, dtype=np.float, ndmin=1)
        f = self.func
        args = self._args

        def lmfunc(params, vec):
            vec[:] = f(params, *args).flatten()

        self.lm_prob.set_residual_func(self.data.flatten(),
                                       self.invsigma.flatten(),
                                       lmfunc, None)
        self.lm_soln = soln = self.lm_prob.solve(guess)

        self.params = soln.params
        self.puncerts = soln.perror
        self.covar = soln.covar
        self.mfunc = self.make_frozen_func(soln.params)

        # fvec = resids * invsigma = (data - mdata) * invsigma
        self.resids = soln.fvec.reshape(self.data.shape) / self.invsigma
        self.mdata = self.data - self.resids

        # lm_soln.fnorm can be unreliable ("max(fnorm, fnorm1)" branch)
        self.chisq = (self.lm_soln.fvec**2).sum()
        if soln.ndof > 0:
            self.rchisq = self.chisq / soln.ndof

        return self