예제 #1
0
def latex_table(directory,
                file_,
                data,
                data_err,
                tab,
                out=False,
                data_ol=[],
                data_err_ol=[]):
    """
        Parameters
        ----------    

        Returns
        -------

    """

    with open(directory + "tabelle/tab_" + file_ + ".txt", "w") as text_file:
        text_file.write("\\begin{tabular}{c")
        for z in range(1, len(data)):
            text_file.write("|c")
        text_file.write("} \n")
        text_file.write("%s" % tab[0])
        for z in range(1, len(data)):
            text_file.write(" & %s" % tab[z])
        text_file.write("\\\\\n\hline\n")
        for i in range(len(data[0])):
            text_file.write("%s" % xe(data[0][i], data_err[0][i], "$\pm$"))
            for j in range(1, len(data)):
                text_file.write(" & %s" %
                                xe(data[j][i], data_err[j][i], "$\pm$"))
            text_file.write("\\\\\n")
        if out == True:
            for i in range(len(data_ol[0])):
                text_file.write("%s" %
                                xe(data_ol[0][i], data_err_ol[0][i], "$\pm$"))
                for j in range(1, len(data_ol)):
                    text_file.write(
                        " & %s" %
                        xe(data_ol[j][i], data_err_ol[j][i], "$\pm$"))
                text_file.write("\\\\\n")
        text_file.write("\\end{tabular}")
        text_file.close()
예제 #2
0
def mc_integrator(f_over_dist,
                  dist_sampler,
                  epsrel=1e-4,
                  epsabs=1e-4,
                  start_n=10000,
                  max_bunch=10000000,
                  print_info=True):
    summ = 0.0
    sum2 = 0.0
    i = 0
    n = 0
    while True:
        if i == 0:
            dn = start_n
            if print_info:
                print('################ mc_integrator ################')
                print()
                print('epsrel = %.2g' % epsrel)
                print('epsabs = %.2g' % epsabs)
                print()
                print('***** Cycle %d *****' % i)
                print('Generating start_n = %d samples' % start_n)
        else:
            target_error = epsabs + I * epsrel
            target_n = int((DI / target_error)**2 * n)
            dn = min(target_n - n, max_bunch)
            if print_info:
                print()
                print('***** Cycle %d *****' % i)
                print('Estimated necessary samples = %d' % target_n)
                print('Generating %d more samples (max = %d)' %
                      (dn, max_bunch))
        sample = dist_sampler(dn)
        n += dn
        y = f_over_dist(sample)
        summ += np.sum(y, axis=0)
        sum2 += np.sum(y**2, axis=0)
        I = summ / n
        DI = np.sqrt((sum2 - summ**2 / n) / (n * (n - 1)))
        if print_info:
            print('Result with %d samples:' % n)
            print('I = %s  (I = %g, DI = %g)' % (lab.xe(I, DI), I, DI))
        if all(DI < epsrel * I + epsabs):
            if print_info:
                print(
                    'Termination condition DI < epsrel * I + epsabs satisfied.'
                )
                print()
                print('############## END mc_integrator ##############')
            break
        i += 1
    return I, DI
예제 #3
0
py.errorbar(T, L, dL, dT, '.', markersize='3')


##funzione di fit
def retta(x, a, b):
    return a * x + b


##trovo I_th con un fit
m = []
dm = []
q = []
dq = []
out = fit_curve(retta, T, L, dy=1, p0=[1, 1], absolute_sigma=True)
par = out.par
cov = out.cov
err = py.sqrt(py.diag(cov))
m_fit = par[0]
q_fit = par[1]
dm_fit = err[0]
dq_fit = err[1]
print('m = %s  q = %s' % (xe(m_fit, dm_fit), xe(q_fit, dq_fit)))
x = py.linspace(T[0] - 1, T[len(T) - 1] + 1, 100)
py.plot(x,
        retta(x, *par),
        linewidth=1,
        label='m = 0.22(2) nm/°C \n q = 775.4(5) nm')
py.legend(fontsize='large')
py.ylabel('$\lambda$ [nm]')
py.xlabel('T [°C]')
out = fit_curve(cos4, angolo, Vpp, dy=dVpp, dx=dx, p0=[60, -10])
par0 = out.par
cov0 = out.cov

