我有一个非常简单的数据,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! 发生了什么
答案 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()
所以,应该按原样运作。