使用平方根函数拟合问题数据
Problem Data Fitting with Square Root function
我尝试用平方根函数拟合 this experimental data,使用 python 和模块 scipy.optimize。绘图和拟合的代码如下所示。
def curve(x, a, b):
return np.sqrt(a+b*x)
xaxis = np.linspace(30, 1400, 10000)
farbe = ['tab:green', 'tab:orange', 'tab:blue']
fill = ['left', 'top', 'none']
k = 0
for i in data:
popt, pcov = curve_fit(curve, data[i].velo, data[i].avgFR)
plt.errorbar(data[i].velo, data[i].avgFR,data[i].avgFRError, xerr=None,
fmt="o", fillstyle = fill[k],alpha = 0.9,markersize=8,
markeredgewidth=2,
linewidth=3, # width of plot line
elinewidth=2,# width of error bar line
capsize=5, # cap length for error bar
capthick=1, # cap thickness for error bar
label = str(i),
color = farbe[k])
plt.plot(xaxis, curve(xaxis, *popt),color = farbe[k], linewidth = 3)
k += 1
#plt.xscale('log')
plt.legend()
plt.show()
如果我执行脚本,匹配结果看起来像 this。出了什么问题?有没有更好的方法用平方根函数拟合我的数据?
编辑:
我收到以下消息:
__main__:2: RuntimeWarning: invalid value encountered in sqrt
__main__:2: RuntimeWarning: invalid value encountered in sqrt
__main__:2: RuntimeWarning: invalid value encountered in sqrt
发生的情况是:a+b*x < 0
。
您可以设置拟合范围。
您可以检查这种不平等是否发生,以及 return 值是否与您在这种情况下的数据有很大不同。
您可以使用其他拟合程序,也许lmfit
会有所帮助。
我怀疑在给定数据的模型参数 (a,b) 优化过程中,优化器被迫计算平方根下的负数,即。
f = sqrt(a+bx) where a+bx < 0
如果是这种情况,您可以通过将 bounds
参数传递给 curve fit
并强制执行 b>0
(因为 x>0)来解决此问题。
popt, pcov = curve_fit(curve, data[i].velo, data[i].avgFR,bounds=(0, [1, 1]))
这会将问题限制在 0 <= a <= 1, 0 <= b <= 1
。确保为您的问题适当地选择这些界限。祝你好运!
我知道这不是最优雅的解决方案,但至少它有效。我决定计算数据的平方并用线性函数拟合它,而不是拟合 sqrt 数据
the result it self 看起来不错。
我尝试用平方根函数拟合 this experimental data,使用 python 和模块 scipy.optimize。绘图和拟合的代码如下所示。
def curve(x, a, b):
return np.sqrt(a+b*x)
xaxis = np.linspace(30, 1400, 10000)
farbe = ['tab:green', 'tab:orange', 'tab:blue']
fill = ['left', 'top', 'none']
k = 0
for i in data:
popt, pcov = curve_fit(curve, data[i].velo, data[i].avgFR)
plt.errorbar(data[i].velo, data[i].avgFR,data[i].avgFRError, xerr=None,
fmt="o", fillstyle = fill[k],alpha = 0.9,markersize=8,
markeredgewidth=2,
linewidth=3, # width of plot line
elinewidth=2,# width of error bar line
capsize=5, # cap length for error bar
capthick=1, # cap thickness for error bar
label = str(i),
color = farbe[k])
plt.plot(xaxis, curve(xaxis, *popt),color = farbe[k], linewidth = 3)
k += 1
#plt.xscale('log')
plt.legend()
plt.show()
如果我执行脚本,匹配结果看起来像 this。出了什么问题?有没有更好的方法用平方根函数拟合我的数据?
编辑: 我收到以下消息:
__main__:2: RuntimeWarning: invalid value encountered in sqrt
__main__:2: RuntimeWarning: invalid value encountered in sqrt
__main__:2: RuntimeWarning: invalid value encountered in sqrt
发生的情况是:a+b*x < 0
。
您可以设置拟合范围。
您可以检查这种不平等是否发生,以及 return 值是否与您在这种情况下的数据有很大不同。
您可以使用其他拟合程序,也许lmfit
会有所帮助。
我怀疑在给定数据的模型参数 (a,b) 优化过程中,优化器被迫计算平方根下的负数,即。
f = sqrt(a+bx) where a+bx < 0
如果是这种情况,您可以通过将 bounds
参数传递给 curve fit
并强制执行 b>0
(因为 x>0)来解决此问题。
popt, pcov = curve_fit(curve, data[i].velo, data[i].avgFR,bounds=(0, [1, 1]))
这会将问题限制在 0 <= a <= 1, 0 <= b <= 1
。确保为您的问题适当地选择这些界限。祝你好运!
我知道这不是最优雅的解决方案,但至少它有效。我决定计算数据的平方并用线性函数拟合它,而不是拟合 sqrt 数据 the result it self 看起来不错。