Last active
June 11, 2023 00:03
-
-
Save dennisangemi/550a7c318a39f9697844f24e7a384c4a to your computer and use it in GitHub Desktop.
Funzioni (bozze) MATLAB per gestire cifre significative e bestfit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Osservazioni: