Of course you can use lmfit if parameters can be both positive/negative; that’s the case in 99.999% of the cases. What you need to figure out is why your function gives values that are Infs and/or NaNs and make sure that these don’t happen. What I meant is that sometimes restricting fitting parameters to meaningful values can help with that - this is described in the FAQ entry I linked in my previous answer.
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/var/folders/qn/5bwbztqn3kqd3sd888hb_llm0000gn/T/ipykernel_68423/3139038664.py in <module>
----> 1 bFittedSpectrum = bFitModel.fit(np.array(signal), energy = energy, Ei = Ei, T = T, CF = Pr, res = 30, weights = error)
~/Library/Python/3.9/lib/python/site-packages/lmfit-1.0.2.post73+g1925ecd-py3.9.egg/lmfit/model.py in fit(self, data, params, weights, method, iter_cb, scale_covar, verbose, fit_kws, nan_policy, calc_covar, max_nfev, **kwargs)
1036 nan_policy=self.nan_policy, calc_covar=calc_covar,
1037 max_nfev=max_nfev, **fit_kws)
-> 1038 output.fit(data=data, weights=weights)
1039 output.components = self.components
1040 return output
~/Library/Python/3.9/lib/python/site-packages/lmfit-1.0.2.post73+g1925ecd-py3.9.egg/lmfit/model.py in fit(self, data, params, weights, method, nan_policy, **kwargs)
1393 self.userargs = (self.data, self.weights)
1394 self.userkws.update(kwargs)
-> 1395 self.init_fit = self.model.eval(params=self.params, **self.userkws)
1396 _ret = self.minimize(method=self.method)
1397
~/Library/Python/3.9/lib/python/site-packages/lmfit-1.0.2.post73+g1925ecd-py3.9.egg/lmfit/model.py in eval(self, params, **kwargs)
854
855 """
--> 856 return self.func(**self.make_funcargs(params, kwargs))
857
858 @property
/var/folders/qn/5bwbztqn3kqd3sd888hb_llm0000gn/T/ipykernel_68423/1566982752.py in bFit(CF, energy, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, Ei, T, res)
1 def bFit (CF, energy, b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15, Ei, T, res):
----> 2 CF.newCoeff([b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15])
3 CalculatedSpectrum = CF.neutronSpectrum(energy, Temp=T, Ei=Ei, ResFunc = lambda x: res)
4 return CalculatedSpectrum
/private/tmp/1/PyCrystalField.py in newCoeff(self, newcoeff)
1483 self.B = np.array(newcoeff)
1484 newH = np.sum([a*b for a,b in zip(self.O, newcoeff)], axis=0)
-> 1485 self.diagonalize(newH)
1486
1487
/private/tmp/1/PyCrystalField.py in diagonalize(self, CEF_Hamiltonian)
1494
1495 bands = self._findbands(CEF_Hamiltonian + self.H_SOC.O)
-> 1496 diagonalH = LA.eig_banded(bands, lower=True)
1497
1498 #self.eigenvaluesNoNorm = diagonalH[0]
/opt/local/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/scipy/linalg/decomp.py in eig_banded(a_band, lower, eigvals_only, overwrite_a_band, select, select_range, max_ev, check_finite)
755 a1 = array(a_band)
756 if issubclass(a1.dtype.type, inexact) and not isfinite(a1).all():
--> 757 raise ValueError("array must not contain infs or NaNs")
758 overwrite_a_band = 1
759