下面的代码生成一个图和4PL曲线拟合,但在较低的值下拟合较差。这个错误通常可以通过1/y^2加权来解决,但我不知道在这种情况下如何处理。在fit中添加sigma=1/Y_data**2
只会让情况变得更糟。
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def fourPL(x, A, B, C, D):
return ((A-D) / (1.0 + np.power(x / C, B))) + D
X_data = np.array([700,200,44,11,3,0.7,0.2,0])
Y_data = np.array([600000,140000,30000,8000,2100,800,500,60])
popt, pcov = curve_fit(fourPL, X_data, Y_data)
fig, ax = plt.subplots()
ax.scatter(X_data, Y_data, label='Data')
X_curve = np.linspace(min(X_data[np.nonzero(X_data)]), max(X_data), 5000)
Y_curve = fourPL(X_curve, *popt)
ax.plot(X_curve, Y_curve)
ax.set_xscale('log')
ax.set_yscale('log')
plt.show()
1条答案
按热度按时间pcww981p1#
不加平方反比权重;适合日志域。始终添加边界。在本例中,
curve_fit
不能很好地完成工作;相反考虑minimize
。