我正在尝试将我定义的函数曲线拟合到一个数据集。我使用Pandas定义了我的函数,它打印了值。但是当我尝试使用Curve_fit优化它时,它给了我一个错误,“列表索引超出范围”。我不明白为什么?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ydata=np.array([1.2,1.21,1.2,1.19,1.21,1.22,1.8,2.47,2.49,2.49,2.5])
xdata = np.linspace(0,1,num=11).round(2)
def halfTrapz(x, m, a, tau1, tau2):
y = np.zeros(len(x))
dfy = pd.DataFrame(list(zip(x,y)),columns=['x','y'])
ta1=dfy.index[dfy['x']==tau1].tolist()
ta2=dfy.index[dfy['x']==tau2].tolist()
# ta1=list(np.array(ta1)+1)
# ta2=list(np.array(ta2)+1) #In order to consider ta2 in [:ta2]
dfy.iloc[:ta1[0],1] = a
b = a - m*dfy.iloc[ta1[0],0]
dfy.iloc[ta1[0]:ta2[0],1] = m * dfy.iloc[ta1[0]:ta2[0],0] + b
dfy.iloc[ta2[0]:,1] = m * dfy.iloc[ta2[0],0] + b
return dfy['y']
z=(halfTrapz(xdata, 5,1.2,0.5,0.7))
plt.plot(xdata,z,'g--')
plt.plot(xdata,ydata)
第一部分(上面)对一些给定的值工作得很好,它可以绘制函数。但是,当我尝试使用curve_fit这个函数的第二部分时,它给了我错误。
from scipy.optimize import curve_fit
popt, pcov = curve_fit(halfTrapz, xdata, ydata)
print(popt)
print(pcov)
plt.plot(xdata, func(xdata, *popt), 'r-')
1条答案
按热度按时间ohfgkhjo1#
“list index out of range”(列表索引超出范围)消息的含义与其所述完全相同:您正试图访问一个不存在的列表元素。在这种情况下,这是因为
ta1
可以是一个空列表,而您正试图访问此处的第0个元素dfy.iloc[:ta1[0],1] = a
现在,为什么
ta1
会是空的呢?有问题的语句是dfy['x']==tau1
。您在这里是基于比较进行过滤的,但是tau1
可以是float
,因此您将对浮点比较感到头疼。例如,1.0==1.0000001
计算为False
。我不假装理解这里的数学,但是如果你 * 真的 * 想过滤一个浮点字段,我建议使用类似
np.isclose
的东西。