Кривая подгонки нескольких переменных с использованием minuit - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь уместить некоторые данные, но у меня все еще есть трудности.Проблема, о которой я уже говорил, состоит в том, что эта функция является функцией двух наборов данных, которые должны быть установлены.Недавно я пытался подогнать кривую с помощью минут, но я просто получил прямую линию.Я не использовал minuit прежде, поэтому, если кто-то может увидеть мои ошибки, это будет оценено.Вот код.

import numpy as np
from math import pi
from math import sqrt
from math import log
from scipy import optimize
import scipy.optimize
import matplotlib.pyplot as plt
import iminuit
from iminuit import Minuit

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
delmstrue=np.arrayarray([ 129508.06468325,  115404.78134078,   94431.44014335,
     23118.79379281,   10488.4884635 ,  128103.87729583,
     75506.38728095,    1085.25015196,   -5755.45781264,
     56711.12140265,  156843.91712081,   24203.4827539 ,
    142825.9045775 ,  132046.2531587 ,    5020.15570684,
    130649.0456678 ,  123687.34398805,  122870.98681074,
      1447.33556737,  974160.54532006,   44595.21729319,
     47749.74765446,   25043.27741612,  -55892.58301689,
     17371.63824926,  -71190.53982145,    7150.48008018,
     73879.28456366,    2960.05672287,   59436.60445444,
     -9125.27198958,   -6266.69185936]) #sdata

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([  972.45503744,   950.56823614,   890.18024392,   902.26140931,
         863.19146598,   860.89934086,   845.61846393,   841.7802125 ,
         823.25930603,   803.30233495,  1110.53060342,  1097.31750128,
        1042.33199071,  1021.61696855,  1013.76699146,  1017.50919056,
         984.68738931,   972.47173607,   922.7338377 ,  1279.08318053,
        1242.90431731,  1157.41627741,  1167.51119501,  1154.09094116,
        1099.91468262,  1093.12777974,  1099.71194357,  1352.9713629 ,
        1338.43820154,  1252.88647812,  1257.21770186,  1228.38236923])#ydata error

mudrm = np.linspace(1,max(mud),32)
mudrms = np.linspace(min(delmstrue),max(delmstrue),32) #used in plot


afij=np.array([  1.09440000e+00,  -1.00000000e+00,  -4.73000000e-02,
        -1.90580000e+00,  -1.25000000e+00,  -2.44535000e+02,
        -1.54989000e+01,  -9.39460000e+00,  -3.45830000e+00]) #coefficients

def Ffitr(X,s,k,B=2.61,Fc=92.8,mu=770): #fit curve
    temp1 = (2*B*X)/(4*pi*Fc)**2
    temp2 = temp1*(afij[0]+afij[1]*np.log((2*B*X)/mu**2))
    temp3 = temp1**2*(afij[2]+afij[3]*np.log((2*B*X)/mu**2)+\
                   afij[4]*(np.log((2*B*X)/mu**2))**2)
    temp4 = temp1**3*(afij[5]+afij[6]*np.log((2*B*X)/mu**2)+\
                      afij[7]*(np.log((2*B*X)/mu**2))**2+\
                      afij[8]*(np.log((2*B*X)/mu**2))**3)
    return Fc*(1+k*s)*(1+temp2+temp3+temp4)

#minuit part
def least_squares(k):
    yvar = dFr
    return sum(((Fr - Ffitr(mud, delmstrue,k))/dFr)** 2)

m=minuit.Minuit(least_squares,k=-2.494309898854109e-07,errordef=1)

fminf,paramf=m.migrad()
plt.figure(figsize=(14,8.5))
plt.plot(mud,Fr,"b^")
plt.plot(mudrm, Ffitr(mudrm,mudrms,6.952427712300677e-07))

Вот что я получаю: Data points and curve from my fit.

...