2017-11-14 29 views
1

私はcurve_fitで線形近似できない非常に単純なデータを持っています。ここ はコードです: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

何が起こっているか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

、それが必要として動作します。

関連する問題