out = fit_curve(cos4, angolo, V, dy=dy, dx=dx, p0=[120, -10])
par1 = out.par
cov1 = out.cov
err1 = sqrt(diag(cov1))
chi2norm1 = out.chisq / out.chisq_dof
print('chi2norm = ', chi2norm1)
print('p-value = ', out.chisq_pvalue)
print('parameters = ', par1)
print('errors     = ', err1)


out = fit_curve(cos4, angolo, V2, dy=dy2, dx=dx, p0=[80, -10])
par2 = out.par
cov2 = out.cov
err2 = sqrt(diag(cov2))
chi2norm2 = out.chisq / out.chisq_dof
print('chi2norm = ', chi2norm2)
print('p-value = ', out.chisq_pvalue)
print('parameters = ', par2)
print('errors     = ', err2)

#plot(angolo, cos4(angolo, *par0), '-k')
plot(angolo, cos4(angolo, *par1), '-g', label='$y = a \cdot \cos^4(x-b)$\n$\\frac{\chi^2}{dof} = %.2f$\n$b_{fit} = %s °$' %(chi2norm1,xe(par1[1],err1[1])))
#plot(angolo, cos4(angolo, *par2), '-g', label='$y = a \cdot \cos^4(x-b)$\n$\\frac{\chi^2}{dof} = %.2f$\n$b_{fit} = %s$' %(chi2norm2,xe(par2[1],err2[1])))
legend(fontsize='x-large')
xlabel('$\\varphi$ [°]', fontsize='large')
ylabel('intensità della seconda armonica [u.a.]', fontsize='large')
    ##funzione di fit
    def retta(x, a, b):
        return a*x + b
    
    par, cov = curve_fit(retta, n, l, sigma = dl, p0 = [1,1], absolute_sigma=True)
    #par = out.par
    #cov = out.cov
    err = py.sqrt(py.diag(cov))
    m_fit = par[0]
    q_fit = par[1]
    dm_fit = err[0]
    dq_fit = err[1]
    dm_fit = py.sqrt(dm_fit**2+(0.01*m_fit)**2)
    m.append(m_fit)
    q.append(q_fit)
    dm.append(dm_fit)
    dq.append(dq_fit)
    print('m = %s  q = %s' %(xe(m_fit, dm_fit), xe(q_fit, dq_fit)))
    x = py.linspace(0, len(n)+1, 100)
    py.plot(x, retta(x, *par), linewidth=1, color ='tab:green' ,label='{} = {} [mm]'.format('$m_{fit}$', xe(m_fit, dm_fit)))
    py.legend(fontsize='large')
    py.ylabel('l [mm]')
    py.xlabel('N')

    
    
    
    
    

clf()
errorbar(primi, Vpp, yerr=dy, xerr=dx, fmt='.k')
xx = linspace(min(primi), max(primi), 2000)
plot(xx, PM(xx, *par), label='fit con tutte le misure', color='tab:orange')
#$y = \\alpha \\frac{\sin^2(\\beta (\\theta - \\theta_m))}{[\\beta (\\theta - \\theta_m)]^2}$
xxx = linspace(min(primi[cutindex1:cutindex2]),
               max(primi[cutindex1:cutindex2]), 2000)
plot(xxx, PM(xxx, *parc), label='fit senza le code', color='tab:green')
plot(xx, PM(xx, *parc), '--', color='tab:green', label='estrapolazione')
#plot(xxx, gaussiana(xxx, *parg))
bbox_props = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.5)
text(
    313,
    505,
    '$y = \\alpha \\frac{\sin^2(\\beta (\\theta - \\theta_m))}{[\\beta (\\theta - \\theta_m)]^2}$ \n $\\beta_{fit} = 1.377(2)\;gradi^{-1}$'
    % xe(parc[1] * 60, errc[1] * 60),
    fontsize='large',
    verticalalignment='top',
    horizontalalignment='right',
    bbox=bbox_props)
xlabel('angolo [\']')
ylabel('intensità seconda armonica [mV]')
legend(fontsize='large', loc=2)

