2016-09-30 12 views
0

scipy.optimize.curve_fitが私のデータに適切にフィットするようにはできません。私は、パラメータ値がどうあるべきか、およそ知っていると私は与えられたパラメータを持つ関数を評価した場合に計算され、実験データはよく一致して表示されます。Scipy.optimizeがデータに適合しない

calculated and experimental data私は最小でscipy.optimize.curve_fit出力パラメータを使用ししかし

、エラーは、(視覚検査による)はるかに悪い適合である。私は私の最初の推測として「知られている」パラメータを使用し、フィット関数からの出力の例に示すように比較的狭いウィンドウにパラメータをバインドした場合:

example of output from fit function

を私はエラー値に〜10^2倍を得ますフィット感の視覚的外観は良く見える。私がデータにぴったり合っているのを得るための唯一の方法は、すべてのパラメータを〜0.3単位の「既知の」パラメータで束縛することです。より複雑なデータに合わせるためにこのコードを使用する予定です。計算されたプロットだけを使用することはできません。

関連するコードを以下に含まれています

import matplotlib.pyplot as plt 
import numpy as np 
import scipy 
from scipy.optimize import curve_fit 
d_1= 2.72 #Anstroms 
sig_cp_1= 0.44 
sig_int_1= 1.03 
d_1, sig_cp_1,sig_int_1=float(d_1),float(sig_cp_1),float(sig_int_1) 
Ref=[] 
Qz_F=[] 
Ref_F=[] 
g=open("Exp_Fresnal.csv",'rb')#"Test_Fresnal.csv", 'rb') 
reader=csv.reader(g) 
for row in reader: 
    Qz_F.append(row[0]) 
    Ref.append(row[1]) 
    Ref_F.append(row[2]) 
Ref=map(lambda a:float(a),Ref) 
Ref_F=map(lambda a:float(a),Ref_F) 
Qz_F=map(lambda a:float(a),Qz_F) 
Ref_F_arr=np.array((Ref_F)) 
Qz_arr=np.array((Qz_F)) 
x=np.array((Qz_arr,Ref_F)) 
def func(x,d,sig_int,sig_cp): 
    return (x[1])*(abs(x[0]*d*(np.exp((-sig_int**2)*(x[0]**2)/2)/(1-np.exp(complex(0,1)*x[0]*d)*np.exp((-sig_cp**2)*(x[0]**2)/2)))))**2 
DC_ref=func(x,d_1,sig_int_1,sig_cp_1) 
Y=np.array((Ref)) 
popt, pcov=curve_fit(func,x,Y,)#p0=[2.72,1.0,0.44]) 
perr=np.sqrt(np.diag(pcov)) 
print "par=",popt;print"Var=",perr 
Fit=func(x,*popt) 
Fit=func(x,*popt) 
Ref=np.transpose(np.array([Ref])) 
Qz_F=np.transpose(Qz_F) 

plt.plot(Qz_F, Ref, 'bs',label='Experimental') 
plt.plot(Qz_F, Fit, 'r--',label='Fit w/ DCM model') 
plt.axis([0,3,10**(-10),100]) 
plt.yscale('log') 
plt.title('Reflectivity',fontweight='bold',fontsize=15) 
plt.ylabel('Reflectivity',fontsize=15) 
plt.xlabel('qz /A^-1',fontsize=15) 
plt.legend(loc='upper right',numpoints=1) 
plt.show() 

配列は、(私は含めることはできません)ファイルからインポートし、フィット感は、この歪んになることを引き起こす全く外れ値ポイントが存在していません。どんな助けもありがとうございます。

編集私はコードと一緒に行くことができますが、MS-DOS .CSV

+1

私たちはあなたの入力データを持っておらず、実際にグラフをどのように作り出しているのかは分かりません。それは本当にあなたを助けることが大変です。 – Evert

+0

問題を直接読んで理解しやすくするため、質問に直接数値を含めてください。 – Evert

+0

複雑な機能では、フィット感が極端に低下することは簡単です。 – Evert

答えて

3

@WarrenWeckesser has a really good pointが、さらにノートとしてそれを再保存する必要があります追加のコードとinput dataを含ま そのy軸対数である。右端の明らかに大きな誤差は1e-5のようなもので、左上の点は約0.1の反射率値です。尾から来る二乗誤差は、左の巨大項と比較すると、ほんのわずかです。

私は確かにcurve_fitがうまくいきます。視覚的に良くフィットするようにするには、モデルのlog()を付けてlog(y)にフィットさせることをお勧めします。結果は視覚的に(および物理的な観点から)より安定している可能性があります。おそらくシステムの全体的な広域スペクトルの記述をしようとしているので、これはあなたが期待するものに近いかもしれません(しかし、必然的に反射率が高い場所ではあまり正確ではありません)。

関連する問題