やりたいこと
2つのガウス関数の幅のみを共有パラメータとし、データに対してフィッティングしたい。
下記コードは2つのピークを持つ回折データに対して
2つのガウス関数でフィッティングするコードの一部抜粋です。
ピークサーチを用いて2つのピーク位置と高さをそれぞれctrおよびampとしています。
paramsの数で繰り返し回数を決め、ガウス関数の数を指定しています(params=6なら6/3=2回)。
このコードでもある程度良いフィッティング結果が得られていますが、
幅のパラメータ(wid)が独立でフィッティングされるので、
幅のみを2つのガウス関数で共有してフィッティングしたいです。
質問
基本コードは変えずに幅のみを共有パラメータとする方法はありますでしょうか。
もし難しいようであれば、どのようなコードにすれば共有パラメータとしてフィッティングできますでしょうか。
お力添え頂けると幸いです。
python
1 width = 0.04 2 #ピークサーチ 3 peaks, _ = find_peaks(y, height=peak_height, distance=peak_dis) 4 5 ctr1 = x[peaks[0]] 6 amp1 = y[peaks[0]] 7 ctr2 = x[peaks[1]] 8 amp2 = y[peaks[1]] 9 10 def func(x, *params): 11 #paramsの長さでフィッティングする関数の数を判別。 12 num_func = int(len(params)/3) 13 #ガウス関数にそれぞれのパラメータを挿入してy_listに追加。 14 y_list = [] 15 for i in range(num_func): 16 y = np.zeros_like(x) 17 param_range = list(range(3*i,3*(i+1),1)) 18 amp = params[int(param_range[0])] 19 ctr = params[int(param_range[1])] 20 wid = params[int(param_range[2])] 21 y = y + amp * np.exp( -((x - ctr)/wid)**2) 22 y_list.append(y) 23 #y_listに入っているすべてのガウス関数を重ね合わせる。 24 y_sum = np.zeros_like(x) 25 for i in y_list: 26 y_sum = y_sum + i 27 return y_sum 28 29 def fit_plot(x, *params): 30 num_func = int(len(params)/3) 31 y_list = [] 32 for i in range(num_func): 33 y = np.zeros_like(x) 34 param_range = list(range(3*i,3*(i+1),1)) 35 amp = params[int(param_range[0])] 36 ctr = params[int(param_range[1])] 37 wid = params[int(param_range[2])] 38 y = y + amp * np.exp( -((x - ctr)/wid)**2) 39 y_list.append(y) 40 return y_list 41 #初期値のリストを作成 42 guess = [] 43 guess.append([amp1, ctr1, width]) 44 guess.append([amp2, ctr2, width]) 45 46 #初期値リストの結合 47 guess_total = [] 48 for i in guess: 49 guess_total.extend(i) 50 51 popt, pcov = curve_fit(func, x, y, p0=guess_total)
回答1件
あなたの回答
tips
プレビュー