使用scipy.optimize.curve_fit在python中拟合曲线

时间:2017-12-08 01:42:11

标签: python scipy curve-fitting

我正在尝试使用scipy.optimize.curve_fit曲线拟合我的数据。出于某种原因,它不喜欢我的等式。如果我使用合理的数字绘制方程,它看起来是正确的。所以我相信我的等式。如果我尝试适应更简单的等式,它就可以工作,所以我相信我的代码一般。关于它为什么不起作用的任何建议?具体的错误返回是“残差在初始点不是有限的”。将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]))

1 个答案:

答案 0 :(得分:1)

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