我正在尝试为我的数据创建一个曲线。我使用指数函数,因为我需要τ(时间常数(进行进一步分析。我是Python的新手,第一次尝试scipy curvefit函数。然而,我只得到了一条直线,代码给出了OptimizeWarning: Covariance of the parameters could not be estimated warnings.warn
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
x = np. array( [ 246, 248, 250, 252, 254,256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282,284])
y = np.array( [ 6.38954156, 6.32462716 ,6.21843495,5.96263661, 5.66970206, 5.37948873, 5.06358679 ,4.83386528 ,4.64262524, 4.5091623, 4.38658648, 4.46124359, 4.52878251, 4.56084217 ,4.47660524,4.5323503, 4.46626654, 4.58289275, 4.42962004, 4.29622583])
def curvefit( x, a, invtau,c):
return a * np.exp(-x*invtau)+c
popt, pcov = curve_fit( curvefit, x, y) #Curvefit
a, invtau, c = popt #summarize the parameter values
x_new = np.arange(min(x), max(x),1)
y_new = curvefit (x_new, a, invtau, c)
plt.figure()
plt.plot(x, y, label='data')
plt.plot (x_new, y_new, '--', label='fit')
plt.legend (loc='upper right')
我看到y_new
的输出对于所有行都是相同的,因为它给出了一条直线。
问题:如何估计参数来为我的数据创建曲线?
这是我得到的输出
为拟合参数设置一些好的起始值。所有参数(a
、invtau
和c
(的默认值将为1,但尤其是a
和invtau
将远离1。然后,优化器算法将无法找到一个好的最小值。
我试过
popt, pcov = curve_fit( curvefit, x, y, p0=[1, 1/250, 4]) #Curvefit
这产生了良好的拟合,以及4335942530.560109
、0.0865584128551326
和4.238729282912057
的a
、invtau
和c
的值。
(请注意,我将a
的起始值设为1
,这与实际值仍有很大差距。但如果invtau
更接近实际值,则算法也可以很好地适应a
。总体而言,为所有参数提供更准确的起始值仍然更好,因为您正在对数据进行建模,所以您可能知道这些值的预期值,并以此为起点。(