2017-10-19 10 views
1

私は、scipyとpython 3.xを使ってトリオダルガウス関数を試しています。私は本当にほとんどそこにいると思うが、何がうまくいかないのか分からないので、ここで私の頭を傷つけている。python 3.xを使用してscipyから** curve_fit **関数を使用して複数のガウス関数をフィッティングする

 data =np.loadtxt('mock.txt') 
     my_x=data[:,0] 
     my_y=data[:,1] 

     def gauss(x,mu,sigma,A): 
      return A*np.exp(-(x-mu)**2/2/sigma**2) 
     def trimodal_gauss(x,mu1,sigma1,A1,mu2,sigma2,A2,mu3,sigma3,A3): 
      return gauss(x,mu1,sigma1,A1)+gauss(x,mu2,sigma2,A2)+gauss(x,mu3,sigma3,A3) 



     """"" 
     Gaussian fitting parameters recognized in each file 
     """"" 
     first_centroid=(10180.4*2+9)/9 
     second_centroid=(10180.4*2+(58.6934*1)+7)/9 
     third_centroid=(10180.4*2+(58.6934*2)+5)/9 
     centroid=[] 
     centroid+=(first_centroid,second_centroid,third_centroid) 

     apparent_resolving_power=1200 
     sigma=[] 
     for i in range(len(centroid)): 
      sigma.append(centroid[i]/((apparent_resolving_power)*2.355)) 

     height=[1,1,1] 

     p=[]  

     p = [list(t) for t in zip(centroid, sigma, height)] 


     for i in range(9): 
      popt, pcov = curve_fit(trimodal_gauss,my_x,my_y,p0=p[i]) 

このコードを使用すると、次のエラーが発生します。

TypeError: trimodal_gauss() missing 6 required positional arguments: 'mu2', 'sigma2', 'A2', 'mu3', 'sigma3', and 'A3' 

エラーメッセージの内容を理解していますが、私は6つの初期推測をどのように提供していないのか分かりません。

入力いただきありがとうございます。

答えて

0

あなたはcurve_fit 9回別々に呼び出し、および(pがネストされたリストであるので、あなたのコードが何をするか、おそらくされていない)p0=p[i]を指定することで、それを異なる初期パラメータの推測を与えるためにしようとしているように見えます。

pは9要素の1次元配列で、curve_fitを1回呼び出すようにしてください。何かのように

p = np.array([list(t) for t in zip(centroid, sigma, height)]).flatten() 
popt, pcov = curve_fit(trimodal_gauss,my_x,my_y,p0=p]) 

が動作する可能性があります。

+0

ありがとうございます。私は1Dアレイを作っていなかったが、どうやってそれをやり遂げることができないのか分かりませんでした。 – user7852656

関連する問題