使用 scipy.optimize.curve_fit 拟合 python 的曲线

Curve fit in python using scipy.optimize.curve_fit

我正在尝试用 scipy.optimize.curve_fit 曲线拟合我的数据。出于某种原因,它不喜欢我的等式。如果我使用合理的数字绘制方程式,它看起来是正确的。所以我相信我的等式。如果我尝试拟合一个更简单的方程式,它会起作用,所以我总体上相信我的代码。关于为什么它不起作用的任何建议?具体错误 return 是 "Residuals are not finite in the initial point." 将 p0 更改为任何合理的值也无济于事

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np




Y=np.array([0.00001,1.421828697,2.553970883,3.340262844,3.931459808,
4.640896164,5.084293887,5.379892368,5.557251457,5.705050698,
5.823290091,5.911969636,5.971089332,6.059768876,6.118888573,6.178008269,
6.266687814])


X=np.array([0,2500,5000,7500,10000,15000,20000,25000,
30000,35000,40000,45000,50000,55000,60000,65000,70000])

plt.plot(X,Y,'g^')



def func(X,J,g):

    u=6.720*10**-5
    k=1.380*(10**-16)
    T=2
    N=1
    x=g*J*u*(X)/(k*T)
    return N*g*J*(((2*J+1)/(2*J))*(1/(np.tanh((2*J+1)*x/(2*J))))-(1/(2*J))*
    (1/(np.tanh(x/(2*J)))))




plt.figure(1)
popt, pcov = curve_fit(func, X,Y,p0=[3.5,2],bounds=([0.25,0.001],[10,4]))
plt.plot(X, func(X, *popt), 'r--', label='fit-with-bounds')

print(" J is %s " %(popt[0]),"\n","g is %s" %(popt[1]))

您包含的 X 值恰好为零,导致被零除错误。如果我用 0.01 替换零的值,你的代码在我的测试中工作。