figure('sinc_gaussiana').set_tight_layout(True)
clf()
errorbar(primi, Vpp, yerr=dy, xerr=dx, fmt='.k')
xx = linspace(min(primi), max(primi), 2000)
xxx = linspace(min(primi[cutindex1:cutindex2]),
               max(primi[cutindex1:cutindex2]), 2000)
plot(
예제 #7
0
def parabola(x, a):
    return a * x**2


out = fit_curve(parabola,
                power,
                Vpp,
                dy=dy,
                dx=dx,
                p0=[1],
                absolute_sigma=True)
par = out.par
cov = out.cov
err = sqrt(diag(cov))
print('a = %s' % xe(par, err))
print('chisq/dof = %d/%d = %.2f' % tuple(
    (out.chisq, out.chisq_dof, out.chisq / out.chisq_dof)))
print('p_value = %.3f\n' % out.chisq_pvalue)

figure('potenza_alla2').set_tight_layout(True)
clf()
#griglia = GridSpec(2, 1, height_ratios=[2,1])
#subplot(griglia[0])
errorbar(power, Vpp, fmt='.k', yerr=dy, xerr=dx, markersize=4)
xx = linspace(min(power), max(power), 2000)
plot(
    xx,
    parabola(xx, *par),
    color='tab:green',
    label=
예제 #8
0
                 markersize='4')
            """come errore metto (1/2)*sensibilità*0.68,
            scelta discutibile ma giustificata a spanne dal confidence level"""
            out = fit_curve(retta,
                            ordini_fit,
                            t[piccoinquestione],
                            dy=0.5 * 0.68 * (t[1] - t[0]),
                            p0=[1, 1],
                            absolute_sigma=True)
            par = out.par
            cov = out.cov
            m_fit = par[0]
            q_fit = par[1]
            dm_fit, dq_fit = sqrt(diag(cov))
            print('picco %s: m = %s  q = %s' %
                  (nomipicchi[k], xe(m_fit, dm_fit), xe(q_fit, dq_fit)))
            m.append(m_fit)
            q.append(q_fit)
            dm.append(dm_fit)
            dq.append(dq_fit)
            plot(ordini, retta(ordini_fit, *par), linewidth=1)

        if i % larghezza == 0:
            ylabel('t [ms]')
        if i >= len(files) - larghezza:
            xlabel('ordini')
        #xlabel('numero ordine interferenza')
        #ylabel('t [ms]')
        xticks(arange(1, n_ordini + 1, 1))
        ylim(ylim(min(t) - 0.2 * (max(t) - min(t)), max(t)))
        xlim(0.5, n_ordini + 0.5)
    figure('isteresi_30-70')
    errorbar(V, d, yerr=dd, xerr=dV, fmt='.')

    cut1 = 0
    j = 0
    while abs(V[0] - V[j]) < 20:
        cut2 = j
        j += 1

    m = []
    for k in range(2):
        out = fit_curve(retta,
                        V[cut1:cut2],
                        d[cut1:cut2],
                        dy=dd[cut1:cut2],
                        dx=dV[cut1:cut2],
                        p0=[1, 1],
                        absolute_sigma=True)
        par = out.par
        cov = out.cov
        dpar = sqrt(diag(cov))
        plot(V[cut1:cut2],
             retta(V[cut1:cut2], *par),
             label='coeff. angolare = {} $\mu$m/V'.format(xe(par[0], dpar[0])))
        m.append(par[0])
        cut1 = cut2
        cut2 = len(V)
    print('differenza relativa = ', abs(m[0] - m[1]) / ((m[0] + m[1]) / 2))

legend(fontsize='large')
예제 #10
0
                    Vpp[indici_bassi],
                    dy=dy[indici_bassi],
                    dx=dx[indici_bassi],
                    p0=[1],
                    absolute_sigma=True)
    par = out.par
    cov = out.cov
    err = sqrt(diag(cov))
    a1_fit.append(par[0])
    da1_fit.append(err[0])
    chisq = out.chisq
    chisq1 = '{0:.2f}'.format(out.chisq)
    p_value = '{0:.1f}'.format(out.chisq_pvalue * 100)
    dof = out.chisq_dof
    chidof = '{0:.2f}'.format(chisq / dof)
    print('a = %s' % xe(par, err))
    print('chisq/dof = %d/%d = %.3f' % tuple(
        (out.chisq, out.chisq_dof, out.chisq / out.chisq_dof)))
    print('p_value = %.3f\n' % out.chisq_pvalue)

    figure('potenza_alla2')
    subplot(altezza, larghezza, j)
    errorbar(power[indici_bassi],
             Vpp[indici_bassi],
             fmt='.k',
             yerr=dy[indici_bassi],
             xerr=dx[indici_bassi],
             markersize=4)
    xx = linspace(
        min(power[indici_bassi]) - 6,
        max(power[indici_bassi]) + 6, 2000)
