我需要使用y = x /(a + x)曲线拟合一组数据,其中a是我需要从此练习中获得的参数。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
x = [1, 2, 7, 10, 20, 70, 200, 1000]
y = [0, 0, 15.3, 34.6, 49.3, 82.6, 100]
def fit(x, a):
return x/(a+x)
par, con = curve_fit(fit, x, y)
plt.plot(x, fit(x, par[0]))
plt.show()
使用这个我得到一些适合的憎恶。甚至不适合。
如果我这样试试:
def fit(x, a, b):
return b*x/(a+x)
我很健康,但没有圆角。它只是直线。我做错了什么?
答案 0 :(得分:3)
请注意,您的x
是list
int
,Python
除以默认的整数除法,这不是您想要的。
因此,一些更改将使其工作,使用第二个函数作为示例,您的第一个函数不适合,因为当x-> inf时它将具有1的限制:
def fit(x, a, b):
return b*x*1./(a+x)
A, B=curve_fit(fit, x, y)[0]
plt.plot(x, fit(x, A, B))
plt.plot(x, y, 'r+')
plt.savefig('temp.png')
这是一组直线,因为您只计算y
个值x
,以获得曲线:将绘图调用更改为plt.plot(np.linspace(0,200,100), fit(np.linspace(0,200,100), A, B))