指数衰减曲线适合Python.错误:优化警告



我正在尝试为我的数据创建一个曲线。我使用指数函数,因为我需要τ(时间常数(进行进一步分析。我是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的输出对于所有行都是相同的,因为它给出了一条直线。

问题:如何估计参数来为我的数据创建曲线?

这是我得到的输出

为拟合参数设置一些好的起始值。所有参数(ainvtauc(的默认值将为1,但尤其是ainvtau将远离1。然后,优化器算法将无法找到一个好的最小值。

我试过

popt, pcov = curve_fit( curvefit, x, y, p0=[1, 1/250, 4])   #Curvefit

这产生了良好的拟合,以及4335942530.5601090.08655841285513264.238729282912057ainvtauc的值。

(请注意,我将a的起始值设为1,这与实际值仍有很大差距。但如果invtau更接近实际值,则算法也可以很好地适应a。总体而言,为所有参数提供更准确的起始值仍然更好,因为您正在对数据进行建模,所以您可能知道这些值的预期值,并以此为起点。(

最新更新