我想把它当作y = ax。但是,代码不起作用。任何人都可以帮助我吗?
def func():
return a * x
F1 = [0.55, 0.45, 0.50, 0.65, 0.75, 0.80]
r1 = [18.2, 18.4, 18.8, 19.5, 20.0, 20.2]
plt.plot(F1, r1)
popt = curve_fit(func, r1, F) # I supose it only returns one value
plt.plot(r1, popt * r1, 'g--')
错误是:
ValueError: Unable to determine number of fit parameters.
答案 0 :(得分:0)
像这样的东西。运行代码以查看curve_fit的结果,并仔细遵循逻辑。
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit as curve_fit
def f(x,a):
return a*x
F1 = [ 0.55, 0.45, 0.50, 0.65, 0.75, 0.80 ]
r1 = [ 18.2, 18.4, 18.8, 19.5, 20.0, 20.2 ]
result = curve_fit(f, r1, F1)
print (result)
print ( 'F1 = %s * r1' % result[0][0] )
plt.plot(r1, F1, 'b.')
p = [ result[0][0] * _ for _ in r1 ]
plt.plot(r1, p, 'g--')
plt.show()
答案 1 :(得分:0)
您的代码的主要问题是您的拟合功能没有输入。 func
不知道a
和x
是什么,因此无法返回a*x
。
此外,curve_fit
不仅返回popt,还返回pcov
,因此您必须在返回的值中捕获
以下是您的代码的固定版本:
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# func needs x and a as inputs
def func(x, a):
return a*x
F1=[0.55,0.45,0.50,0.65,0.75,0.80]
r1=[18.2,18.4,18.8,19.5,20.0,20.2]
plt.plot(r1,F1, 'bo')
popt, pcov = curve_fit(func, r1, F1)
plt.plot(r1,popt*r1,'g--')
plt.show()
注意:适合度不高的原因是因为你的线必须通过原点。你可以使用a*x+b
更好地适应,但这不是你问的怎么做。