用Scipy在Python中进行曲线拟合

用Scipy在Python中进行曲线拟合,python,data-modeling,curve-fitting,scipy-optimize,Python,Data Modeling,Curve Fitting,Scipy Optimize,我只是想说明一下,我是一个非常初级的python程序员。我的大部分知识是我在物理实验室进行数据分析/绘图时使用/学到的 我基本上收集了电容作为温度函数的数据,我应该用一个函数来拟合我绘制的数据,以找到它的最佳参数 [CmaxOpt KOpt TCOpt gammaOpt] = [nan nan nan nan] 请注意,我输入了随机数作为初始值,然后运行代码。我的POpt函数为我提供了新的最佳参数,我用初始随机数替换了这些参数 fig, plot = plt.subplots(figsize=

我只是想说明一下,我是一个非常初级的python程序员。我的大部分知识是我在物理实验室进行数据分析/绘图时使用/学到的

我基本上收集了电容作为温度函数的数据,我应该用一个函数来拟合我绘制的数据,以找到它的最佳参数

[CmaxOpt KOpt TCOpt gammaOpt] = [nan nan nan nan]
请注意,我输入了随机数作为初始值,然后运行代码。我的
POpt
函数为我提供了新的最佳参数,我用初始随机数替换了这些参数

fig, plot = plt.subplots(figsize=(40,40))

def cap(T, Cmax, K, TC, gamma): #this is the function I am fitting to my data
    return Cmax/(1+K*(T-TC)**gamma)
CmaxInit = 5.16061523 #these are the optimal parameters it gave me
KInit = 3.87292298e-05
TCInit = 3.00020150e+01
gammaInit =  2.74812849
fmodel = np.linspace(0, 100, 1000)
plt.plot(fmodel, cap(fmodel, CmaxInit, KInit, TCInit, gammaInit), linewidth=8, label='Fitted model')

plot.errorbar(temperature, capacitance, linewidth=8, label='Data Points') #this is my data of temperature vs capacitance

pOpt, pCov = curve_fit(cap, temperature, capacitance, p0=[CmaxInit, KInit, TCInit, gammaInit], absolute_sigma=True) #this is what I use to curve-fit/get my optimal parameters
print("[CmaxOpt KOpt TCOpt gammaOpt] =", pOpt)
print()
print("pCov =") #This is a co-variant matrix function that calculates my error values
print(pCov)

plt.xticks(fontsize=60)
plt.yticks(fontsize=60)
plt.grid()
plt.legend(fontsize=80)
plt.show()
但是,在绘制拟合模型时,它会给出:

电容与温度的关系

POpt
函数确实在某种程度上符合一般的外观,但它显然有点不合适。我不明白为什么,但我的猜测是我试图优化的参数数量

编辑:将初始参数更改为

CmaxInit = 6 
KInit = 0.01
TCInit = 50
gammaInit =  2
产生了一个更精确的

但现在它在计算最优参数时产生了一个误差

[CmaxOpt KOpt TCOpt gammaOpt] = [nan nan nan nan]
编辑2:在删减了我的数据后,我现在正在尝试适应

然而,我仍然得到

[CmaxOpt KOpt TCOpt gammaOpt] = [nan nan nan nan]

指数函数似乎比我假设的模型更适合这个方程。也许这就是我没有得到最佳参数的原因?

拟合函数存在一些数值问题:

  • 对于算法来说,指数(gamma)似乎太难了 作为拟合参数。这似乎也适用于以下情况:
    exp(伽马)
  • 我将拟合函数替换为
    Cmax*np.exp(-K*(T-TC)**2)+c
    。因此,它取决于x范围 (数据窗口)拟合程度如何
  • 出于数字原因,最好有一个截距
    c
  • 通过变换将数据带到拟合函数的“容易区域”通常是一个好主意,这样峰值大约为零,x范围大约为[-5..+5]。拟合后,将结果变换回原始数据范围
  • 拟合(数据)的日志(数据)有时也会有所帮助

。。


拟合函数存在一些数值问题:

  • 对于算法来说,指数(gamma)似乎太难了 作为拟合参数。这似乎也适用于以下情况:
    exp(伽马)
  • 我将拟合函数替换为
    Cmax*np.exp(-K*(T-TC)**2)+c
    。因此,它取决于x范围 (数据窗口)拟合程度如何
  • 出于数字原因,最好有一个截距
    c
  • 通过变换将数据带到拟合函数的“容易区域”通常是一个好主意,这样峰值大约为零,x范围大约为[-5..+5]。拟合后,将结果变换回原始数据范围
  • 拟合(数据)的日志(数据)有时也会有所帮助

。。


看起来您的曲线拟合为您的参数找到了一个局部最优解决方案,无法逃避。尝试为您的参数提供更好的算法起始值。请参阅有关如何做到这一点的文档,我正在考虑是什么导致了这种限制。我以前做过这个曲线拟合,虽然有指数衰减,所以我想程序可以很容易地优化它。那么,您是否建议使用试错初始值,然后对其进行优化?因为这看起来像是一堆乱七八糟的东西。如果你安装了不同类型的函数,优化环境可能会完全不同,因此这些方法有时可能会失败。您的数据看起来您的拟合参数应该接近:
CmaxInit=6;基尼特=0.01;γ=2;TCInit=50
尝试将这些作为起点,而不是使用随机点,并报告结果。您的gamma参数似乎很有用,但实际上似乎确实有用,但现在它无法优化我的值。我在上面做了一个编辑。这是我的实验脚本上给出的等式。事实上,我现在注意到,他们确实说要绘制T>TC(TC是“居里温度”,如果你想知道的话),但这种情况不应该改变我的图形的形状,就在我开始绘制的地方。看起来你的曲线拟合找到了参数的局部最优解,无法逃脱。尝试为您的参数提供更好的算法起始值。请参阅有关如何做到这一点的文档,我正在考虑是什么导致了这种限制。我以前做过这个曲线拟合,虽然有指数衰减,所以我想程序可以很容易地优化它。那么,您是否建议使用试错初始值,然后对其进行优化?因为这看起来像是一堆乱七八糟的东西。如果你安装了不同类型的函数,优化环境可能会完全不同,因此这些方法有时可能会失败。您的数据看起来您的拟合参数应该接近:
CmaxInit=6;基尼特=0.01;γ=2;TCInit=50
尝试将这些作为起点,而不是使用随机点,并报告结果。您的gamma参数似乎很有用,但实际上似乎确实有用,但现在它无法优化我的值。我在上面做了一个编辑。这是我的实验脚本上给出的等式。事实上,我现在注意到,他们确实说要绘制T>TC(TC是“居里温度”,如果你想知道的话),但这种情况不应该改变我的图形的形状,就在我开始绘制它的地方。我意识到我必须切掉我的数据,所以我的函数是从
T>TC
(第3图)开始建模的,现在这个错误消失了。我不明白为什么我现在在试图获得最佳参数时会出错。它以前工作得很好,现在对于我输入的任何初始值,我都会得到它们的
nan
。值得一提的是,我的数据中存在微妙之处。这是很难注意到的,因为这个数据收集运行了大约30分钟,但有起伏的p