Помогите с проблемой подгонки кривой scipy.odr!
Я пытаюсь подогнать набор точек данных с помощью функции подгонки, которая зависит от двух переменных, назовем их xdata и sdata. Проблема в том, что моя кривая находится выше точек данных te, и она также не имеет характерного "логарифмического изгиба" при малом x, который я ожидал бы.
Что я уже пробовал:
import numpy as np from math import pi from math import sqrt from math import log import matplotlib.pyplot as plt from scipy.odr import * mud=np.array([ 62.3034458 , 49.38321903, 29.00404314, 34.78485066, 20.8157854 , 17.80098451, 14.24225111, 13.73978429, 6.99794801, 3.67825221, 54.86125828, 54.03278146, 30.08443709, 24.04668874, 23.30165563, 20.1486755 , 14.69503311, 10.22781457, 2.94139073, 52.2731221 , 50.77358578, 29.54086553, 29.35163833, 29.38020093, 12.638949 , 12.34618238, 6.96570325, 39.89929348, 39.49570652, 18.13994565, 18.10559783, 9.45853261]) #xdata, X[0] dmr=np.array([ 1371.40271858, 1087.00614558, 638.42652191, 765.67072214, 458.18869725, 391.82821743, 313.49221174, 302.43335948, 154.03448201, 80.96162633, 1207.57539063, 1189.33941193, 662.20131726, 529.30145412, 512.90198154, 443.50122114, 323.45839899, 225.12795879, 64.74343735, 1150.59525137, 1117.58849953, 650.22982799, 646.06463639, 646.69386745, 278.19822008, 271.7537153 , 153.32342651, 878.24442995, 869.36082094, 399.28778676, 398.53178639, 208.19671999]) #xdata error delms=np.array([-439486.22394175, -453589.50728422, -474562.84848165, -545875.49483219, -558505.8001615 , -440890.41132917, -493487.90134405, -567909.03847304, -574749.74643764, -512283.16722235, -412150.37150419, -544790.8058711 , -426168.3840475 , -436948.0354663 , -563974.13291816, -438345.2429572 , -445306.94463695, -446123.30181426, -567546.95305763, 405166.25669506, -524399.07133181, -521244.54097054, -543951.01120888, -624886.87164189, -551622.65037574, -640184.82844645, -561843.80854482, -495115.00406134, -566034.23190213, -509557.68417056, -578119.56061458, -575260.98048436]) #sdata X[1] delmse=np.array([-2979653.57361939, -3093614.65120902, -3266292.97633656, -3886046.4766303 , -4001813.36818854, -2990925.32627091, -3425609.2157963 , -4089328.02762864, -4153734.68306526, -3587361.68492492, -3308843.61310239, -4641321.33434326, -3440767.5818643 , -3543472.98103809, -4852500.43903054, -3556867.52361137, -3623894.61348049, -3631786.19171775, -4892458.53026275, 3081413.91907938, -5160948.70057276, -5122078.1288115 , -5405418.12302148, -6492845.91828315, -5503079.47845863, -6714626.51459685, -5634798.73358441, -5632509.55406174, -6668023.21098675, -5835919.76008084, -6854571.54472566, -6810150.89483716]) #sdata error Fr=np.array([ 127.31527434, 122.72790265, 110.26449558, 112.75717699, 104.81830088, 104.35746903, 101.32016814, 100.54513274, 96.87942478, 92.98330088, 124.9736053 , 122.52414305, 112.47114172, 108.74591788, 107.34258013, 108.00597616, 102.18850331, 100.04522384, 91.47210596, 128.18641113, 122.15516847, 108.23229985, 109.85263369, 107.69218856, 99.14042658, 98.0902102 , 99.1104204 , 112.47678261, 110.39126087, 98.373 , 98.97391304, 95.01495652]) #ydata dFr=np.array([ 896.26885122, 875.58383901, 818.62457423, 829.98971957, 793.20660766, 791.05048385, 776.66630019, 773.0667478 , 755.66793779, 736.92811367, 1015.91181546, 1003.51455505, 951.99278806, 932.61154369, 925.27205996, 928.77505547, 898.10531212, 886.70321856, 840.32700032, 1163.93606086, 1130.17292565, 1050.57585934, 1059.95984127, 1047.49405697, 997.19600463, 990.89596719, 997.00618945, 1222.12794692, 1208.68920582, 1129.71030998, 1133.69871178, 1107.13129166]) #ydata error def Ffitsso(p,X,B=2.58,Fc=92.2,mu=770,Za=0.9468): #fit function temp1 = (2*B*X[0])/(4*pi*Fc)**2 temp2 = temp1*(afij[0]+afij[1]*np.log((2*B*X[0])/mu**2)) temp3 = temp1**2*(afij[2]+afij[3]*np.log((2*B*X[0])/mu**2)+\ afij[4]*(np.log((2*B*X[0])/mu**2))**2) temp4 = temp1**3*(afij[5]+afij[6]*np.log((2*B*X[0])/mu**2)+\ afij[7]*(np.log((2*B*X[0])/mu**2))**2+\ afij[8]*(np.log((2*B*X[0])/mu**2))**3) return Fc/Za*(1+p[0]*X[1])*(1+temp2+temp3+temp4)+p[1] #ODR part xtot2=np.row_stack( (mud, delms) ) etot2=np.row_stack( (dmr, delmse) ) fittingr = Model(Ffitsso) mydatar = RealData(xtot2, Fr, sx=etot2, sy=dFr) myodrr = ODR(mydatar, fittingr, beta0=[ 3.48117810e-3, 2.59580486e+01]) myoutputr = myodrr.run() myoutputr.pprint() betr=myoutputr.beta #plot part mudr22s2 = np.linspace(0.005,max(mud),100) mudrd22s2 = np.linspace(min(delms),max(delms),100) plt.figure(figsize=(14,8.5)) plt.xlim([0, 90]) plt.plot(mud[0:10],Fr[0:10],"b^") plt.plot(mud[10:19],Fr[10:19],"g^") plt.plot(mud[19:27],Fr[19:27],"r^") plt.plot(mud[27:32],Fr[27:32],"k^") plt.plot(mudr22s2,Ffitsso(betr,[mudr22s2,mudrd22s2]))
Любая помощь будет очень признательна!