

python3.6を使っています。次のコードはdata_xとdata1の二次元グラフと、data_xとdata2の二次元グラフの二つをそれぞれ別の関数でフィッティングしています。

[code]

    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)
    
[/code]

これによって、二つの関数がフィッティングされます。しかし、当然ながら二つのフィッティングを別々に行っているため、フィッティングパラメータF,m,r,w0が別々の値になってしまいます。AとBは違う値になってもよいのですが、それ以外の4つ(F,m,r,w0)は同じ値でフィッティングしたいです。一つ目のフィッティングで求めたフィッティングパラメータを固定させて二つ目のフィッティングを行うと、全然フィッティングに乗ってくれないので、二つのフィッティングを調整しながら行う必要がありますが、どうすればよいのか全然分かりません。


CC BY-SA 4.0
2018-05-28T11:22:08.587
44332
2019-08-29T13:58:12.937
26529
question
python scipy
pythonで二つの関数を同時にフィッティングしたい


独立した異なる２つのグラフなのだから、それぞれにフィッティングした関数は別のものになりるのが当然です。

１つの関数で2つのグラフ両方にフィッティングすることは可能でしょうが、それが2つのグラフ個々の"最良あてはめ"とは一致しません。

言い換えると、「最良でない」（ずれてても、まちがっていても、いいかげんでも、構わない）関数でよいのなら、『１つの関数で2つのグラフ両方にフィッティング』できるでしょう。  
ただ、そのようなものを求めるのに意義があるか疑問です。

「最良とのずれを測定する方法を定義し、ずれが最も少なくなるような一つの関数で、２つのグラフをフィッティングする」など、元の問題から様々なlemmaを想起して解を得ていくことによって、tomaさんの問題提起を深化してゆくことは、数学会において意味深いものかもしれませんし、フィールズ賞を贈られることになるのかもしれません。  
独自視点の解法が生まれることを祈っております。


CC BY-SA 4.0
2018-05-28T12:53:35.300
44335
2018-05-28T12:53:35.300
217
44332
answer