l633_2 = ufloat(289.2, 0.5)
l532_1 = ufloat(291.3, 0.5)
l532_2 = ufloat(287.1, 0.5)

lamb = [633, 532]
lamb_n = [850, 1300]
atten_n = [ufloat(4, 0.1), ufloat(1.5, 0.1)]
atten_1 = array([
    um.log10(pin633_1 / pout633_1) / l633_1,
    um.log10(pin532_1 / pout532_1) / l532_1
]) * 10000
atten_2 = array([
    um.log10(pin633_2 / pout633_2) / l633_2,
    um.log10(pin532_2 / pout532_2) / l532_2
]) * 10000
print('attenuazione1 532 = %s' % xe(atten_1[1].n, atten_1[1].s))
print('attenuazione2 532 = %s' % xe(atten_2[1].n, atten_2[1].s))
print('attenuazione1 633 = %s' % xe(atten_1[0].n, atten_1[0].s))
print('attenuazione2 633 = %s' % xe(atten_2[0].n, atten_2[0].s))

sigma633 = std(array([
    atten_1[0].n,
    atten_2[0].n,
]), ddof=1)
sigma532 = std(array([
    atten_1[1].n,
    atten_2[1].n,
]), ddof=1)
print('sigma 532  = %.2f' % sigma532)
print('sigma 633  = %.2f' % sigma633)
print('mean sigma = %.2f' % qmean([sigma532, sigma633]))
예제 #12
0
 q = []
 dq = []
 out = fit_curve(retta,
                 I[0:j - 1],
                 P[0:j - 1],
                 dy=dP[0:j - 1],
                 p0=[1, 1],
                 absolute_sigma=True)
 par = out.par
 cov = out.cov
 m_fit = par[0]
 q_fit = par[1]
 dm_fit, dq_fit = py.sqrt(py.diag(cov))
 I_th = -q_fit / m_fit
 dI = I_th * (dm_fit / m_fit + dq_fit / q_fit)
 print('m = %s  q = %s' % (xe(m_fit, dm_fit), xe(q_fit, dq_fit)))
 print('I_th = %s' % (xe(I_th, dI)))
 m.append(m_fit)
 q.append(q_fit)
 dm.append(dm_fit)
 dq.append(dq_fit)
 x = py.linspace(I[j] - 2, I[0] + 1, 100)
 py.plot(x,
         retta(x, *par),
         linewidth=1,
         color=c_fit[i],
         label='{} = {} mA, T = {} °C'.format('$I_{th}$', xe(I_th, dI),
                                              T[i]))
 py.legend(fontsize='large')
 py.ylabel('P [$\mu$W]')
 py.xlabel('I [mA]')
