让我以此为开端,说我是python曲线拟合的新手,所以我可能做的事情很明显而且显然是错误的。
我有一个实验性的“原始”数据集,由温度(x)与信号(y)组成。
我正在尝试使用 scipy.curve_fit 将波兹曼方程拟合到该数据。我的脚本没有引发任何错误,但是当我将其绘制在matplotlib中时,当我的实验数据域仅包含〜308-> 400之间的值时,它将利用0到600之间的x值。不仅如此,它还适合数据>似乎完全消失了(偏移和倾斜),但是它的导数看起来与原始数据相同……让我觉得在某处应用了某种变换。
#Get the data
file = 'Data/my_excel_file.xlsx'
df = pd.read_excel(file, sheet_name='simplified')
#Define the Boltzmann function for fitting
def BoltzmannFitEquation(T, Fmin, Fmax, Tm, breadth):
return Fmin + ((Fmax - Fmin) / (1 + np.exp((Tm - (T/breadth)))))
#Grabbing the y-values (signal) from the dataframe
signal = df['signal'].tolist()
#Convert my temps from the dataframe from C to K.
for temp in temps_c:
temps_k.append(float(temp) + 273)
#Now lets fit a Boltzmann equation to the smoothed data
p0 = [0.9, 1.2, 347, 1] #initial predictions
c, cov = curve_fit(BoltzmannFitEquation, temps_k, signal, p0)
yp = BoltzmannFitEquation(temps_k, c[0], c[1], c[2], c[3]) #Plot of the prediction with the optimized coefficients
plt.plot(yp)
为了简化操作,我已经排除了很多代码,但是请告诉我您是否希望看到一些特定的内容,这可以帮助解决为什么我看到此内容。
蓝线是原始数据和导数,橙线是拟合曲线和导数。
请注意,拐点在顶部图表上如何不匹配,但在底部图表上却匹配。为什么曲线拟合如此糟糕?为什么还要包含域外的值?
答案 0 :(得分:0)
当我尝试以下代码时,我看起来很合适。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
file = 'Data/my_excel_file.xlsx'
#file = '/home/zunzun/temp/temp.xlsx'
df = pd.read_excel(file, sheet_name='simplified')
#Define the Boltzmann function for fitting
def BoltzmannFitEquation(T, Fmin, Fmax, Tm, breadth):
return Fmin + ((Fmax - Fmin) / (1 + np.exp((Tm - (T/breadth)))))
#Grabbing the data from the dataframe
signal = np.array(df['signal'].tolist())
temps_c = np.array(df['temperature'].tolist())
#Convert my temps from the dataframe from C to K.
temps_k = temps_c + 273.0
#Now lets fit a Boltzmann equation to the smoothed data
p0 = [0.9, 1.2, 347, 1] #initial predictions
c, cov = curve_fit(BoltzmannFitEquation, temps_k, signal, p0)
yp = BoltzmannFitEquation(temps_k, c[0], c[1], c[2], c[3]) #Plot of the prediction with the optimized coefficients
print("Fitted paraneters:", c)
plt.plot(temps_k, signal) # data
plt.plot(temps_k, yp) # fit
plt.show()