curve_fit不能做线性拟合

时间:2017-11-14 06:22:31

标签: python-2.7 curve-fitting curve

我有一个非常简单的数据,curve_fit不能给我一个线性拟合。 这是代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
#################
def linear(x,a,b):
    return a*x+b
#################
N=[200,250,300,400,500,600,700]
sp=[17,18,20,23,26,28,31]
tp=[19,21.5,23.5,27,30,33,36]
#################
error=[0]*len(N)
for i in range(len(N)):
      error[i]=abs(sp[i]-tp[i])/(1.0*sp[i])*100
a,b=curve_fit(linear,N,error)
print a
plt.figure()
plt.plot(N,error,'r-o',label=r'${\rm relative\ error}$')
plt.plot(N,linear(N,*a))
plt.grid()
plt.savefig('error.pdf')
plt.show()

我得到的是没有意义的:   none sense result! 发生了什么

1 个答案:

答案 0 :(得分:1)

您对linear的来电可能不是最佳,因为N是一个列表,a大约为零。如果你打电话给plt.plot( N, linear( np.array( N ),*a ) ),它应该有效。 此外,我强烈建议将变量重命名为curve_fit,返回最佳值数组和协方差矩阵。因此,bestFit, pcov = curve_fit( linear, N, error )然后plt.plot( N, linear( np.array( N ), *bestFit ) )可能更好,避免混淆。 a, b = ( curve_fit( linear, N, error) )[0]可能会有效,但您必须通过plt.plot( N, linear( np.array( N ), a, b ) )

最终,我会这样做:

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
#################
def linear( x, a, b):
    return a * x + b
#################
N =  np.array([ 200, 250, 300, 400, 500, 600, 700 ], np.float )
sp = np.array([ 17, 18, 20, 23, 26, 28, 31 ], np.float )
tp = np.array([ 19, 21.5, 23.5, 27, 30, 33, 36 ], np.float )
#################
error = np.fromiter( ( abs( s - t ) / s * 100 for s, t in zip( sp, tp ) ), np.float)
bestFit, pcov = curve_fit( linear, N, error )
fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.plot( N, error, 'r-o', label=r'${\rm relative\ error}$' )
ax.plot( N,  linear( N, *bestFit ) )
ax.grid()
plt.show()

All OK

所以,应该按原样运作。