예제 #13
0
def fit_bayes(f,
              x,
              y,
              dx,
              dy,
              par0,
              cov0,
              relax='x',
              std_dig=1.5,
              cor_err=0.01,
              prob_err=0.05,
              gamma=1,
              print_info=False,
              plot_figure=None):
    """
	if dx is None, par0-cov0 is the estimate of parameters
	if dx is not None, par0-cov0 is the estimate of [parameters, xs]
	f must be fully vectorized
	"""
    if print_info:
        print('################# fit_bayes #################')
        print()
        print('f = {}'.format(f))
        print('x.shape = {}'.format(x.shape))
        print('y.shape = {}'.format(y.shape))
        print('dy.shape = {}'.format(dy.shape))
        print('dx = None' if dx is None else 'dx.shape = {}'.format(dx.shape))
        print()
        print('Starting estimate of parameters:')
        print(lab.format_par_cov(par0, cov0))
        print()

    # TARGET ERRORS FOR RESULTS

    # target relative error on computed standard deviations
    # 1/2.1 to round correctly
    std_relerr = 10**(-std_dig) * 1 / 2.1

    # target relative error on (1 - correlation)
    # 1/2.1 to round correctly
    onemcor_relerr = cor_err * 1 / 2.1

    # target absolute error on computed averages
    # align with error on standard deviations, based on initial estimate
    dp0 = np.sqrt(np.diag(cov0))
    avg_abserr = std_relerr * dp0

    # target relative error on computed variances
    # 2 because variance = std ** 2
    var_relerr = std_relerr * 2

    # sigma factor for statistical errors
    sigma = abs(stats.norm.ppf(prob_err / 2))

    if print_info:
        print('Target relative error on standard deviations = %.3g' %
              std_relerr)
        print('Target absolute error on averages:\n{}'.format(avg_abserr))
        print()

    # VARIABLE TRANSFORM AND LIKELIHOOD

    # diagonalize starting estimate of covariance
    w, V = linalg.eigh(cov0)
    dp0 = np.sqrt(w)
    p0 = V.T.dot(par0)

    if print_info:
        print('Diagonalized starting estimate of parameters:')
        print(lab.xe(p0, dp0))
        print()

    # change variable: p0 -> C, dp0 -> 1
    # (!) M and Q will be changed by functions, so do not reassign them!
    C = 10
    M = np.copy(dp0)
    Q = p0 - C * M
    dp0 /= M
    p0 = (p0 - Q) / M

    # likelihood (not normalized)
    idy2 = 1 / dy**2
    vx = x.reshape((1, ) + x.shape)
    vy = y.reshape((1, ) + y.shape)
    if dx is None:
        chi20 = np.sum((y - f(x, *par0))**2 *
                       idy2)  # initial normalization with L(C) == 1

        def L(p):
            return np.exp((-np.sum((vy - f(
                vx,
                *np.einsum(
                    'ik,jk', V,
                    M.reshape((1, ) + M.shape) * p + Q.reshape(
                        (1, ) + Q.shape)).reshape(p.shape[::-1] +
                                                  (1, ))))**2 * idy2,
                                   axis=1) + chi20) / 2)
    else:
        vdx = dx.reshape((1, ) + dx.shape)
        chi20 = np.sum((y - f(par0[-len(x):], *par0[:-len(x)]))**2 *
                       idy2)  # initial normalization with L(C) == 1

        def L(px):
            tpx = np.einsum(
                'ik,jk', V,
                M.reshape((1, ) + M.shape) * px + Q.reshape((1, ) + Q.shape))
            p = tpx[:-len(x)]
            p = p.reshape(p.shape + (1, ))
            txstar = tpx[-len(x):].T
            return np.exp((-np.sum(
                (vy - f(txstar, *p))**2 * idy2, axis=1) - np.sum(
                    ((txstar - vx) / vdx)**2, axis=1) + chi20) / 2)

    # INTEGRAND

    # integrand: [L, p0 * L, ..., pd * L, p0 * p0 * L, p0 * p1 * L, ..., p0 * pd * L, p1 * p1 * L, ..., pd * pd * L]
    # change of variable: p = C + k * tan(theta), theta in (-pi/2, pi/2)
    idxs = np.triu_indices(len(p0))
    bounds = [(-np.pi / 2, np.pi / 2)] * len(p0)
    k = 1 / 2

    @vegas.batchintegrand
    def integrand(theta):
        t = np.tan(theta)
        p = C + k * t
        l = np.prod(k * (1 + t**2), axis=1) * L(p)
        return np.concatenate(
            (np.ones(l.shape +
                     (1, )), p, np.einsum('ij,il->ijl', p, p)[(..., ) + idxs]),
            axis=1) * l.reshape(l.shape + (1, ))

    # figure showing sections of the integrand
    if not (plot_figure is None):
        length = len(p0) if dx is None else len(p0) - len(x)
        plot_figure.clf()
        plot_figure.set_tight_layout(True)
        G = gridspec.GridSpec(length, length + 2)
        subplots = np.empty((length, length + 2), dtype=object)
        eps = 1e-4
        xs = np.linspace(-np.pi / 2 + eps, np.pi / 2 - eps, 256)

        for i in range(length):
            axes = plot_figure.add_subplot(G[i, 0])
            subplots[i, 0] = axes
            theta = np.zeros((len(xs), len(p0)))

            def fplot(theta_i):
                theta[:, i] = theta_i
                return integrand(theta)[:, 0]

            axes.plot(xs, fplot(xs), '-k', label=R'$L$ along $p_{%d}$' % (i))
            axes.legend(loc=1)

        for i in range(length):
            axes = plot_figure.add_subplot(G[i, 1])
            subplots[i, 1] = axes
            theta = np.zeros((len(xs), len(p0)))

            def fplot(theta_i):
                theta[:, i] = theta_i
                return integrand(theta)[:, 1 + i]

            axes.plot(xs,
                      fplot(xs),
                      '-k',
                      label=R'$p_{%d}\cdot L$ along $p_{%d}$' % (i, i))
            axes.legend(loc=1, fontsize='small')

        mat = np.empty(cov0.shape, dtype='uint32')
        mat[idxs] = np.arange(len(idxs[0]))
        for i in range(length):
            for j in range(i, length):
                theta = np.zeros((len(xs), len(p0)))
                if i == j:
                    axes = plot_figure.add_subplot(G[i, i + 2])
                    subplots[i, i + 2] = axes

                    def fplot(theta_i):
                        theta[:, i] = theta_i
                        return integrand(theta)[:, 1 + len(p0) + mat[i, i]]

                    axes.plot(xs,
                              fplot(xs),
                              '-k',
                              label=R'$p_{%d}^2\cdot L$ along $p_{%d}$' %
                              (i, i))
                    axes.legend(loc=1, fontsize='small')
                else:  # i != j

                    def fplot_p(theta_ij):
                        theta[:, i] = theta_ij
                        theta[:, j] = theta_ij
                        return integrand(theta)[:, 1 + len(p0) + mat[i, j]]

                    def fplot_m(theta_ij):
                        theta[:, i] = theta_ij
                        theta[:, j] = -theta_ij
                        return integrand(theta)[:, 1 + len(p0) + mat[i, j]]

                    axes = plot_figure.add_subplot(G[i, j + 2])
                    subplots[i, j + 2] = axes
                    axes.plot(
                        xs,
                        fplot_p(xs),
                        '-k',
                        label=
                        R'$p_{%d}\cdot p_{%d}\cdot L$ along $p_{%d}=p_{%d}$' %
                        (i, j, i, j))
                    axes.legend(loc=1, fontsize='small')
                    axes = plot_figure.add_subplot(G[j, i + 2])
                    subplots[j, i + 2] = axes
                    axes.plot(
                        xs,
                        fplot_m(xs),
                        '-k',
                        label=
                        R'$p_{%d}\cdot p_{%d}\cdot L$ along $p_{%d}=-p_{%d}$' %
                        (i, j, i, j))
                    axes.legend(loc=1, fontsize='small')

    # INTEGRAL

    func_mean = np.vectorize(lambda x: x.mean, otypes=['float64'])
    func_sdev = np.vectorize(lambda x: x.sdev, otypes=['float64'])

    def matrify(I):
        par = np.asarray(I[:len(p0)])
        cov = np.empty(cov0.shape, dtype=gvar.GVar)
        cov[idxs] = I[len(p0):]
        cov.T[idxs] = cov[idxs]
        return par, cov

    # takes the integration result and computes average and covariance dividing by normalization
    def normalize(I):
        par = [I[j] / I[0] for j in range(1, len(p0) + 1)]
        cov_u = [
            I[j + len(par) + 1] / I[0] - par[idxs[0][j]] * par[idxs[1][j]]
            for j in range(len(idxs[0]))
        ]
        return matrify(par + cov_u)

    # do inverse variable transform
    def target_result(I):
        par, cov = normalize(I)
        par = V.dot(M * par + Q)
        cov = V.dot(np.outer(M, M) * cov).dot(V.T)
        return np.concatenate((par, cov[idxs]))

    if isinstance(relax, str):
        relax = [relax]
    if 'x' in relax:
        if dx is None:
            nrelax = np.ones(len(p0), dtype=bool)
        else:
            nrelax = np.arange(len(p0)) < len(p0) - len(x)
    ignore_corr = 'corr' in relax
    if hasattr(relax, '__iter__') and all([isinstance(a, bool)
                                           for a in relax]):
        nrelax = ~np.asarray(relax)
    if hasattr(relax, '__getitem__') and 'indexes' in relax:
        nrelax = ~np.asarray(relax['indexes'])

    # compute objects on which errors are defined: avg, var, (1-corr)**2
    gamma = 1
    err_np0 = np.sum(nrelax)
    err_idxs = np.diag_indices(
        err_np0) if 'corr' in relax else np.triu_indices(err_np0)
    nrelax2 = np.outer(nrelax, nrelax)

    def target_error(I):
        par, cov = matrify(I)
        par = par[nrelax]
        cov = cov[nrelax2].reshape(2 * [err_np0])
        sigma = np.sqrt(np.diag(cov))
        var_onemcor2 = (1 - cov / np.outer(sigma, sigma))**2
        np.fill_diagonal(var_onemcor2, np.diag(cov))

        if gamma != 1:
            Q[:] = gamma * Q + (1 - gamma) * (V.T.dot(func_mean(par)) - C * M)
            M[:] = gamma * M + (1 - gamma) * np.sqrt(
                np.diag(V.T.dot(func_mean(cov)).dot(V)))

        return np.concatenate((par, var_onemcor2[err_idxs]))

    epsrel = np.ones([err_np0] * 2) * onemcor_relerr / sigma * 2
    np.fill_diagonal(epsrel, var_relerr / sigma)
    epsrel = np.concatenate((np.zeros(err_np0), epsrel[err_idxs]))

    epsabs = np.zeros(epsrel.shape)
    epsabs[:err_np0] = avg_abserr[nrelax] / sigma

    I = mc_integrator_2(integrand,
                        bounds,
                        target_result=target_result,
                        target_error=target_error,
                        epsrel=epsrel,
                        epsabs=epsabs,
                        print_info=print_info)

    # FINALLY, RESULT!

    par, cov = matrify(I)

    if print_info:
        print()
        # print('Normalized result:')
        # print(lab.format_par_cov(func_mean((V.T.dot(par) - Q) / M), func_mean(V.T.dot(cov).dot(V) / np.outer(M, M))))
        # print('Diagonalized result:')
        # print(lab.format_par_cov(func_mean(V.T.dot(par)), func_mean(V.T.dot(cov).dot(V))))

    # plot final variable transform
    if not (plot_figure is None) and gamma != 1:
        for i in range(length):
            axes = subplots[i, 0]
            theta = np.zeros((len(xs), len(p0)))

            def fplot(theta_i):
                theta[:, i] = theta_i
                return integrand(theta)[:, 0]

            axes.plot(xs, fplot(xs), '-r')
            axes.legend(loc=1)

        for i in range(length):
            axes = subplots[i, 1]
            theta = np.zeros((len(xs), len(p0)))

            def fplot(theta_i):
                theta[:, i] = theta_i
                return integrand(theta)[:, 1 + i]

            axes.plot(xs, fplot(xs), '-r')
            axes.legend(loc=1, fontsize='small')

        for i in range(length):
            for j in range(i, length):
                theta = np.zeros((len(xs), len(p0)))
                if i == j:
                    axes = subplots[i, i + 2]

                    def fplot(theta_i):
                        theta[:, i] = theta_i
                        return integrand(theta)[:, 1 + len(p0) + mat[i, i]]

                    axes.plot(xs, fplot(xs), '-r')
                else:  # i != j

                    def fplot_p(theta_ij):
                        theta[:, i] = theta_ij
                        theta[:, j] = theta_ij
                        return integrand(theta)[:, 1 + len(p0) + mat[i, j]]

                    def fplot_m(theta_ij):
                        theta[:, i] = theta_ij
                        theta[:, j] = -theta_ij
                        return integrand(theta)[:, 1 + len(p0) + mat[i, j]]

                    axes = subplots[i, j + 2]
                    axes.plot(xs, fplot_p(xs), '-r')
                    axes = subplots[j, i + 2]
                    axes.plot(xs, fplot_m(xs), '-r')

    dpar = func_sdev(par)
    dcov = func_sdev(cov)

    mpar = func_mean(par)
    mcov = func_mean(cov)

    if print_info:
        print('Starting estimate was:')
        print(lab.format_par_cov(par0, cov0))
        print('Result:')
        print(lab.format_par_cov(mpar, mcov))
        print('Averages with computing errors:')
        print(par)
        print('Standard deviations with computing errors:')
        sigma = np.sqrt(np.diag(cov))
        print(sigma)
        print('Correlations with computing errors:')
        print(cov / np.outer(sigma, sigma))
        print()
        print('############### END fit_bayes ###############')

    return mpar, mcov, dpar, dcov
    p0 = [A, B, 36, D, 200]
    curva = CurveModel(trasmittivita, symb=True)
    out = fit_curve(curva,
                    t,
                    volt,
                    dy=dV,
                    dx=dt,
                    p0=p0,
                    pfix=[False, True, True, False, False],
                    absolute_sigma=False,
                    method='odrpack')
    par = out.par
    cov = out.cov
    err = sqrt(diag(cov))

    print(numbers[i], 'F = %s' % xe(par[4], err[4]), std(diff(volt)))
    if numbers[i] != '06c':
        subplot(altez, largh, n_subplot)
        ylim(-550, 0)
        if len(files) - n_subplot <= largh:
            xlabel('t [ms]')
        if (n_subplot - 1) % largh != 0:
            yticks(array([]))
        else:
            ylabel('segn. [mV]')
        n_subplot += 1
        plot(t,
             volt,
             '.k',
             markersize=1,
             label='file: %s\n$F$ = %.0f' % tuple((numbers[i], par[4])))
