docs: 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