我找不到告诉curve_fit仅使用特定范围内的x值的可能性。我找到了“bounds”参数,但这似乎只适用于我的函数的参数。
如果您有想要适合的数据,例如线性曲线(但仅限于数据的特定区域),则必须创建新列表。特别是因为pyplot.plot需要两个单独的x和y值列表,而对于manuall整理,你需要它们作为(x,y)对。
答案 0 :(得分:1)
最简单的解决方案确实是创建一个新列表,它是原始列表的过滤版本。当然最好使用numpy数组而不是python列表。
因此假设有两个数组x
和y
,其中您只想将x大于某个数字a
的值拟合到函数f
。
您可以过滤并curve_fit
将其作为
x2 = x[x>a]
y2 = y[x>a]
popt2, _ = scipy.optimize.curve_fit(f, x2, y2 )
一个完整的例子:
import numpy as np; np.random.seed(0)
import matplotlib.pyplot as plt
import scipy.optimize
x = np.linspace(-1,3)
y = x**2 + np.random.normal(size=len(x))
f = lambda x, a,b : a* x +b
popt, _ = scipy.optimize.curve_fit(f, x,y, p0=(1,0))
x2 = x[x>0.7]
y2 = y[x>0.7]
popt2, _ = scipy.optimize.curve_fit(f, x2,y2, p0=(1,0))
plt.plot(x,y, marker="o", ls="", ms=4, label="all data")
plt.plot(x, f(x, *popt), color="moccasin", label="fit all data")
plt.plot(x2, f(x2, *popt2), label="fit filtered data")
plt.legend()
plt.show()
最后,您还可以使用逻辑运算符连接多个条件,例如x[(x>0.7) & (x<2.5)]
。