pythonで二つの関数を同時にフィッティングしたい
python3.6を使っています。次のコードはdata_xとdata1の二次元グラフと、data_xとdata2の二次元グラフの二つをそれぞれ別の関数でフィッティングしています。
import matplotlib.pyplot as plt
import scipy as sp
from scipy.optimize import curve_fit
data_x=[ 3.15571008 ,3.1066576 , 3.05910671 ,3.01298953 ,2.96824216 ,2.92480447,2.88261979 ,2.84163467 ,2.80179867 ,2.76306413 ,2.72538598 ,2.6887216 ,2.6530306 , 2.61827474 ,2.58441774 ,2.55142517 ,2.51926435]
data1= [ 3.50054094 , 4.16089732 , 4.98809876 , 6.04311513 , 7.33692531 , 8.81495875, 10.29956666 ,11.43818035 ,11.81403109 ,11.24183674 ,9.90566277 , 8.29082274, 6.75265875 , 5.44632354 , 4.39722875 , 3.57459016 , 2.93367948]
data2= [ 1.27224069 ,1.56148443 ,1.93069611 ,2.40000859 ,2.98302372 ,3.66684273 ,4.38099848 ,4.97231414 ,5.24594599 ,5.09652223 ,4.61044296 ,3.96359503, 3.3131098 , 2.74026653 ,2.26712656 ,1.8872417 , 1.58501134]
plt.plot(data_x,data1,"o")
plt.figure()
plt.plot(data_x,data2,"o")
A_initial=1
f_initial=1
m_initial=1
r_initial=0.5
w0_initial=2.7
B_initial=1
parameter_initial1=np.array([A_initial,f_initial,m_initial,r_initial,w0_initial])
parameter_initial2=np.array([B_initial,f_initial,m_initial,r_initial,w0_initial])
def sc_fit(w,A,F,m,r,w0):
return A*F/(m*((w0**2-w**2)**2+4*r**2*w**2)**(1/2))
param_sc, cov = sp.optimize.curve_fit(sc_fit, data_x, data1, p0=parameter_initial1)
def ab_fit(w,B,F,m,r,w0):
return B*F**2/(4*m*r)*1/(1+((w0**2-w**2)/(2*r*w))**2)
param_ab, cov = sp.optimize.curve_fit(ab_fit, data_x, data2, p0=parameter_initial2)
freq=np.arange(2.5,3.2,0.01)
y1=sc_fit(freq,param_sc[0],param_sc[1],param_sc[2],param_sc[3],param_sc[4])
y2=ab_fit(freq,param_ab[0],param_ab[1],param_ab[2],param_ab[3],param_ab[4])
plt.figure()
plt.plot(data_x,data1,"o")
plt.plot(freq,y1)
plt.figure()
plt.plot(data_x,data2,"o")
plt.plot(freq,y2)
これによって、二つの関数がフィッティングされます。しかし、当然ながら二つのフィッティングを別々に行っているため、フィッティングパラメータF,m,r,w0が別々の値になってしまいます。AとBは違う値になってもよいのですが、それ以外の4つ(F,m,r,w0)は同じ値でフィッティングしたいです。一つ目のフィッティングで求めたフィッティングパラメータを固定させて二つ目のフィッティングを行うと、全然フィッティングに乗ってくれないので、二つのフィッティングを調整しながら行う必要がありますが、どうすればよいのか全然分かりません。