Skip to content

Instantly share code, notes, and snippets.

@dennisangemi
Last active June 11, 2023 00:03
Show Gist options
  • Save dennisangemi/550a7c318a39f9697844f24e7a384c4a to your computer and use it in GitHub Desktop.
Save dennisangemi/550a7c318a39f9697844f24e7a384c4a to your computer and use it in GitHub Desktop.
Funzioni (bozze) MATLAB per gestire cifre significative e bestfit
function r = bravpear(x,y)
% coefficiente di Bravais-Pearson
r = sum((x - repelem(mean(x),length(x),1)) .* (y - repelem(mean(y),length(y),1))) ./ ( sqrt(sum((x - repelem(mean(x),length(x),1)).^2) .* sum((y - repelem(mean(y),length(y),1)).^2)) );
end
% uncertainty significative rounding
function dx = usiground(dx)
% numero decimali
n = abs(floor(log10(dx)));
% lunghezza vettore dx
l = length(dx);
if l==1
dx = round(dx,n);
else
scale_factor = power(10, n);
dx = round(dx .* scale_factor) ./ scale_factor;
end
end
% significative rounding
% siground(x,dx)
% x: misura
% dx: incertezza
% Description: approssima al corretto numero di cifre decimali la misura x e
% l'incertezza dx. L'output sarà un numero e non un testo.
% usage: [x, dx] = siground(x,dx)
function [x, dx] = siground(x,dx)
% calcola numero di decimali
n = abs(floor(log10(dx)));
% calcola dimensione vettore
l = length(n);
if l==1
% approssima incertezza
dx = round(dx,n);
% approssima misura
x = round(x,n);
else
disp("Vettori non ancora supportati del tutto. Da testare")
scale_factor = power(10, n);
dx = round(dx .* scale_factor) ./ scale_factor;
x = round(x .* scale_factor) ./ scale_factor;
end
end
% determina i coefficienti della best-fit line utilizzando il metodo dei
% minimi quadrati
function [a, sigma_a, b, sigma_b] = best_fit_mmq(x,y,f)
% f: flag rounding, true or false
% best fit lineare nella forma
% y = A + Bx
% numero di punti
n = length(x);
delta = n.*sum(x.^2) - (sum(x)).^2;
% intercetta
a = ( (sum(x.^2).*sum(y)) - (sum(x).*sum(x.*y)) )./delta;
% coefficiente angolare
b = ( (n.*sum(x.*y)) - (sum(x).*sum(y)) )./delta;
% sigma y eq 8.15 Taylor
sigma_y = sqrt(sum((y - repelem(a,n,1) - repelem(b,n,1).*x).^2)./(n - 2)); %sigma_y = round(sigma_y,2)
% errore su a eq. 8.16 Taylor
sigma_a = sigma_y .* sqrt((sum(x.^2))./(delta));
% errore su b eq. 8.17 Taylor
sigma_b = sigma_y .* sqrt(n./delta);
% arrotondo sulla scelta utente
if f == true
sigma_a = usiground(sigma_a);
sigma_b = usiground(sigma_b);
a = siground(a,sigma_a);
b = siground(b,sigma_b);
end
end
% determina i coefficienti della best-fit line utilizzando il metodo dei
% minimi quadrati pesata. Formule della pagina 201 del Taylor
function [a, sigma_a, b, sigma_b] = weighted_best_fit_mmq(x,y,dy,f)
% f: flag rounding, true or false
% best fit lineare nella forma
% y = A + Bx
% pesi
w = 1./dy.^2;
% denominatore eq. 8.39 Taylor
delta = (sum(w).*sum(w.*x.^2)) - (sum(w.*x)).^2;
% intercetta eq. 8.37 Taylor
a = ( (sum(w.*x.^2).*sum(w.*y)) - (sum(w.*x).*sum(w.*x.*y)) )./delta;
% coefficiente angolare eq. 8.38 Taylor
b = ( (sum(w).*sum(w.*x.*y)) - (sum(w.*x).*sum(w.*y)) )./delta;
% errore su a
sigma_a = sqrt((sum(w.*x.^2))./delta);
% errore su b
sigma_b = sqrt(sum(w)./delta);
% arrotondo sulla scelta utente
if f == true
sigma_a = usiground(sigma_a);
sigma_b = usiground(sigma_b);
a = siground(a,sigma_a);
b = siground(b,sigma_b);
end
end
% approssima misura e incertezza allo stesso numero di cifre significative
% e converti in testo
% input
% x: misura
% dx: incertezza misura
function [tx, tdx] = single_signum2str(x,dx)
% calcolo numero di cifre a cui approssimare
n = abs(floor(log10(dx)));
% tdx = num2str(round(dx,n));
tdx = num2str(usiground(dx));
% costruisco formato dinamico (e.g. %.4f)
formato = ['%.', num2str(n), 'f'];
% creo stringa
tx = sprintf(formato, x);
end
function [tx, tdx] = signum2str(x,dx)
% fa la stessa cosa di signum2str(x,dx) ma opera su x e dx vettoriali
% della stessa lunghezza
% calcola lunghezza x e dx
if length(x) == length(dx)
l = length(x);
% se il vettore è di lunghezza 1, ovvero è uno scalare, usa la
% funzione single_signum2str().
% Questo generalizza signum2str() che
% si può usare sia nel caso scalare che vettoriale
if l==1
[tx, tdx] = single_signum2str(x,dx);
else
% inizializza array di stringhe
tx = strings(l,1);
tdx = tx;
for i=1:l
[tx(i), tdx(i)] = signum2str(x(i),dx(i));
end
end
else
disp("Error: length mismatch")
end
end
% chi quadro di un fit
function chi = fitchisquarered(y,dy,yfit,params)
chi = sum(((yfit-y)./dy).^2)./(length(y)-params);
end
@dennisangemi
Copy link
Author

dennisangemi commented Jun 10, 2023

Osservazioni:

  • siground si potrebbe rendere vettoriale come fatto in usiground
  • inutile usare usiground in siground. In questo modo calcolo n due volte

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment