在Python中适合y = ax

时间:2016-11-16 15:48:02

标签: python matplotlib scipy

我想把它当作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.

2 个答案:

答案 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不知道ax是什么,因此无法返回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()

enter image description here

注意:适合度不高的原因是因为你的线必须通过原点。你可以使用a*x+b更好地适应,但这不是你问的怎么做。