예제 #15
0
                    ordini_fit,
                    t[piccoinquestione],
                    dy=0.5 * 0.68 * (t[1] - t[0]),
                    p0=[1, 1],
                    absolute_sigma=True)
    par = out.par
    cov = out.cov
    m_fit = par[0]
    q_fit = par[1]
    dm_fit, dq_fit = sqrt(diag(cov))
    m.append(m_fit)
    q.append(q_fit)
    dm.append(dm_fit)
    dq.append(dq_fit)
    print('picco %s: m = %s  q = %s' %
          (nomipicchi[k], xe(m_fit, dm_fit), xe(q_fit, dq_fit)))
    plot(ordini, retta(ordini_fit, *par))

xticks(arange(0, n_ordini, 1))
xlim(-0.3, n_ordini - 1 + 0.3)
ylim(min(t), max(t))
ylabel('t [ms]')
xlabel('ordine')

m = array(m)
dm = array(dm)
q = array(q)
dq = array(dq)
uFSR = gvar(m.mean(), dm.mean() / sqrt(3))
diffq = diff(q)
udeltaq_sinistra = gvar(diffq[0], dq.mean() * sqrt(2))
err = sqrt(diag(cov))
chi2norm = out.chisq / out.chisq_dof
pvalue = out.chisq_pvalue

out = fit_curve(cos2o, angolo, Vpp, dy=dy, p0=[60, -90, 1])
paro = out.par
covo = out.cov
erro = sqrt(diag(covo))
print(paro, erro)
chi2normo = out.chisq / out.chisq_dof
pvalueo = out.chisq_pvalue

plot(
    angolo,
    cos2(angolo, *par),
    '-',
    color='tab:orange',
    label=
    '$y = a \cdot \cos^2(x-b)$\n$\\frac{\chi^2}{dof} = %.2f \qquad b_{fit} = %s$\n'
    % (chi2norm, xe(par[1], err[1])))
plot(
    angolo,
    cos2o(angolo, *paro),
    '-',
    color='tab:green',
    label=
    '$y = a \cdot \cos^2(x-b) + c$\n$\\frac{\chi^2}{dof} = %.2f \qquad b_{fit} = %s$'
    % (chi2normo, xe(paro[1], erro[1])))
legend(fontsize='x-large', loc=0)
xlabel('$\\varphi$ [°]', fontsize='large')
ylabel('$V_{pp}$ [mV]', fontsize='large')