From 4d2533036108e982d525055922fb37612d30e5d6 Mon Sep 17 00:00:00 2001 From: Jacopo Basso Ricci Date: Mon, 9 Nov 2026 18:20:54 +0100 Subject: [PATCH] =?UTF-8?q?Velocit=C3=A0=20della=20luce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- csv/velocita-C/C.csv | 71 ++++++++ csv/velocita-C/D1.csv | 2 + csv/velocita-C/D2.csv | 2 + csv/velocita-C/D3.csv | 2 + csv/velocita-C/c - dati grezzi.xlsx | Bin 0 -> 24424 bytes focaleLente.py | 1 - pyproject.toml | 10 ++ statistica.py | 149 ++++++++-------- velocitaC.py | 262 ++++++++++++++++++++++++++++ 9 files changed, 423 insertions(+), 76 deletions(-) create mode 100644 csv/velocita-C/C.csv create mode 100644 csv/velocita-C/D1.csv create mode 100644 csv/velocita-C/D2.csv create mode 100644 csv/velocita-C/D3.csv create mode 100644 csv/velocita-C/c - dati grezzi.xlsx create mode 100644 velocitaC.py diff --git a/csv/velocita-C/C.csv b/csv/velocita-C/C.csv new file mode 100644 index 0000000..9bdf22d --- /dev/null +++ b/csv/velocita-C/C.csv @@ -0,0 +1,71 @@ +f_finale;f_iniziale;x_finale;x_iniziale +-907;-50;5,78;5,55 +-1444;-29;5,78;5,23 +-920;-76;5,62;5,37 +-900;-62;5,62;5,38 +-910;-110;5,61;5,35 +-923;-84;5,57;5,38 +-683;-56;5,58;5,4 +-850;-107;5,57;5,35 +-791;-129;5,56;5,37 +-834;-75;5,57;5,32 +-826;-112;5,52;5,32 +-811;-130;5,52;5,32 +-915;-70;5,54;5,29 +-894;-31;5,54;5,3 +-850;-100;5,52;5,31 +-797;-126;5,52;5,32 +-908;-16;5,55;5,29 +-921;-50;5,53;5,27 +-831;-42;5,52;5,31 +-900;-136;5,5;5,28 +-914;-58;5,52;5,26 +-1495;-75;5,1;4,69 +893;39;6,1;5,85 +862;55;6,09;5,85 +922;137;6,1;5,88 +829;25;5,98;5,75 +911;60;6,1;5,87 +849;81;6,08;5,86 +910;65;6,1;5,86 +713;30;6,04;5,84 +887;43;6,09;5,85 +901;64;6,1;5,86 +836;72;6,07;5,86 +890;29;6,09;5,85 +918;36;6,09;5,86 +927;77;6,11;5,87 +822;87;6,06;5,86 +789;136;6,05;5,87 +884;128;6,07;5,87 +722;100;6,03;5,85 +926;112;6,08;5,85 +842;135;6,09;5,88 +-748;767;5,63;6,08 +-631;532;5,64;5,98 +-920;900;5,55;6,05 +-910;915;5,55;6,07 +-757;858;5,6;6,06 +-882;866;5,55;6,05 +-758;920;5,59;6,08 +-790;693;5,6;6,01 +-840;929;5,59;6,08 +-905;929;5,55;6,05 +-679;897;5,59;6,04 +-714;808;5,59;6,02 +-673;796;5,57;6 +-612;935;5,59;6,04 +-817;927;5,52;6,02 +-607;805;5,56;5,97 +-769;833;5,51;5,97 +-880;937;5,48;5,99 +-920;900;5,5;6,01 +-798;801;5,54;5,99 +-789;731;5,52;5,94 +-765;935;5,52;5,99 +-935;787;5,47;5,96 +-935;781;5,45;5,94 +-739;938;5,51;5,99 +-936;948;5,48;6,02 +-754;930;5,53;6,01 +-492;896;5,62;6,01 diff --git a/csv/velocita-C/D1.csv b/csv/velocita-C/D1.csv new file mode 100644 index 0000000..e053807 --- /dev/null +++ b/csv/velocita-C/D1.csv @@ -0,0 +1,2 @@ +D1;D2;D3;D4;D5;D6;D7 +6,2;6,19;6,19;6,19;6,2;6,19;6,2 diff --git a/csv/velocita-C/D2.csv b/csv/velocita-C/D2.csv new file mode 100644 index 0000000..f3094c3 --- /dev/null +++ b/csv/velocita-C/D2.csv @@ -0,0 +1,2 @@ +D1;D2;D3;D4;D5;D6;D7 +6,66;6,66;6,66;6,65;6,67;6,67;6,67 diff --git a/csv/velocita-C/D3.csv b/csv/velocita-C/D3.csv new file mode 100644 index 0000000..bf1f828 --- /dev/null +++ b/csv/velocita-C/D3.csv @@ -0,0 +1,2 @@ +D1;D2;D3;D4;D5;D6;D7 +0,67;0,65;0,65;0,66;0,66;0,65;0,66 diff --git a/csv/velocita-C/c - dati grezzi.xlsx b/csv/velocita-C/c - dati grezzi.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2a9c6ea014fc98ca6c9b7a78465fb977068dd43b GIT binary patch literal 24424 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 literal 0 HcmV?d00001 diff --git a/focaleLente.py b/focaleLente.py index d0c53ce..00a7d1d 100644 --- a/focaleLente.py +++ b/focaleLente.py @@ -20,7 +20,6 @@ def _(): Data = defs["Data"] compat = defs["compat"] media_pesata = defs["media_pesata"] - media_pesata_dersimonian_laird = defs["media_pesata_dersimonian_laird"] rimuovi_outlier = defs["rimuovi_outlier"] plot_gauss = defs["plot_gauss"] cartella_csv = Path(__file__).resolve().parent / "csv" / "focaleLente" diff --git a/pyproject.toml b/pyproject.toml index 11c1fbb..b2a0168 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ dependencies = [ "altair>=6.3.0", "marimo>=0.25.0", "matplotlib>=3.11.2", + "mcp>=2.3.0", "numpy>=2.5.3", "pandas>=3.0.6", "scipy>=1.18.1", @@ -22,3 +23,12 @@ lofm = "lofm:main" [build-system] requires = ["uv_build>=0.12.19,<0.13.0"] build-backend = "uv_build" + +[dependency-groups] +dev = [ + "python-lsp-ruff>=2.3.4", + "python-lsp-server>=1.15.0", + "vegafusion>=2.0.3", + "vl-convert-python>=1.9.0.post1", + "websockets>=17.3", +] diff --git a/statistica.py b/statistica.py index 17ac636..03cd773 100644 --- a/statistica.py +++ b/statistica.py @@ -185,9 +185,15 @@ def _(np, pd, stats): valori_puliti, rimossi = rimuovi_outlier(valori, err_strum) n = len(valori_puliti) - s = valori_puliti.std(ddof=1) - if err_della_media: s /= np.sqrt(n) - u = np.sqrt(s**2 + err_strum**2) + if n > 2: + s = valori_puliti.std(ddof=1) + if err_della_media: + s /= np.sqrt(n) + u = np.sqrt(s**2 + err_strum**2) + else: + s = 0.0 + u = float(err_strum) + self.analisi_stat.loc[i, prefix] = valori_puliti.mean() self.analisi_stat.loc[i, f"u{prefix}_strum"] = err_strum @@ -199,7 +205,7 @@ def _(np, pd, stats): return self Data.stat_chauv = stat_chauv - return + return (trova_outlier,) @app.cell(hide_code=True) @@ -207,90 +213,83 @@ def _(mo): mo.md(r""" # Media pesata - input: - - array x: valori - - array ux: uvalori - output: - - xm: x medio - - uxm: sigma x medio - - chi2: $\chi^2$ - - dof: gradi di libertà - - Pchi2: $P(\chi^2)$ + **media_pesata( x, ux, chauvenet=True, info_outlier=False )** + + *input:* + - array x: valori + - array ux: incertezze (tutte > 0) + - chauvenet: se True applica il criterio di Chauvenet gia' definito + (trova_outlier / p_t_student), con incertezza di_resolutione data + dall'RMS delle ux del campione + - info_outlier: se True aggiunge la lista dei punti scartati + + *output:* + - xm: x medio + - uxm: sigma x medio + - chi2: chi quadro ridotto $\tilde\chi^2$ + - dof: gradi di liberta + - Pchi2: $P(\chi^2)$ + - out: [(valore, incertezza)] rimossi, solo se info_outlier=True data: - - prefix: prefisso del nome della variabile + - prefix: prefisso del nome della variabile """) return @app.cell -def _(np, stats): - def media_pesata(x, ux): - x, ux = np.asarray(x, float), np.asarray(ux, float) - w = 1 / ux**2 - xm = np.sum(w * x) / np.sum(w) - uxm = 1 / np.sqrt(np.sum(w)) - chi2 = np.sum(w * (x - xm) ** 2) - dof = len(x) - 1 - return xm, uxm, chi2/dof, dof, stats.chi2.sf(chi2, dof) +def _(np, stats, trova_outlier): + def media_pesata(x, ux, chauvenet=True, info_outlier=False): + x, ux = np.asarray(x, float).ravel(), np.asarray(ux, float).ravel() + + if x.shape != ux.shape: + raise ValueError("media_pesata: x e ux devono avere la stessa lunghezza") + + validi = np.isfinite(x) & np.isfinite(ux) + x, ux = x[validi], ux[validi] + + if len(x) and np.any(ux <= 0): + raise ValueError("media_pesata: tutte le incertezze devono essere > 0") + + out = [] + if chauvenet: + # Chauvenet gia' presente nel notebook: trova_outlier -> p_t_student + # qui l'incertezza di risoluzione e' l'RMS delle ux del campione corrente + while len(x) > 2: + idx = trova_outlier(x, np.sqrt(np.mean(ux**2))) + if idx is None: + break + out.append((x[idx], ux[idx])) + x = np.delete(x, idx) + ux = np.delete(ux, idx) + + if len(x) == 0: + return np.nan, np.nan, np.nan, 0, np.nan, [] + + w = 1 / ux**2 + xm = np.sum(w * x) / np.sum(w) + uxm = 1 / np.sqrt(np.sum(w)) + chi2 = np.sum(w * (x - xm) ** 2) + dof = len(x) - 1 + chi2_red = chi2 / dof if dof > 0 else np.nan + P = stats.chi2.sf(chi2, dof) if dof > 0 else np.nan + + if info_outlier: + return xm, uxm, chi2_red, dof, P, out + return xm, uxm, chi2_red, dof, P + + + def media_pesata_data(self, prefix, chauvenet=True, info_outlier=False): + return media_pesata(self.analisi_stat[prefix], + self.analisi_stat[f"u{prefix}"], + chauvenet=chauvenet, + info_outlier=info_outlier) - def media_pesata_data(self, prefix): - return media_pesata(self.analisi_stat[prefix], self.analisi_stat[f"u{prefix}"]) Data.media_pesata = media_pesata_data return -@app.cell -def _(np, stats): - def media_pesata_dersimonian_laird(x, ux): - x, ux = np.asarray(x, float), np.asarray(ux, float) - n = len(x) - dof = n - 1 - - if n <= 1: - raise ValueError("Il dataset deve contenere almeno due misure.") - if np.any(ux <= 0): - raise ValueError("Le incertezze (ux) devono essere strettamente maggiori di zero.") - - # --- STEP 1: Calcolo standard (Effetti Fissi) per stimare il Chi2 originale --- - w_fixed = 1 / ux**2 - sum_w_fixed = np.sum(w_fixed) - xm_fixed = np.sum(w_fixed * x) / sum_w_fixed - chi2_fixed = np.sum(w_fixed * (x - xm_fixed) ** 2) - - # --- STEP 2: Stima della varianza extra (Tau^2) --- - # Formula di DerSimonian-Laird - sum_w2_fixed = np.sum(w_fixed**2) - numerator = chi2_fixed - dof - denominator = sum_w_fixed - (sum_w2_fixed / sum_w_fixed) - - # Tau^2 non può essere negativo. Se il Chi2 è minore del dof, Tau^2 = 0 - tau2 = max(0.0, numerator / denominator) - - # --- STEP 3: Ricalcolo con Effetti Casuali (Random Effects) --- - w_random = 1 / (ux**2 + tau2) - sum_w_random = np.sum(w_random) - - xm_random = np.sum(w_random * x) / sum_w_random - uxm_random = 1 / np.sqrt(sum_w_random) - - # Nota: Il p-value finale del Chi2 si riferisce alla consistenza iniziale dei dati - p_value = stats.chi2.sf(chi2_fixed, dof) - - return { - "media": xm_random, - "errore_media": uxm_random, - "tau2": tau2, - "tau": np.sqrt(tau2), - "chi2_originale": chi2_fixed, - "dof": dof, - "p_value": p_value - } - - return - - @app.cell(hide_code=True) def _(mo): mo.md(r""" diff --git a/velocitaC.py b/velocitaC.py new file mode 100644 index 0000000..7f50699 --- /dev/null +++ b/velocitaC.py @@ -0,0 +1,262 @@ +import marimo + +__generated_with = "0.25.2" +app = marimo.App(width="medium") + + +@app.cell +def _(): + import marimo as mo + import numpy as np + import pandas as pd + import sympy as sp + from scipy import stats + + from pathlib import Path + + import statistica + + _outputs, defs = statistica.app.run() + Data = defs["Data"] + compat = defs["compat"] + media_pesata = defs["media_pesata"] + rimuovi_outlier = defs["rimuovi_outlier"] + plot_gauss = defs["plot_gauss"] + cartella_csv = Path(__file__).resolve().parent / "csv" / "velocita-C" + # cartella_immagini = Path(__file__).resolve().parent / "LaTeX" / "immagini" + + def leggi_csv(nome): + dati = pd.read_csv(cartella_csv / nome, sep=";", decimal=",") + dati.columns = dati.columns.astype(str).str.strip() + dati = dati.dropna(axis=1, how="all") + return dati.apply(pd.to_numeric, errors="coerce") + + return Data, compat, leggi_csv, mo, pd, sp + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + # Velocità della luce — metodo di Foucault + + $$c = \frac{4 f_2 D^2 \left|\omega_{fin}-\omega_{in}\right|}{(D+a-f_2)\left|x_{fin}-x_{in}\right|}, + \qquad \omega = 2\pi f_r$$ + + dove $\omega_{in},\ \omega_{fin}$ sono le pulsazioni di rotazione e + $x_{in},\ x_{fin}$ le posizioni del fascio (zero arbitrario) relative alle + due letture dello stesso punto sperimentale. + + Le stime di $c$ dei singoli punti vengono combinate con una media pesata. + """) + return + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + ## Costanti geometriche (parte sistematica) + """) + return + + +@app.cell +def _(Data, leggi_csv, pd, sp): + _D1 = Data(leggi_csv("D1.csv")) + _D1.stat_chauv("D", 0.01, False) + + _D2 = Data(leggi_csv("D2.csv")) + _D2.stat_chauv("D", 0.01, False) + + _D3 = Data(leggi_csv("D3.csv")) + _D3.stat_chauv("D", 0.01, False) + + _D_tot = Data(None, analisi_stat = pd.DataFrame({ + "L1": [_D1.analisi_stat.D[0]], "uL1": [_D1.analisi_stat.uD[0]], + "L2": [_D2.analisi_stat.D[0]], "uL2": [_D2.analisi_stat.uD[0]], + "L3": [_D3.analisi_stat.D[0]], "uL3": [_D3.analisi_stat.uD[0]] + })) + + L1, L2, L3 = sp.symbols("L1 L2 L3", positive=True) + D = L1 + L2 + L3 + _D_tot.calc_var(D, "D") + + D, uD = _D_tot.analisi_stat.D[0], _D_tot.analisi_stat.uD[0] # Distanza specchio rotante - specchio concavo [m] + a, ua = 0.376, 0.002 # Distanza lente - specchio rotante [m] + f2, uf2 = 0.2536, 0.0005 # Lunghezza focale lente L2 [m] + return D, a, f2, uD, ua, uf2 + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + ## Dati grezzi + + Dati simulati, usati solo per verificare il procedimento. + + - `C.csv`: una riga per punto sperimentale, con le quattro letture + `f_iniziale`, `f_finale` in Hz e `x_iniziale`, `x_finale` in mm; + - le frequenze sono negative per il verso di rotazione assunto; + - `D1.csv`, `D2.csv`, `D3.csv`: le tre tratte che compongono + $D=L_1+L_2+L_3$. + + Dopo l'analisi statistica le posizioni vengono convertite da mm a m. + """) + return + + +@app.cell +def _(Data, leggi_csv): + err_strum = { + "f_finale" : 1, + "f_iniziale": 1, + "x_finale" : 0.01, + "x_iniziale": 0.01 + } # risoluzione strumentale: Hz, mm + + dati = Data(leggi_csv("C.csv")) + dati.stat_chauv(list(err_strum.keys()), list(err_strum.values())) + return (dati,) + + +@app.cell +def _(D, a, dati, f2, uD, ua, uf2): + dati.analisi_stat["D"] = D + dati.analisi_stat["uD"] = uD + dati.analisi_stat["a"] = a + dati.analisi_stat["ua"] = ua + dati.analisi_stat["f2"] = f2 + dati.analisi_stat["uf2"] = uf2 + + dati.analisi_stat + return + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + ## Analisi con criterio di Chauvenet + + Stessa analisi (`stat_chauv`) applicata sia ai punti con rotazione + sia alla baseline. Poi si converte `d` da mm a m e si riportano + $f_{r0}, d_0$ (baseline) come colonne costanti su tutte le righe dei + punti principali, dato che è la stessa misura per tutti. + """) + return + + +@app.cell +def _(dati): + # conversione mm -> m per le colonne di lunghezza + for _col in ["x_finale", "ux_finale", "x_iniziale", "ux_iniziale"]: + dati.analisi_stat[_col] = dati.analisi_stat[_col] * 1e-3 + + + dati.analisi_stat + return + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + ## Calcolo delle pulsazioni $\omega_{in}=2\pi f_{in}$ e $\omega_{fin}=2\pi f_{fin}$ + """) + return + + +@app.cell +def _(dati, sp): + _f_iniziale, _f_finale = sp.symbols("f_iniziale f_finale") + dati.calc_var(2 * sp.pi * _f_iniziale, "omega_iniziale") + dati.calc_var(2 * sp.pi * _f_finale, "omega_finale") + + dati.analisi_stat + return + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + ## Calcolo di $c$ punto per punto + + $D$, $a$ e $f_2$ sono riportate come colonne costanti **con le loro + incertezze** (`uD`, `ua`, `uf2`), quindi `calc_var` propaga la parte + geometrica insieme a quella sperimentale. Le colonne + `%uc_f_iniziale`, `%uc_f_finale`, `uc_x_...` danno il peso percentuale di + ciascun termine e mostrano quale incertezza domina il risultato. + """) + return + + +@app.cell(hide_code=True) +def _(formula_c, mo, sp): + mo.md(f""" + $c={sp.latex(formula_c)}$ + """) + return + + +@app.cell +def _(dati, sp): + _D, _a, _f2, _omega_iniziale, _omega_finale, _x_iniziale, _x_finale= sp.symbols("D a f2 omega_iniziale omega_finale x_iniziale x_finale", real=True) + + formula_c = 4 * _f2 * _D**2 * sp.Abs(_omega_finale - _omega_iniziale) / ((_D + _a - _f2) * sp.Abs(_x_finale - _x_iniziale)) + dati.calc_var(formula_c, "c") + + dati.analisi_stat + return (formula_c,) + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + ## Media pesata delle stime di $c$ + + Le stime indipendenti di $c$ — una per riga di `C.csv` — vengono combinate con + pesi $w_i = 1/u_{c,i}^2$. Prima di combinarle, `media_pesata` applica il + criterio di Chauvenet fra le stime; i punti rimossi sono riportati in `out`. + + Si riportano $\tilde\chi^2$ (chi quadro ridotto), i gradi di libertà e + $P(\chi^2)$ riferiti ai soli punti mantenuti. + """) + return + + +@app.cell +def _(dati): + c_stat, uc_stat, chi2, dof, P, out= dati.media_pesata("c", info_outlier=True) + + print(f"c (media pesata) = {c_stat:.6e} +- {uc_stat:.2e}") + print(f"chi2 = {chi2:.3f}, dof = {dof}, P(chi2) = {P:.3f}") + print(out) + return c_stat, uc_stat + + +@app.cell(hide_code=True) +def _(mo): + mo.md(r""" + ## Risultato finale e confronto col valore vero + """) + return + + +@app.cell +def _(c_stat, compat, mo, uc_stat): + c_vero = 299792458.0 + _k, _diff = compat(c_stat, c_vero, uc_stat, 0.0) + + mo.md( + f""" + $$c = \\left({c_stat/1e8:.3f} \\pm {uc_stat/1e8:.3f}\\right)\\times 10^8\\ \\mathrm{{m/s}}$$ + + Confronto col valore tabulato + $c_{{tab}} = {c_vero/1e8:.3f}\\times 10^8\\ \\mathrm{{m/s}}$: + differenza ${_diff:.2E}$ m/s, fattore di compatibilita **k = {_k:.2f}**, + calcolato con $u_{{tab}}=0$, cioe $k=|c-c_{{tab}}|/u_c$. + {"✅ compatibile ($k<2$)" if _k < 2 else "⚠️ non compatibile ($k\\ge 2$)"} + """ + ) + return + + +if __name__ == "__main__": + app.run()