<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sigfrido11.github.io/personal_website/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sigfrido11.github.io/personal_website/" rel="alternate" type="text/html" /><updated>2026-03-05T13:14:01+00:00</updated><id>https://sigfrido11.github.io/personal_website/feed.xml</id><title type="html">Giuseppe Luciano</title><subtitle>Sito personale di Giuseppe Luciano con post e progetti.</subtitle><entry xml:lang="it"><title type="html">Razzo</title><link href="https://sigfrido11.github.io/personal_website/2026/02/18/rocket.html" rel="alternate" type="text/html" title="Razzo" /><published>2026-02-18T00:00:00+00:00</published><updated>2026-02-18T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/2026/02/18/rocket-</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/2026/02/18/rocket.html"><![CDATA[<h1 id="simulatore-fase-di-decollo-di-un-razzo">Simulatore fase di decollo di un razzo</h1>

<p>Lo scopo del seguente progetto è quello di simulare un lanciatore dal momento del decolllo, che avviene sulla linea dell’equatore, fino al possibile raggiungimento dell’orbita. Tale progetto ha richiesto l’accoppiamento coerente di aerodinamica, termodinamica e meccanica orbitale all’interno di uno schema numerico stabile.<br />
Questo simulatore, sviluppato in <strong>C++20</strong> con <strong>SFML</strong>, cerca di modellare un’ascesa fisicamente consistente evitando le semplificazioni puramente cinematiche.</p>

<p>Tale progetto può essere visionato premendo il pulsante qui sotto.</p>

<div class="rocket_repo project-actions">
  <a class="btn" href="https://github.com/Sigfrido11/Rocket_simulator" target="_blank" rel="noopener">
    Visita la repository
  </a>
</div>

<div class="yt-embed" data-youtube-embed="" data-youtube-url="https://youtu.be/lEfwqOcSzAE">
    <button class="yt-embed__poster" type="button" aria-label="Riproduci video: Razzo">
      <span class="yt-embed__badge">
        Guarda video
      </span>
      <span class="yt-embed__play" aria-hidden="true"></span>
    </button>
    <noscript>
      <div class="yt-embed__noscript">
        <a class="btn secondary" href="https://youtu.be/lEfwqOcSzAE" target="_blank" rel="noopener">
          Apri su YouTube
        </a>
      </div>
    </noscript>
  </div>

<h2 id="come-usare-il-programma">Come usare il programma</h2>

<p>La notevole complessità del programma ci ha costretti ad utilizzare parecchi parametri di input che l’utente avrebbe dovuto fornire al momento dell’avvio della simulazione. Per evitare quindi di rendere il programma inacessibile ad un utente non esperto e rendere difficoltosa la fase di inserimento dati, all’avvio della simulazione verrà chiesto se utilizzare il modello basato sui motori base, versione semplificata con pochi parametri, oppure una versione avanzata che richiede la conoscenza di numerosi parametri.</p>

<p>Tali dati possono essere comodamente inseriti dall’utente nel file:</p>

<p><code class="language-plaintext highlighter-rouge">assets/input_data/simulation_params.json</code></p>

<p>Per comodità valori di defaul ragionevoli sono stati già settati. Ecco di seguito una breve descrizione di tutti i parametri.</p>

<p><strong>Attenzione</strong> se si sceglie di usare motori avanzati una modifica nella sezione dei motori di base non sortirà alcun effetto e viceversa.</p>

<h2 id="parametri-di-configurazione">Parametri di configurazione</h2>

<table>
  <thead>
    <tr>
      <th>Parametro</th>
      <th>Descrizione</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Razzo</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.name</code></td>
      <td>Nome identificativo del lanciatore.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.stage_num</code></td>
      <td>Numero totale di stadi (1 solido iniziale + N  motori a combustibile liquido).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.mass_structure_kg</code></td>
      <td>Massa strutturale principale del veicolo, escluse masse di propellente e serbatoi.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.upper_area_m2</code></td>
      <td>Area frontale equivalente utilizzata nel calcolo della resistenza aerodinamica.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.solid_propellant_mass_kg</code></td>
      <td>Massa totale del propellente dello stadio solido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.solid_container_mass_kg</code></td>
      <td>Massa strutturale del booster solido, rimossa alla separazione.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.solid_engine_count</code></td>
      <td>Numero di motori a combustibile solido attivi contemporaneamente.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.liquid_propellant_masses_kg</code></td>
      <td>Elenco delle masse di propellente per ciascuno stadio a combustibile liquido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.liquid_container_masses_kg</code></td>
      <td>Elenco delle masse strutturali dei serbatoi per ogni stadio a combustibile liquido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.liquid_engines_per_stage</code></td>
      <td>Numero di motori a combustibile liquido attivi per ciascun stadio.</td>
    </tr>
    <tr>
      <td>Motori base</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.isp_s</code></td>
      <td>Impulso specifico del motore espresso in secondi.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.cm</code></td>
      <td>Coefficiente perdita di massa.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.chamber_pressure_pa</code></td>
      <td>Pressione in camera di combustione (Pa).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.burn_area_m2</code></td>
      <td>Area effettiva di combustione del propellente nel modello base.</td>
    </tr>
    <tr>
      <td>Motori avanzati a propellente solido</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.burn_area_m2</code></td>
      <td>Superficie iniziale di combustione del grano solido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.nozzle_throat_area_m2</code></td>
      <td>Area della gola dell’ugello del motore solido (controlla la portata).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.nozzle_exit_area_m2</code></td>
      <td>Area di uscita dell’ugello del motore solido (influenza l’espansione dei gas).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.chamber_temperature_k</code></td>
      <td>Temperatura dei gas in camera di combustione (K).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.grain_dimension_m</code></td>
      <td>Dimensione caratteristica del grano solido, influenza l’evoluzione della combustione.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.grain_density_kg_m3</code></td>
      <td>Densità del propellente solido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.burn_rate_a</code></td>
      <td>coefficiente di velocità di combustione del propellente solido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.burn_rate_n</code></td>
      <td>Esponente pressione nella legge di regressione del propellente solido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.propellant_molar_mass_g_mol</code></td>
      <td>Massa molare dei prodotti di combustione del motore solido (g/mol).</td>
    </tr>
    <tr>
      <td>Motori avanzati a propellente liquido</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.chamber_pressure_pa</code></td>
      <td>Pressione in camera del motore liquido (Pa).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.nozzle_throat_area_m2</code></td>
      <td>Area della gola dell’ugello del motore liquido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.nozzle_exit_area_m2</code></td>
      <td>Area di uscita dell’ugello del motore liquido.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.chamber_temperature_k</code></td>
      <td>Temperatura dei gas in camera nel motore liquido (K).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.propellant_molar_mass_g_mol</code></td>
      <td>Massa molare dei gas di combustione nel motore liquido (g/mol).</td>
    </tr>
  </tbody>
</table>

<p>Verrà inoltre richiesto all’utente di inserire l’altezza alla quale il razzo proverà a raggiungere l’orbita, tale altezza <strong>deve</strong> essere superiore a 60’000 m.</p>

<h1 id="organizzazione-dei-file-principali">Organizzazione dei file principali</h1>

<ul>
  <li>Rocket → gestione del razzo, dinamica  e cinematica</li>
  <li>Engine → fisica della di tutte le tipologie di motori selezionabili</li>
  <li>Atmosfera → simulazione dei parametri atmosferici alle diverse quote</li>
</ul>

<h1 id="implementazione-del-core-dinamico-rocketcpp">Implementazione del Core Dinamico: <code class="language-plaintext highlighter-rouge">rocket.cpp</code></h1>

<p>Il file <code class="language-plaintext highlighter-rouge">rocket.cpp</code> rappresenta il cuore dinamico e cinematico del simulatore:
è qui che convergono <strong>propulsione, aerodinamica, gravità, gestione degli stadi e integrazione numerica</strong>. gestendo quindi la parte di evoluzione temporale della simulazione.</p>

<hr />

<h2 id="scelta-del-sistema-di-riferimento">Scelta del Sistema di Riferimento</h2>

<p>La simulazione utilizza un <strong>sistema inerziale centrato nel centro della Terra</strong>, in coordinate polari:</p>

\[(r, \psi)\]

<p>dove:</p>

<ul>
  <li>( r ) = distanza dal centro terrestre</li>
  <li>( $\psi$ ) = angolo polare</li>
  <li>( $v_r$ ) = velocità radiale</li>
  <li>( $v_t$ ) = velocità tangenziale</li>
</ul>

<h3 id="perché-non-un-sistema-cartesiano">Perché non un sistema cartesiano?</h3>

<p>Un sistema cartesiano richiederebbe:</p>

<ul>
  <li>Gestione esplicita della curvatura terrestre</li>
  <li>Normalizzazione continua del vettore gravità</li>
  <li>Maggiore instabilità numerica a grande quota</li>
  <li>Maggiori  difficoltà nella visualizzazione grafica della posizione del razzo</li>
</ul>

<hr />

<h1 id="integrazione-numerica-rungekutta-2-midpoint-method">Integrazione Numerica: Runge–Kutta 2 (Midpoint Method)</h1>

<p>Nel file si utilizza un <strong>RK2 (metodo del punto medio)</strong> per aggiornare velocità e posizione.</p>

<h3 id="perché-non-eulero-esplicito">Perché non Eulero esplicito?</h3>

<p>L’integratore di Eulero classico:</p>

\[x_{n+1} = x_n + v_n \Delta t\]

<p>introduce:</p>

<ul>
  <li>Peggiore conservazione dell’energia durante l’evoluzione temporale della simulazione</li>
  <li>Instabilità in regime orbitale</li>
  <li>Errori amplificati nei termini centrifughi ( $\frac{v_t^2}{r}$ )</li>
</ul>

<h3 id="equazioni-implementate">Equazioni implementate</h3>

<p>In coordinate polari inerziali:
\(\dot{v_r} = \frac{F_r}{m} - \frac{v_t^2}{r}\)</p>

<p>e</p>

\[\dot{v_t} = \frac{F_t}{m} + \frac{v_r v_t}{r}\]

<p>Il termine:
$$</p>

<ul>
  <li>\frac{v_t^2}{r}</li>
</ul>

<p>$$</p>

<p>è l’accelerazione centripeta geometrica.</p>

<p>Il termine:
\(\frac{v_r v_t}{r}\)</p>

<p>è il termine geometrico accoppiato.</p>

<hr />

<h2 id="vantaggi-della-scelta-rk2">Vantaggi della scelta RK2</h2>

<ul>
  <li>Riduce l’errore durante l’evoluzione temporale ($O(\Delta t^3)$ rispetto a $O(\Delta t^2)$ per il metodo di Eulero)</li>
  <li>Mantiene buona stabilità orbitale</li>
  <li>Compromesso tra accuratezza e costo computazionale</li>
</ul>

<hr />

<h2 id="gestione-degli-stadi">Gestione degli Stadi</h2>
<p>Il programma è capace di gestire anche la separazione degli stadi, tuttavia si prega di prestare attenzione al fatto che, per come progettato il programma, <strong>lo stadio che brucia carburante solido deve essere distaccato prima del primo stadio a carburante liquido</strong>.</p>

<p>Il distacco avviene prevedendo quanto carburante verrà consumato alla successiva iterazione e cercando quindi di utilizzare quanto più carburante possibile.</p>

<p>Tuttavia nella versione attuale del programma non è possibile gestire manualmente quanta spinta deve essere fornita da ogni motore nei vari istanti della simulazione. Questo rende decisamente più complesso il raggiungimento dell’orbita e rendendo meno interativa la simulazione.</p>

<p>È però in programma lo sviluppo di una versione successiva nella quale l’utente potrà avere più controllo sul lancio durante la fase di decollo.</p>

<hr />
<h2 id="controllo-della-direzione-di-spinta">Controllo della Direzione di Spinta</h2>

<p>Per ottenere la migliore inclinazione possibile dell’angolo di imbardata del velivolo, vista la complessità nel determinare una legge di regressione, si è preferito usare come riferimento dati dalla telemetria di missioni reali.</p>

<p>Nello specifico si è proceduto analizzando i dati della telemetria di varie missioni, specialmente falcon 9, per poi mediare sull’inclinzazione del velivolo a diverse quote.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">improve_theta</span><span class="p">(...)</span>
</code></pre></div></div>

<p>Legge un file guida quota–angolo.</p>

<p>Scelta progettuale:</p>

<ul>
  <li>Profilo di pitch data-driven</li>
  <li>Separazione completa tra guida e dinamica</li>
</ul>

<p>Difficoltà incontrate:</p>

<ul>
  <li>Necessità di memorizzare <code class="language-plaintext highlighter-rouge">file_pos</code></li>
  <li>Evitare rewind continui del file</li>
  <li>Stabilizzare il cambio di angolo oltre 20 km</li>
</ul>

<hr />

<h2 id="aerodinamica-dipendente-dal-mach-e-regime-transonico">Aerodinamica Dipendente dal Mach e Regime Transonico</h2>

<p>La forza di resistenza è modellata come:</p>

\[F_d = \frac{1}{2} \rho v^2 C_d(M) A\]

<p>La complessità principale risiede nella dipendenza del coefficiente di resistenza \(C_d(M)\) dal numero di Mach.</p>

<h3 id="drag-divergence">Drag Divergence</h3>

<p>In prossimità di Mach 1:</p>

<ul>
  <li>Si formano onde d’urto</li>
  <li>Aumenta bruscamente la wave drag</li>
  <li>$C_d$ diventa fortemente non lineare</li>
</ul>

<p>Una definizione a tratti introduce discontinuità numeriche indesiderate.</p>

<h3 id="transizioni-continue-tra-regimi">Transizioni Continue tra Regimi</h3>

<p>Per evitare artefatti numerici, è stata implementata:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">double</span> <span class="nf">Cd_from_Mach</span><span class="p">(</span><span class="kt">double</span> <span class="n">M</span><span class="p">);</span>
</code></pre></div></div>

<p>La funzione utilizza transizioni lisce basate su tangenti iperboliche:</p>

\[C_d(M) =
C_{sub}
+ \frac{C_{trans} - C_{sub}}{2} \left(1 + \tanh(k_1(M - M_1))\right)
+ \frac{C_{sup} - C_{trans}}{2} \left(1 + \tanh(k_2(M - M_2))\right)
+ \dots\]

<p>Questo garantisce:</p>

<ul>
  <li>Continuità almeno $C^1$</li>
  <li>Profili di accelerazione regolari</li>
  <li>Stabilità numerica</li>
</ul>

<p>I regimi modellati sono:</p>

<ul>
  <li>Subsonico</li>
  <li>Transonico</li>
  <li>Supersonico</li>
  <li>Ipersonico</li>
</ul>

<h1 id="modelizzazione-dei-principali-parametri-atmosferici-simulationcpp">Modelizzazione dei principali parametri atmosferici <code class="language-plaintext highlighter-rouge">simulation.cpp</code></h1>

<p>Un semplice decadimento esponenziale della densità non è sufficiente per una simulazione realistica dell’ascesa. Resistenza aerodinamica e prestazioni propulsive dipendono in modo critico dallo stato termodinamico locale.</p>

<h3 id="international-standard-atmosphere-isa">International Standard Atmosphere (ISA)</h3>

<p>Il simulatore implementa il modello <strong>ISA</strong>, calcolando le proprietà atmosferiche strato per strato:</p>

<ul>
  <li>Troposfera</li>
  <li>Tropopausa</li>
  <li>Stratosfera (fino a ~51 km, estendibile)</li>
</ul>

<p>Ogni strato è modellato mediante:</p>

<p>Equilibrio idrostatico: $\frac{dP}{dh} = -\rho g$</p>

<p>Legge dei gas ideali: $ P = \rho R T $</p>

<p>Da queste relazioni si ricavano le grandezze dipendenti dalla quota:</p>

<ul>
  <li>Pressione $P(h)$</li>
  <li>Densità $\rho(h)$</li>
  <li>Temperatura $T(h)$</li>
  <li>Velocità del suono locale $a(h)$</li>
</ul>

<p>Per maggiori informazioni tecniche si faccia riferimento a  <a href="https://agodemar.github.io/FlightMechanics4Pilots/mypages/international-standard-atmosphere/"> ISA model</a>.</p>

<h1 id="modellazione-dei-motori-enginecpp">Modellazione dei Motori (<code class="language-plaintext highlighter-rouge">engine.cpp</code>)</h1>

<p>Il file <code class="language-plaintext highlighter-rouge">engine.cpp</code> implementa tre livelli di complessità per la propulsione:</p>

<ol>
  <li><strong>Base Engine</strong> – modello a impulso specifico costante</li>
  <li><strong>Advanced Solid Engine</strong> – balistica interna completa accoppiata alla pressione in camera</li>
  <li><strong>Advanced Liquid Engine</strong> – modello con flusso strozzato e relazioni isentropiche</li>
</ol>

<p>L’<strong>architettura è polimorfica</strong>: ogni motore espone la stessa interfaccia pubblica, per permettere all’utente la più completa libertà di scelta:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">delta_m(dt)</code> → consumo di massa</li>
  <li><code class="language-plaintext highlighter-rouge">eng_force(pa, time, theta)</code> → vettore di spinta</li>
</ul>

<p>Per la modelizzazione matematica si è fatto riferimento alle seguenti fonti:</p>

<ul>
  <li>
    <p><a href="https://www.grc.nasa.gov/www/k-12/airplane/rktthsum.html"> NASA Glenn Research Center – Rocket Thrust Equations </a>.</p>
  </li>
  <li>
    <p><a href="https://www.grc.nasa.gov/www/k-12/airplane/isentrop.html"> NASA Glenn – Isentropic Flow Relations  </a>.</p>
  </li>
  <li>
    <p>Sutton &amp; Biblarz, <em>Rocket Propulsion Elements</em>, 9th Edition</p>
  </li>
</ul>

<hr />
<h2 id="base-engine">Base Engine</h2>

<p>Questo modello assume:</p>

<ul>
  <li>Pressione in camera costante</li>
  <li>Perdita di massa costante</li>
  <li>Impulso specifico costante</li>
</ul>

<p>Portata Massica</p>

\[\dot{m} = p_0 \cdot A_{burn} \cdot c_m\]

<p>dove:</p>

<ul>
  <li>( $p_0$ ) = pressione nominale interna alla camera di combustione</li>
  <li>( $A_{burn}$ ) = area di combustione</li>
  <li>( $c_m$ ) = coefficiente empirico di perdita di massa</li>
</ul>

<p>Consumo carburante nel timestep:</p>

<p>\(\Delta m = \dot{m} \Delta t\)
spinta
\(F = \dot{m} I_{sp} g_0\)
dove:</p>

<ul>
  <li>( $I_{sp}$ ) = impulso specifico</li>
  <li>( $g_0$ = acelerazione di gravit \, m/s^2 )</li>
</ul>

<hr />

<h2 id="advanced-solid-engine">Advanced Solid Engine</h2>
<p>Questo modello implementa la fisica interna di un motore a propellente solido.</p>

<p>Legge di Regressione del Propellente (Legge di Saint-Robert):
\(\dot{r} = a P_c^n\)</p>

<p>dove:</p>

<ul>
  <li>( a ) = coefficiente di combustione</li>
  <li>( n ) = esponente pressione</li>
  <li>( $P_c$ ) = pressione in camera</li>
</ul>

<p>Portata di Massa Generata</p>

\[\dot{m}_{gen} = \rho_p A_b \dot{r}\]

<p>dove:</p>

<ul>
  <li>( $\rho_p$ ) = densità propellente</li>
  <li>( $A_b$ ) = area di combustione</li>
</ul>

<p>3 Portata attraverso l’Ugello (Flusso Strozzato)</p>

\[\dot{m}_{noz} = \frac{P_c A_t}{c^*}\]

<p>dove:</p>

<ul>
  <li>( $A_t$ ) = area gola</li>
  <li>( $c^*$ ) = velocità caratteristica</li>
</ul>

<p>Bilancio di massa:</p>

<p>\(\frac{dP_c}{dt} =
\frac{R_{spec} T_c}{V_c}
(\dot{m}_{gen} - \dot{m}_{noz})\)
dove:</p>

\[R_{spec} = \frac{R}{M}\]

<p>Velocità Caratteristica</p>

\[c^* =
\sqrt{
\left(\frac{2}{\gamma + 1}\right)^{\frac{\gamma + 1}{\gamma - 1}}
R_{spec} T_c
}\]

<p>Calcolo Mach di Uscita</p>

<p>Risoluzione numerica dell’equazione area-Mach:</p>

\[\frac{A_e}{A_t}
=
\frac{1}{M_e}
\left(
\frac{2}{\gamma+1}
\left(1 + \frac{\gamma-1}{2} M_e^2\right)
\right)^{\frac{\gamma+1}{2(\gamma-1)}}\]

<p>L’equazione viene risolta numericamente tramite metodo di Newton-Raphson per ottenere il Mach di uscita supersonico ( $M_e$ ).</p>

<p>Pressione di Uscita</p>

\[\frac{P_e}{P_c}
=
\left(
1 + \frac{\gamma-1}{2} M_e^2
\right)^{-\frac{\gamma}{\gamma-1}}\]

<p>Velocità di Scarico</p>

\[v_e =
\sqrt{
\frac{2\gamma}{\gamma - 1}
R_{spec} T_c
\left(
1 -
\left(\frac{P_e}{P_c}\right)^{\frac{\gamma - 1}{\gamma}}
\right)
}\]

<p>Spinta Totale</p>

\[F =
\dot{m} v_e
+
(P_e - P_a) A_e\]

<p>Il secondo termine rappresenta la componente di pressione dovuta alla differenza tra pressione di uscita e pressione ambiente.</p>

<hr />

<h2 id="advanced-liquid-engine">Advanced Liquid Engine</h2>

<p>Assunzioni:</p>

<ul>
  <li>Pressione in camera costante</li>
  <li>Flusso strozzato in gola</li>
  <li>Espansione isentropica</li>
</ul>

<p>Portata Massica</p>

\[\dot{m} =
\frac{P_c A_t}{c^*}\]

<p>Numero di Mach di Uscita</p>

<p>Determinato risolvendo numericamente la stessa equazione area-Mach:</p>

\[\frac{A_e}{A_t}
=
\frac{1}{M_e}
\left(
\frac{2}{\gamma+1}
\left(1 + \frac{\gamma-1}{2} M_e^2\right)
\right)^{\frac{\gamma+1}{2(\gamma-1)}}\]

<p>Pressione di Uscita</p>

\[P_e =
P_c
\left(
1 + \frac{\gamma - 1}{2} M_e^2
\right)^{-\frac{\gamma}{\gamma - 1}}\]

<p>Velocità di Scarico</p>

\[v_e =
\sqrt{
\frac{2\gamma}{\gamma - 1}
\frac{R T_c}{M}
\left(
1 -
\left(\frac{P_e}{P_c}\right)^{\frac{\gamma - 1}{\gamma}}
\right)
}\]

<p>Spinta</p>

<p>\(F =
\dot{m} v_e
+
(P_e - P_a) A_e\)</p>
<h1 id="differenze-tra-i-modelli">Differenze tra i Modelli</h1>

<table>
  <thead>
    <tr>
      <th>Modello</th>
      <th>Complessità</th>
      <th>Evoluzione Pressione</th>
      <th>Realismo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Base</td>
      <td>Bassa</td>
      <td>Costante</td>
      <td>Approssimato</td>
    </tr>
    <tr>
      <td>Advanced Solid</td>
      <td>Alta</td>
      <td>Dinamica</td>
      <td>Elevato</td>
    </tr>
    <tr>
      <td>Advanced Liquid</td>
      <td>Media/Alta</td>
      <td>Costante (assunta)</td>
      <td>Realistico</td>
    </tr>
  </tbody>
</table>

<p>Il file <code class="language-plaintext highlighter-rouge">engine.cpp</code> rappresenta il livello di modellazione più sofisticato del simulatore.</p>

<p>L’obiettivo non è solo calcolare una spinta,
ma riprodurre l’accoppiamento tra:</p>

<ul>
  <li>Termodinamica dei gas combusti</li>
  <li>Dinamica della pressione in camera</li>
  <li>Flusso comprimibile nell’ugello</li>
  <li>Interazione con la pressione ambiente</li>
</ul>

<h1 id="conclusione">Conclusione</h1>

<p>Il progetto si è evoluto da semplice simulatore di ascesa a implementazione strutturata di:</p>

<ul>
  <li>Termodinamica atmosferica stratificata</li>
  <li>Modellazione propulsiva interna</li>
  <li>Meccanica orbitale</li>
  <li>Integrazione numerica</li>
</ul>

<p>particolare rilevanza ha assunto la separazione rigorosa fra propulsione, aerodinamica e cinematica tramite polimorfismo, per garantire una migliore scalabilità architetturale</p>

<p>Il risultato è una rappresentazione numericamente coerente delle reali difficoltà ingegneristiche e fisiche nel raggiungere l’orbita.</p>

<p>Il progetto è stato una delle sfide più entusiasmanti che abbia mai affrontato, un codice dalla dimensione e complessità a me completamente nuove e pieno di difficicoltà inaspettate. Mi ha insegnato l’importanza dell’organizzare quanto più possibile in modo ordinato il codice e di verificare attentamente l’influenza di ogni minima modifica.</p>

<p>Mi ha fatto passare nottate insonni e momenti straordinari con il mio fedelissimo collaboratore che ringrazio nuovamente per tutti i suoi preziosi contributi.</p>

<h2 id="-collaboratori">👥 Collaboratori</h2>

<p>Questo progetto è stato possibile grazie al contributo di:</p>

<ul>
  <li><strong>Sigfrido11</strong>  🔗 <a href="https://github.com/Sigfrido11">GitHub</a></li>
  <li><strong>SierraTangoEcho</strong> 🔗 <a href="https://github.com/SierraTangoEcho">GitHub</a></li>
</ul>]]></content><author><name></name></author><category term="Highlight" /><category term="Markdown" /><summary type="html"><![CDATA[Simulatore fase di decollo di un razzo]]></summary></entry><entry xml:lang="en"><title type="html">Rocket</title><link href="https://sigfrido11.github.io/personal_website/2026/02/18/rocket-en.html" rel="alternate" type="text/html" title="Rocket" /><published>2026-02-18T00:00:00+00:00</published><updated>2026-02-18T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/2026/02/18/rocket-en</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/2026/02/18/rocket-en.html"><![CDATA[<h1 id="rocket-launch-phase-simulator">Rocket Launch Phase Simulator</h1>

<p>The purpose of this project is to simulate a launch vehicle from liftoff, occurring at the equatorial line, up to the possible achievement of orbit. This project required the coherent coupling of aerodynamics, thermodynamics, and orbital mechanics within a numerically stable scheme.</p>

<p>This simulator, developed in <strong>C++20</strong> with <strong>SFML</strong>, aims to model a physically consistent ascent while avoiding purely kinematic simplifications.</p>

<p>The project repository can be viewed and downloaded by clicking the button below.</p>

<div class="rocket_repo project-actions">
  <a class="btn" href="https://github.com/Sigfrido11/Rocket_simulator" target="_blank" rel="noopener">
    Visit the repository
  </a>
</div>

<div class="yt-embed" data-youtube-embed="" data-youtube-url="https://youtu.be/lEfwqOcSzAE">
    <button class="yt-embed__poster" type="button" aria-label="Play video: Rocket">
      <span class="yt-embed__badge">
        Watch video
      </span>
      <span class="yt-embed__play" aria-hidden="true"></span>
    </button>
    <noscript>
      <div class="yt-embed__noscript">
        <a class="btn secondary" href="https://youtu.be/lEfwqOcSzAE" target="_blank" rel="noopener">
          Open on YouTube
        </a>
      </div>
    </noscript>
  </div>

<h2 id="how-to-use-the-program">How to Use the Program</h2>

<p>The considerable complexity of the program required the use of several input parameters that the user must provide at the start of the simulation.<br />
To prevent the software from becoming inaccessible to non-expert users and to simplify data entry, at startup the user is asked whether to use the <strong>base engine model</strong>, a simplified version with few parameters, or an <strong>advanced version</strong> that requires knowledge of many parameters.</p>

<p>These parameters can be conveniently edited by the user in the file:</p>

<p><code class="language-plaintext highlighter-rouge">assets/input_data/simulation_params.json</code></p>

<p>For convenience, reasonable default values are already set.</p>

<p>Below is a brief description of all configuration parameters.<br />
<strong>Warning:</strong> if advanced engines are selected, modifying the base engine section will have no effect and viceversa.</p>

<hr />

<h2 id="configuration-parameters">Configuration Parameters</h2>

<table>
  <thead>
    <tr>
      <th>Parameter</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rocket</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.name</code></td>
      <td>Identifier name of the launch vehicle.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.stage_num</code></td>
      <td>Total number of stages (1 initial solid stage + N liquid stages).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.mass_structure_kg</code></td>
      <td>Main structural mass of the vehicle, excluding propellant and tanks.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.upper_area_m2</code></td>
      <td>Equivalent frontal area used in aerodynamic drag calculations.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.solid_propellant_mass_kg</code></td>
      <td>Total propellant mass of the solid propellant stage.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.solid_container_mass_kg</code></td>
      <td>Structural mass of the solid propellant booster, discarded at separation.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.solid_engine_count</code></td>
      <td>Number of solid propellant  engines firing simultaneously.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.liquid_propellant_masses_kg</code></td>
      <td>List of propellant masses for each liquid propellant  stage.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.liquid_container_masses_kg</code></td>
      <td>List of structural tank masses for each liquid propellant stage.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rocket.liquid_engines_per_stage</code></td>
      <td>Number of liquid propellant engines active in each stage.</td>
    </tr>
    <tr>
      <td>Base Engines</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.isp_s</code></td>
      <td>Specific impulse expressed in seconds.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.cm</code></td>
      <td>Mass flow coefficient.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.chamber_pressure_pa</code></td>
      <td>Combustion chamber pressure (Pa).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.base.burn_area_m2</code></td>
      <td>Effective propellant burning area in the base model.</td>
    </tr>
    <tr>
      <td>Advanced Solid Engines</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.burn_area_m2</code></td>
      <td>Initial burning surface area of the solid grain.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.nozzle_throat_area_m2</code></td>
      <td>Nozzle throat area of the solid propellant  engine (controls mass flow).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.nozzle_exit_area_m2</code></td>
      <td>Nozzle exit area of the solid propellant engine (affects gas expansion).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.chamber_temperature_k</code></td>
      <td>Combustion chamber gas temperature (K).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.grain_dimension_m</code></td>
      <td>Characteristic grain dimension affecting burn evolution.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.grain_density_kg_m3</code></td>
      <td>Solid propellant density.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.burn_rate_a</code></td>
      <td>Solid propellant burn rate coefficient.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.burn_rate_n</code></td>
      <td>Pressure exponent in the solid propellant regression law.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_solid.propellant_molar_mass_g_mol</code></td>
      <td>Molar mass of solid propellant engine combustion products (g/mol).</td>
    </tr>
    <tr>
      <td>Advanced Liquid Engines</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.chamber_pressure_pa</code></td>
      <td>Combustion chamber pressure of the liquid engine (Pa).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.nozzle_throat_area_m2</code></td>
      <td>Nozzle throat area of the liquid propellant engine.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.nozzle_exit_area_m2</code></td>
      <td>Nozzle exit area of the liquid propellant engine.</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.chamber_temperature_k</code></td>
      <td>Combustion chamber gas temperature of the liquid propellant engine (K).</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">engine.advanced_liquid.propellant_molar_mass_g_mol</code></td>
      <td>Molar mass of combustion gases in the liquid propellant engine (g/mol).</td>
    </tr>
  </tbody>
</table>

<p>The user will also be asked to specify the altitude at which the rocket will attempt orbital insertion.<br />
This altitude <strong>must</strong> be greater than 60,000 m.</p>

<hr />

<h1 id="main-file-organization">Main File Organization</h1>

<ul>
  <li>Rocket → rocket management, dynamics, and kinematics</li>
  <li>Engine → physics of all selectable engine types</li>
  <li>Atmosphere → simulation of atmospheric parameters at different altitudes</li>
</ul>

<hr />

<h1 id="core-dynamic-implementation-rocketcpp">Core Dynamic Implementation: <code class="language-plaintext highlighter-rouge">rocket.cpp</code></h1>

<p>The file <code class="language-plaintext highlighter-rouge">rocket.cpp</code> represents the dynamic and kinematic core of the simulator:<br />
it integrates <strong>propulsion, aerodynamics, gravity, stage management, and numerical integration</strong>, thus governing the time evolution of the simulation.</p>

<hr />

<h2 id="choice-of-reference-frame">Choice of Reference Frame</h2>

<p>The simulation uses an <strong>inertial frame centered at the Earth’s center</strong>, expressed in polar coordinates:</p>

\[(r, \psi)\]

<p>where:</p>

<ul>
  <li>( r ) = distance from Earth’s center</li>
  <li>( $\psi$ ) = polar angle</li>
  <li>( $v_r$ ) = radial velocity</li>
  <li>( $v_t$ ) = tangential velocity</li>
</ul>

<h3 id="why-not-a-cartesian-system">Why not a Cartesian system?</h3>

<p>A Cartesian system would require:</p>

<ul>
  <li>Explicit handling of Earth curvature</li>
  <li>Continuous normalization of the gravity vector</li>
  <li>Greater numerical instability at high altitude</li>
  <li>Increased difficulty in graphical visualization of the rocket position</li>
</ul>

<hr />

<h1 id="numerical-integration-rungekutta-2-midpoint-method">Numerical Integration: Runge–Kutta 2 (Midpoint Method)</h1>

<p>The file uses an <strong>RK2 (midpoint method)</strong> integrator to update velocity and position.</p>

<h3 id="why-not-explicit-euler">Why not explicit Euler?</h3>

<p>The classical Euler integrator:</p>

\[x_{n+1} = x_n + v_n \Delta t\]

<p>introduces:</p>

<ul>
  <li>Poorer energy conservation during time evolution</li>
  <li>Instability in orbital regimes</li>
  <li>Amplified errors in centrifugal terms ( $\frac{v_t^2}{r}$ )</li>
</ul>

<h3 id="implemented-equations">Implemented Equations</h3>

<p>In inertial polar coordinates:</p>

\[\dot{v_r} = \frac{F_r}{m} - \frac{v_t^2}{r}\]

<p>and</p>

\[\dot{v_t} = \frac{F_t}{m} + \frac{v_r v_t}{r}\]

<p>The term:</p>

\[\frac{v_t^2}{r}\]

<p>is the geometric centripetal acceleration.</p>

<p>The term:</p>

\[\frac{v_r v_t}{r}\]

<p>is the geometric coupling term.</p>

<hr />

<h2 id="advantages-of-rk2">Advantages of RK2</h2>

<ul>
  <li>Reduces error during time evolution ($O(\Delta t^3)$ compared to $O(\Delta t^2)$ for Euler)</li>
  <li>Maintains good orbital stability</li>
  <li>Balanced compromise between accuracy and computational cost</li>
</ul>

<hr />

<h2 id="stage-management">Stage Management</h2>

<p>The program can handle stage separation. However, note that due to the current design, <strong>the solid fuel stage must be detached before the first liquid stage</strong>.</p>

<p>Separation is handled by predicting how much propellant will be consumed in the next iteration and attempting to use as much propellant as possible.</p>

<p>In the current version, it is not possible to manually control the thrust level of each engine during the simulation.<br />
This makes orbit insertion significantly more challenging and reduces interactivity.</p>

<p>A future version is planned in which the user will have greater control over the launch phase.</p>

<hr />

<h2 id="thrust-direction-control">Thrust Direction Control</h2>

<p>To achieve an optimal pitch angle evolution, rather than defining a regression law analytically, real mission telemetry data was used as reference.</p>

<p>Specifically, telemetry data from several missions, especially Falcon 9, was analyzed, and an average pitch profile as a function of altitude was derived.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">improve_theta</span><span class="p">(...)</span>
</code></pre></div></div>

<p>Reads an altitude–angle guidance file.</p>

<p>Design choice:</p>

<ul>
  <li>Data-driven pitch profile</li>
  <li>Complete separation between guidance and dynamics</li>
</ul>

<p>Challenges encountered:</p>

<ul>
  <li>Need to store <code class="language-plaintext highlighter-rouge">file_pos</code></li>
  <li>Avoid continuous file rewind</li>
  <li>Stabilize angle changes above 20 km</li>
</ul>

<hr />

<h2 id="mach-dependent-aerodynamics-and-transonic-regime">Mach-Dependent Aerodynamics and Transonic Regime</h2>

<p>Drag force is modeled as:</p>

\[F_d = \frac{1}{2} \rho v^2 C_d(M) A\]

<p>The main complexity lies in the dependence of the drag coefficient \(C_d(M)\) on Mach number.</p>

<h3 id="drag-divergence">Drag Divergence</h3>

<p>Near Mach 1:</p>

<ul>
  <li>Shock waves form</li>
  <li>Wave drag increases sharply</li>
  <li>$C_d$ becomes strongly nonlinear</li>
</ul>

<p>A piecewise definition introduces undesirable numerical discontinuities.</p>

<h3 id="smooth-regime-transitions">Smooth Regime Transitions</h3>

<p>To avoid numerical artifacts, the following function is implemented:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">double</span> <span class="nf">Cd_from_Mach</span><span class="p">(</span><span class="kt">double</span> <span class="n">M</span><span class="p">);</span>
</code></pre></div></div>

<p>The function uses smooth transitions based on hyperbolic tangents:</p>

\[C_d(M) =
C_{sub}

* \frac{C_{trans} - C_{sub}}{2} \left(1 + \tanh(k_1(M - M_1))\right)
* \frac{C_{sup} - C_{trans}}{2} \left(1 + \tanh(k_2(M - M_2))\right)
* \dots\]

<p>This guarantees:</p>

<ul>
  <li>At least $C^1$ continuity</li>
  <li>Smooth acceleration profiles</li>
  <li>Numerical stability</li>
</ul>

<p>The modeled regimes are:</p>

<ul>
  <li>Subsonic</li>
  <li>Transonic</li>
  <li>Supersonic</li>
  <li>Hypersonic</li>
</ul>

<hr />

<h1 id="modeling-of-main-atmospheric-parameters-simulationcpp">Modeling of Main Atmospheric Parameters <code class="language-plaintext highlighter-rouge">simulation.cpp</code></h1>

<p>A simple exponential decay of density is insufficient for a realistic ascent simulation.
Aerodynamic drag and propulsion performance critically depend on the local thermodynamic state.</p>

<h3 id="international-standard-atmosphere-isa">International Standard Atmosphere (ISA)</h3>

<p>The simulator implements the <strong>ISA model</strong>, computing atmospheric properties layer by layer:</p>

<ul>
  <li>Troposphere</li>
  <li>Tropopause</li>
  <li>Stratosphere (up to ~51 km, extendable)</li>
</ul>

<p>Each layer is modeled using:</p>

<p>Hydrostatic equilibrium: $\frac{dP}{dh} = -\rho g$</p>

<p>Ideal gas law: $ P = \rho R T $</p>

<p>From these relations, altitude-dependent quantities are derived:</p>

<ul>
  <li>Pressure $P(h)$</li>
  <li>Density $\rho(h)$</li>
  <li>Temperature $T(h)$</li>
  <li>Local speed of sound $a(h)$</li>
</ul>

<p>For more technical details, see: <a href="https://agodemar.github.io/FlightMechanics4Pilots/mypages/international-standard-atmosphere/">ISA model</a>.</p>

<hr />
<h1 id="engine-modeling-enginecpp">Engine Modeling (<code class="language-plaintext highlighter-rouge">engine.cpp</code>)</h1>

<p>The file <code class="language-plaintext highlighter-rouge">engine.cpp</code> implements different levels of propulsion complexity:</p>

<ol>
  <li><strong>Base Engine</strong> – constant specific impulse model</li>
  <li><strong>Advanced Solid Engine</strong> – full internal ballistics coupled with chamber pressure</li>
  <li><strong>Advanced Liquid Engine</strong> – choked flow model with isentropic relations</li>
</ol>

<p>The <strong>architecture is polymorphic</strong>: each engine exposes the same public interface, allowing the user complete freedom of choice:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">delta_m(dt)</code> → mass lost consumption</li>
  <li><code class="language-plaintext highlighter-rouge">eng_force(pa, time, theta)</code> → thrust vector</li>
</ul>

<p>For the mathematical modeling, the following references were used:</p>

<ul>
  <li><a href="https://www.grc.nasa.gov/www/k-12/airplane/rktthsum.html"> NASA Glenn Research Center – Rocket Thrust Equations </a></li>
  <li><a href="https://www.grc.nasa.gov/www/k-12/airplane/isentrop.html"> NASA Glenn – Isentropic Flow Relations </a></li>
  <li>Sutton &amp; Biblarz, <em>Rocket Propulsion Elements</em>, 9th Edition</li>
</ul>

<hr />

<h2 id="base-engine">Base Engine</h2>

<p>This model assumes:</p>

<ul>
  <li>Constant chamber pressure</li>
  <li>Constant mass loss</li>
  <li>Constant specific impulse</li>
</ul>

<p>Mass Flow Rate</p>

\[\dot{m} = p_0 \cdot A_{burn} \cdot c_m\]

<p>where:</p>

<ul>
  <li>( $p_0$ ) = nominal combustion chamber pressure</li>
  <li>( $A_{burn}$ ) = burning surface area</li>
  <li>( $c_m$ ) = empirical mass loss coefficient</li>
</ul>

<p>Fuel consumption per timestep:</p>

\[\Delta m = \dot{m} \Delta t\]

<p>Thrust</p>

\[F = \dot{m} I_{sp} g_0\]

<p>where:</p>

<ul>
  <li>( $I_{sp}$ ) = specific impulse</li>
  <li>( $g_0$ ) = standard gravity acceleration (m/s²)</li>
</ul>

<hr />

<h2 id="advanced-solid-engine">Advanced Solid Engine</h2>

<p>This model implements the internal physics of a solid propellant rocket motor.</p>

<p>Propellant Regression Law (Saint-Robert’s Law):</p>

\[\dot{r} = a P_c^n\]

<p>where:</p>

<ul>
  <li>( a ) = burn rate coefficient</li>
  <li>( n ) = pressure exponent</li>
  <li>( $P_c$ ) = chamber pressure</li>
</ul>

<p>Generated Mass Flow Rate</p>

\[\dot{m}_{gen} = \rho_p A_b \dot{r}\]

<p>where:</p>

<ul>
  <li>( $rho_p$ ) = propellant density</li>
  <li>( $A_b$ ) = burning area</li>
</ul>

<p>Mass Flow Through the Nozzle (Choked Flow)</p>

\[\dot{m}_{noz} = \frac{P_c A_t}{c^*}\]

<p>where:</p>

<ul>
  <li>( $A_t$ ) = throat area</li>
  <li>( $c^*$ ) = characteristic velocity</li>
</ul>

<p>Mass Balance</p>

\[\frac{dP_c}{dt} =
\frac{R_{spec} T_c}{V_c}
(\dot{m}_{gen} - \dot{m}_{noz})\]

<p>where:</p>

\[R_{spec} = \frac{R}{M}\]

<p>Characteristic Velocity</p>

\[c^* =
\sqrt{
\left(\frac{2}{\gamma + 1}\right)^{\frac{\gamma + 1}{\gamma - 1}}
R_{spec} T_c
}\]

<p>Exit Mach Number Calculation</p>

<p>Numerical solution of the area–Mach equation:</p>

\[\frac{A_e}{A_t}
=
\frac{1}{M_e}
\left(
\frac{2}{\gamma+1}
\left(1 + \frac{\gamma-1}{2} M_e^2\right)
\right)^{\frac{\gamma+1}{2(\gamma-1)}}\]

<p>The equation is solved numerically using the Newton–Raphson method to obtain the supersonic exit Mach number ( $M_e$ ).</p>

<p>Exit Pressure</p>

\[\frac{P_e}{P_c}
=
\left(
1 + \frac{\gamma-1}{2} M_e^2
\right)^{-\frac{\gamma}{\gamma-1}}\]

<p>Exhaust Velocity</p>

\[v_e =
\sqrt{
\frac{2\gamma}{\gamma - 1}
R_{spec} T_c
\left(
1 -
\left(\frac{P_e}{P_c}\right)^{\frac{\gamma - 1}{\gamma}}
\right)
}\]

<p>Total Thrust</p>

\[F =
\dot{m} v_e
+
(P_e - P_a) A_e\]

<p>The second term represents the pressure contribution due to the difference between exit pressure and ambient pressure.</p>

<hr />

<h2 id="advanced-liquid-engine">Advanced Liquid Engine</h2>

<p>Assumptions:</p>

<ul>
  <li>Constant chamber pressure</li>
  <li>Choked flow at the throat</li>
  <li>Isentropic expansion</li>
</ul>

<p>Mass Flow Rate</p>

\[\dot{m} =
\frac{P_c A_t}{c^*}\]

<p>Exit Mach Number</p>

<p>Determined by numerically solving the same area–Mach equation:</p>

\[\frac{A_e}{A_t}
=
\frac{1}{M_e}
\left(
\frac{2}{\gamma+1}
\left(1 + \frac{\gamma-1}{2} M_e^2\right)
\right)^{\frac{\gamma+1}{2(\gamma-1)}}\]

<p>Exit Pressure</p>

\[P_e =
P_c
\left(
1 + \frac{\gamma - 1}{2} M_e^2
\right)^{-\frac{\gamma}{\gamma - 1}}\]

<p>Exhaust Velocity</p>

\[v_e =
\sqrt{
\frac{2\gamma}{\gamma - 1}
\frac{R T_c}{M}
\left(
1 -
\left(\frac{P_e}{P_c}\right)^{\frac{\gamma - 1}{\gamma}}
\right)
}\]

<p>Thrust</p>

\[F =
\dot{m} v_e
+
(P_e - P_a) A_e\]

<hr />

<h1 id="differences-between-models">Differences Between Models</h1>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Complexity</th>
      <th>Pressure Evolution</th>
      <th>Realism</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Base</td>
      <td>Low</td>
      <td>Constant</td>
      <td>Approximate</td>
    </tr>
    <tr>
      <td>Advanced Solid</td>
      <td>High</td>
      <td>Dynamic</td>
      <td>High</td>
    </tr>
    <tr>
      <td>Advanced Liquid</td>
      <td>Medium/High</td>
      <td>Constant (assumed)</td>
      <td>Realistic</td>
    </tr>
  </tbody>
</table>

<p>The file <code class="language-plaintext highlighter-rouge">engine.cpp</code> represents the most sophisticated modeling layer of the simulator.</p>

<p>The objective is not merely to compute thrust,<br />
but to reproduce the coupling between:</p>

<ul>
  <li>Combustion gas thermodynamics</li>
  <li>Chamber pressure dynamics</li>
  <li>Compressible flow in the nozzle</li>
  <li>Interaction with ambient pressure</li>
</ul>

<hr />

<h1 id="conclusion">Conclusion</h1>

<p>The project evolved from a simple ascent simulator into a structured implementation of:</p>

<ul>
  <li>Layered atmospheric thermodynamics</li>
  <li>Internal propulsion modeling</li>
  <li>Orbital mechanics</li>
  <li>Numerical integration</li>
</ul>

<p>Particular importance was given to the rigorous separation between propulsion, aerodynamics, and kinematics through polymorphism, ensuring improved architectural scalability.</p>

<p>The result is a numerically consistent representation of the real engineering and physical challenges involved in reaching orbit.</p>

<p>This project has been one of the most exciting challenges I have ever undertaken, a codebase of size and complexity completely new to me and full of unexpected difficulties.<br />
It taught me the importance of organizing code as cleanly as possible and carefully verifying the impact of every small modification.</p>

<p>It brought sleepless nights and extraordinary moments shared with my trusted collaborator, whom I thank once again for his invaluable contributions.</p>

<h2 id="-contributors">👥 Contributors</h2>

<p>This project was made possible thanks to the contribution of:</p>

<ul>
  <li><strong>Sigfrido11</strong>  🔗 <a href="https://github.com/Sigfrido11">GitHub</a></li>
  <li><strong>SierraTangoEcho</strong> 🔗 <a href="https://github.com/SierraTangoEcho">GitHub</a></li>
</ul>]]></content><author><name></name></author><category term="Highlight" /><category term="Markdown" /><summary type="html"><![CDATA[Rocket Launch Phase Simulator]]></summary></entry><entry xml:lang="it"><title type="html">Python</title><link href="https://sigfrido11.github.io/personal_website/example/2025/10/22/python-it.html" rel="alternate" type="text/html" title="Python" /><published>2025-10-22T00:00:00+00:00</published><updated>2025-10-22T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/example/2025/10/22/python-it</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/example/2025/10/22/python-it.html"><![CDATA[<h1 id="python">Python</h1>

<p>Visto che la quasi totalità dei progetti è stata scritta in C++ riporto qui due piccoli progetti con Jupyter notebook. Tali script possono essere aperti con diversi servizi online gratuiti come Google Colab.</p>

<h2 id="grafici">Grafici</h2>

<p>Il primo script è stato utilizzato per la creazione dei grafici presenti al capitolo 7 della tesi per il progetto di comunicazione aumentativa. Puoi visitare il progetto e scaricare il PDF della tesi qui sotto.</p>

<div class="project-actions">
  <a class="btn secondary" href="https://anna-madonna.github.io/Parole-che-crescono/" target="_blank" rel="noopener">
    Visita il sito del progetto
  </a>
  <a class="btn" href="/personal_website/assets/pdf/tesi_mamma.pdf" download="">
    Scarica la tesi (PDF)
  </a>
</div>

<style>
  .thesis-download {
    margin-top: 1.25rem;
    text-align: center;
    display: flex;
    gap: 0.8rem;
    justify-content: center;
    flex-wrap: wrap;
  }
  .thesis-download .btn {
    display: inline-block;
    padding: 0.75em 1.6em;
    border-radius: 999px;
    background: linear-gradient(120deg, #0b6fa4, #00a67c);
    color: #fff;
    box-shadow: 0 10px 25px -12px rgba(0, 166, 124, 0.55);
    transition: transform 0.15s ease, box-shadow 0.2s ease, filter 0.2s ease;
  }
  .thesis-download .btn.secondary {
    background: linear-gradient(120deg, #3a4f63, #5a7490);
  }
  .thesis-download .btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 14px 28px -14px rgba(0, 166, 124, 0.65), 0 0 12px rgba(11, 111, 164, 0.65);
    filter: brightness(1.06);
  }
  .thesis-download .btn:active {
    transform: translateY(1px) scale(0.99);
    box-shadow: 0 8px 18px -12px rgba(0, 166, 124, 0.7), 0 0 16px rgba(11, 111, 164, 0.75);
  }
</style>

<p>Ecco due esempi dei grafici ottenuti.</p>

<div class="project-media">
  <img src="/personal_website/assets/img/graph/grafico_1.jpeg" alt="Grafico 1" />
  <img src="/personal_website/assets/img/graph/grafico_2.jpeg" alt="Grafico 2" />
</div>

<h1 id="analisi-statistica-delle-cifre-di-pi-numeri-irrazionali-e-legge-di-benford">Analisi statistica delle cifre di $\pi$, numeri irrazionali e Legge di Benford</h1>

<p>In questo secondo progetto ho esplorato il comportamento statistico delle cifre di alcuni numeri irrazionali e di particolari sequenze numeriche, con l’obiettivo di verificare sperimentalmente proprietà teoriche come la <strong>normalità delle cifre</strong> e la <strong>Legge di Benford</strong>. Il progetto è scaricabile premendo il seguente pulsante.</p>

<div class="project-actions">
  <a class="btn" href="/personal_website/assets/script/Statistics_project_2025_Giuseppe_Luciano.ipynb" download="">
    Scarica il notebook (IPYNB)
  </a>
</div>

<p>L’intero lavoro è stato sviluppato in Python, utilizzando librerie scientifiche come <code class="language-plaintext highlighter-rouge">mpmath</code>, <code class="language-plaintext highlighter-rouge">numpy</code>, <code class="language-plaintext highlighter-rouge">scipy</code> e <code class="language-plaintext highlighter-rouge">matplotlib</code>.</p>

<hr />

<h2 id="parte-i--densità-delle-cifre-nei-numeri-irrazionali">Parte I — Densità delle cifre nei numeri irrazionali</h2>

<h3 id="obiettivo">Obiettivo</h3>

<p>Verificare sperimentalmente l’ipotesi che $\pi$ possa comportarsi come un numero <em>normale</em>, ovvero che ogni cifra decimale (0–9) compaia con frequenza pari a 1/10.</p>

<hr />

<h3 id="metodologia">Metodologia</h3>

<h4 id="1-calcolo-di-50000-cifre-di-pi">1. Calcolo di 50.000 cifre di $\pi$</h4>

<p>Ho utilizzato la libreria <code class="language-plaintext highlighter-rouge">mpmath</code> per generare $\pi$ con precisione arbitraria.
È stato necessario impostare correttamente il numero di cifre significative (<code class="language-plaintext highlighter-rouge">mp.dps</code>) e convertire il numero in stringa per analizzare ogni singola cifra.</p>

<h4 id="2-calcolo-delle-frequenze">2. Calcolo delle frequenze</h4>

<p>Per ciascuna cifra ( d \in [0,9] ) ho calcolato:</p>

\[f_d = \frac{n_d}{N}\]

<p>dove ( $n_d$ ) è il numero di occorrenze della cifra e ( N = 5 $\times 10^4$ ).</p>

<h4 id="3-stima-delle-incertezze">3. Stima delle incertezze</h4>

<p>Assumendo distribuzione binomiale, ho stimato l’errore come:</p>

\[\sigma_{f_d} = \sqrt{\frac{f_d(1-f_d)}{N}}\]

<h4 id="4-fit-lineare-dei-dati">4. Fit lineare dei dati</h4>

<p>Per testare formalmente l’ipotesi di equiprobabilità ho adattato ai dati il modello:</p>

\[f_{lin}(d; \alpha, \beta) = \frac{\alpha}{10} + \beta d\]

<p>utilizzando <code class="language-plaintext highlighter-rouge">scipy.optimize.curve_fit</code>.</p>

<p>L’ipotesi teorica di distribuzione uniforme corrisponde al punto:</p>

\[(\alpha_0, \beta_0) = (1.0, 0.0)\]

<h4 id="5-analisi-statistica">5. Analisi statistica</h4>

<p>Dal fit ho ottenuto:</p>

<ul>
  <li>Parametri ottimali ( $\hat{\alpha}, \hat{\beta}$ )</li>
  <li>Matrice di covarianza</li>
  <li>Correlazione tra i parametri</li>
  <li>Valore minimo del $\chi^2$:</li>
</ul>

\[\chi^2_{min} =
\sum_{d=0}^{9}
\left(
\frac{f_d - f_{lin}(d;\hat{\alpha},\hat{\beta})}{\sigma_{f_d}}
\right)^2\]

<p>Con 10 punti e 2 parametri, i gradi di libertà sono:</p>

\[n_{dof} = 8\]

<p>Ho quindi calcolato il p-value come probabilità di sopravvivenza della distribuzione $\chi^2$.</p>

<h4 id="6-ellissi-di-confidenza">6. Ellissi di confidenza</h4>

<p>Utilizzando la matrice di covarianza restituita dal fit, ho costruito l’ellisse definita da:</p>

\[\Delta\chi^2 = \chi^2(\alpha,\beta) - \chi^2_{min}
= \chi^2_{2,\,0.95}\]

<p>Nel grafico sono stati indicati:</p>

<ul>
  <li>Il punto di best-fit ( ($\hat{\alpha}, \hat{\beta})$ )</li>
  <li>L’ipotesi teorica ( (1,0) )</li>
  <li>L’ellisse di confidenza al 68%</li>
  <li>L’ellisse di confidenza al 95%</li>
</ul>

<p>Questo permette di valutare visivamente e quantitativamente la compatibilità dell’ipotesi di equiprobabilità con i dati.</p>

<hr />

<h2 id="estensione-ad-altri-numeri">Estensione ad altri numeri</h2>

<p>La stessa analisi è stata ripetuta per:</p>

<ul>
  <li>( e )</li>
  <li>( $\sqrt{2}$ )</li>
  <li>Il numero aureo ( $\varphi$ )</li>
  <li>La sequenza di Fibonacci</li>
  <li>Le sequenze di Lucas e Padovan</li>
</ul>

<p>In tutti i casi analizzati, le frequenze delle cifre risultano compatibili con l’equiprobabilità entro le fluttuazioni statistiche.</p>

<p>È particolarmente interessante osservare come sequenze completamente deterministiche, come quella di Fibonacci, mostrino proprietà statistiche simili a quelle attese per numeri normali.</p>

<hr />

<h1 id="parte-ii--la-legge-di-benford">Parte II — La Legge di Benford</h1>

<p>La seconda parte del progetto riguarda la distribuzione della <strong>prima cifra significativa</strong>.</p>

<p>A differenza delle cifre interne di $\pi$, le prime cifre  di molte grandezze reali non sono uniformi ma seguono la distribuzione logaritmica:</p>

\[f_d = \log_{10}(d+1) - \log_{10}(d)\]

<p>con ( $d \in [1,9]$ ).</p>

<hr />

<h2 id="analisi-effettuate">Analisi effettuate</h2>

<h3 id="1-prima-cifra-dei-numeri-di-fibonacci">1. Prima cifra dei numeri di Fibonacci</h3>

<p>Ho estratto la prima cifra dei numeri ( $F_n$ ) e calcolato le frequenze osservate.</p>

<p>Successivamente ho adattato il modello parametrico:</p>

\[f(d) = \log_{10}(d + \alpha) - \log_{10}(d + \beta)\]

<p>L’ipotesi esatta della Legge di Benford corrisponde a:</p>

\[(\alpha_0, \beta_0) = (1.0, 0.0)\]

<p>Anche in questo caso ho:</p>

<ul>
  <li>Eseguito il fit</li>
  <li>Calcolato la matrice di covarianza</li>
  <li>Costruito l’ellisse di confidenza al 95%</li>
  <li>Valutato il $\Delta\chi^2$ rispetto all’ipotesi teorica</li>
</ul>

<hr />

<h3 id="2-prodotti-di-variabili-casuali">2. Prodotti di variabili casuali</h3>

<p>È noto che il prodotto di molte variabili casuali indipendenti tende alla Legge di Benford.</p>

<p>Ho verificato numericamente questo comportamento per:</p>

\[Z_n = \prod_{k=0}^{n} X_k\]

<p>dove ( $X_k$ ) sono variabili uniformi.</p>

<p>All’aumentare di ( n ), la distribuzione della prima cifra converge rapidamente alla distribuzione logaritmica teorica.</p>]]></content><author><name></name></author><category term="Example" /><category term="Test" /><category term="Color" /><summary type="html"><![CDATA[Python Visto che la quasi totalità dei progetti è stata scritta in C++ riporto qui due piccoli progetti con Jupyter notebook. Tali script possono essere aperti con diversi servizi online gratuiti come Google Colab. Grafici Il primo script è stato utilizzato per la creazione dei grafici presenti al capitolo 7 della tesi per il progetto di comunicazione aumentativa. Puoi visitare il progetto e scaricare il PDF della tesi qui sotto. Visita il sito del progetto Scarica la tesi (PDF) Ecco due esempi dei grafici ottenuti. Analisi statistica delle cifre di $\pi$, numeri irrazionali e Legge di Benford In questo secondo progetto ho esplorato il comportamento statistico delle cifre di alcuni numeri irrazionali e di particolari sequenze numeriche, con l’obiettivo di verificare sperimentalmente proprietà teoriche come la normalità delle cifre e la Legge di Benford. Il progetto è scaricabile premendo il seguente pulsante. Scarica il notebook (IPYNB) L’intero lavoro è stato sviluppato in Python, utilizzando librerie scientifiche come mpmath, numpy, scipy e matplotlib. Parte I — Densità delle cifre nei numeri irrazionali Obiettivo Verificare sperimentalmente l’ipotesi che $\pi$ possa comportarsi come un numero normale, ovvero che ogni cifra decimale (0–9) compaia con frequenza pari a 1/10. Metodologia 1. Calcolo di 50.000 cifre di $\pi$ Ho utilizzato la libreria mpmath per generare $\pi$ con precisione arbitraria. È stato necessario impostare correttamente il numero di cifre significative (mp.dps) e convertire il numero in stringa per analizzare ogni singola cifra. 2. Calcolo delle frequenze Per ciascuna cifra ( d \in [0,9] ) ho calcolato: \[f_d = \frac{n_d}{N}\] dove ( $n_d$ ) è il numero di occorrenze della cifra e ( N = 5 $\times 10^4$ ). 3. Stima delle incertezze Assumendo distribuzione binomiale, ho stimato l’errore come: \[\sigma_{f_d} = \sqrt{\frac{f_d(1-f_d)}{N}}\] 4. Fit lineare dei dati Per testare formalmente l’ipotesi di equiprobabilità ho adattato ai dati il modello: \[f_{lin}(d; \alpha, \beta) = \frac{\alpha}{10} + \beta d\] utilizzando scipy.optimize.curve_fit. L’ipotesi teorica di distribuzione uniforme corrisponde al punto: \[(\alpha_0, \beta_0) = (1.0, 0.0)\] 5. Analisi statistica Dal fit ho ottenuto: Parametri ottimali ( $\hat{\alpha}, \hat{\beta}$ ) Matrice di covarianza Correlazione tra i parametri Valore minimo del $\chi^2$: \[\chi^2_{min} = \sum_{d=0}^{9} \left( \frac{f_d - f_{lin}(d;\hat{\alpha},\hat{\beta})}{\sigma_{f_d}} \right)^2\] Con 10 punti e 2 parametri, i gradi di libertà sono: \[n_{dof} = 8\] Ho quindi calcolato il p-value come probabilità di sopravvivenza della distribuzione $\chi^2$. 6. Ellissi di confidenza Utilizzando la matrice di covarianza restituita dal fit, ho costruito l’ellisse definita da: \[\Delta\chi^2 = \chi^2(\alpha,\beta) - \chi^2_{min} = \chi^2_{2,\,0.95}\] Nel grafico sono stati indicati: Il punto di best-fit ( ($\hat{\alpha}, \hat{\beta})$ ) L’ipotesi teorica ( (1,0) ) L’ellisse di confidenza al 68% L’ellisse di confidenza al 95% Questo permette di valutare visivamente e quantitativamente la compatibilità dell’ipotesi di equiprobabilità con i dati. Estensione ad altri numeri La stessa analisi è stata ripetuta per: ( e ) ( $\sqrt{2}$ ) Il numero aureo ( $\varphi$ ) La sequenza di Fibonacci Le sequenze di Lucas e Padovan In tutti i casi analizzati, le frequenze delle cifre risultano compatibili con l’equiprobabilità entro le fluttuazioni statistiche. È particolarmente interessante osservare come sequenze completamente deterministiche, come quella di Fibonacci, mostrino proprietà statistiche simili a quelle attese per numeri normali. Parte II — La Legge di Benford La seconda parte del progetto riguarda la distribuzione della prima cifra significativa. A differenza delle cifre interne di $\pi$, le prime cifre di molte grandezze reali non sono uniformi ma seguono la distribuzione logaritmica: \[f_d = \log_{10}(d+1) - \log_{10}(d)\] con ( $d \in [1,9]$ ). Analisi effettuate 1. Prima cifra dei numeri di Fibonacci Ho estratto la prima cifra dei numeri ( $F_n$ ) e calcolato le frequenze osservate. Successivamente ho adattato il modello parametrico: \[f(d) = \log_{10}(d + \alpha) - \log_{10}(d + \beta)\] L’ipotesi esatta della Legge di Benford corrisponde a: \[(\alpha_0, \beta_0) = (1.0, 0.0)\] Anche in questo caso ho: Eseguito il fit Calcolato la matrice di covarianza Costruito l’ellisse di confidenza al 95% Valutato il $\Delta\chi^2$ rispetto all’ipotesi teorica 2. Prodotti di variabili casuali È noto che il prodotto di molte variabili casuali indipendenti tende alla Legge di Benford. Ho verificato numericamente questo comportamento per: \[Z_n = \prod_{k=0}^{n} X_k\] dove ( $X_k$ ) sono variabili uniformi. All’aumentare di ( n ), la distribuzione della prima cifra converge rapidamente alla distribuzione logaritmica teorica.]]></summary></entry><entry xml:lang="en"><title type="html">Python</title><link href="https://sigfrido11.github.io/personal_website/2025/10/22/python.html" rel="alternate" type="text/html" title="Python" /><published>2025-10-22T00:00:00+00:00</published><updated>2025-10-22T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/2025/10/22/python</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/2025/10/22/python.html"><![CDATA[<h1 id="python">Python</h1>

<p>Since most of my projects are written in C++, I’m sharing here two small projects built with Jupyter notebooks. These scripts can be opened with free online services such as Google Colab.</p>

<h2 id="charts">Charts</h2>

<p>The first script is used to generate the plots shown in Chapter 7 of the thesis for the augmentative communication project. You can visit the project and download the thesis PDF below.</p>

<div class="project-actions">
  <a class="btn secondary" href="https://anna-madonna.github.io/Parole-che-crescono/" target="_blank" rel="noopener">
    Visit the project website
  </a>
  <a class="btn" href="/personal_website/assets/pdf/tesi_mamma.pdf" download="">
    Download the thesis (PDF)
  </a>
</div>

<p>Here are two examples of the resulting plots.</p>

<div class="project-media">
  <img src="/personal_website/assets/img/graph/grafico_1.jpeg" alt="Plot 1" />
  <img src="/personal_website/assets/img/graph/grafico_2.jpeg" alt="Plot 2" />
</div>

<h1 id="statistical-analysis-of-the-digits-of-pi-irrational-numbers-and-benfords-law">Statistical analysis of the digits of $\pi$, irrational numbers, and Benford’s law</h1>

<p>In this project I have explored the statistical behavior of the digits of some irrational numbers and specific numerical sequences, with the goal of experimentally verifying theoretical properties such as <strong>digit normality</strong> and <strong>Benford’s law</strong>. The project can be downloaded using the button below.</p>

<div class="project-actions">
  <a class="btn" href="/personal_website/assets/script/Statistics_project_2025_Giuseppe_Luciano.ipynb" download="">
    Download the notebook (IPYNB)
  </a>
</div>

<p>The entire work was developed in Python, using scientific libraries such as <code class="language-plaintext highlighter-rouge">mpmath</code>, <code class="language-plaintext highlighter-rouge">numpy</code>, <code class="language-plaintext highlighter-rouge">scipy</code>, and <code class="language-plaintext highlighter-rouge">matplotlib</code>.</p>

<hr />
<h2 id="part-i---digit-density-in-irrational-numbers">Part I - Digit density in irrational numbers</h2>

<h3 id="goal">Goal</h3>

<p>Verify experimentally the hypothesis that $\pi$ behaves like a <em>normal</em> number, i.e., that each decimal digit (0-9) appears with frequency 1/10.</p>

<hr />

<h3 id="methodology">Methodology</h3>

<h4 id="1-computing-50000-digits-of-pi">1. Computing 50,000 digits of $\pi$</h4>

<p>I used the <code class="language-plaintext highlighter-rouge">mpmath</code> library to generate $\pi$ with arbitrary precision.
It was necessary to set the number of significant digits (<code class="language-plaintext highlighter-rouge">mp.dps</code>) correctly and convert the number to a string to analyze each digit.</p>

<h4 id="2-computing-frequencies">2. Computing frequencies</h4>

<p>For each digit ( $d \in [0,9]$ ) I computed:</p>

\[f_d = \frac{n_d}{N}\]

<p>where ( $n_d$ ) is the number of occurrences of the digit and ( $N = 5 \times 10^4$ ).</p>

<h4 id="3-uncertainty-estimates">3. Uncertainty estimates</h4>

<p>Assuming a binomial distribution, I estimated the error as:</p>

\[\sigma_{f_d} = \sqrt{\frac{f_d(1-f_d)}{N}}\]

<h4 id="4-linear-fit-of-the-data">4. Linear fit of the data</h4>

<p>To formally test the equiprobability hypothesis I fitted the model:</p>

\[f_{lin}(d; \alpha, \beta) = \frac{\alpha}{10} + \beta d\]

<p>using <code class="language-plaintext highlighter-rouge">scipy.optimize.curve_fit</code>.</p>

<p>The theoretical uniform-distribution hypothesis corresponds to:</p>

\[(\alpha_0, \beta_0) = (1.0, 0.0)\]

<h4 id="5-statistical-analysis">5. Statistical analysis</h4>

<p>From the fit I obtained:</p>

<ul>
  <li>Best-fit parameters ( $\hat{\alpha}, \hat{\beta}$ )</li>
  <li>Covariance matrix</li>
  <li>Parameter correlation</li>
  <li>Minimum $\chi^2$:</li>
</ul>

\[\chi^2_{min} =
\sum_{d=0}^{9}
\left(
\frac{f_d - f_{lin}(d;\hat{\alpha},\hat{\beta})}{\sigma_{f_d}}
\right)^2\]

<p>With 10 points and 2 parameters, the degrees of freedom are:</p>

\[n_{dof} = 8\]

<p>I then computed the p-value as the survival probability of the $\chi^2$ distribution.</p>

<h4 id="6-confidence-ellipse">6. Confidence ellipse</h4>

<p>Using the covariance matrix returned by the fit, I built the ellipse defined by:</p>

\[\Delta\chi^2 = \chi^2(\alpha,\beta) - \chi^2_{min}
= \chi^2_{2,\,0.95}\]

<p>The plot shows:</p>

<ul>
  <li>The best-fit point ( $(\hat{\alpha}, \hat{\beta})$ )</li>
  <li>The theoretical hypothesis ( (1,0) )</li>
  <li>The 68% confidence ellipse</li>
  <li>The 95% confidence ellipse</li>
</ul>

<p>This allows a visual and quantitative assessment of the compatibility of the equiprobability hypothesis with the data.</p>

<hr />

<h2 id="extension-to-other-numbers">Extension to other numbers</h2>

<p>The same analysis was repeated for:</p>

<ul>
  <li>( e )</li>
  <li>( $\sqrt{2}$ )</li>
  <li>The golden ratio ( $\varphi$ )</li>
  <li>The concatenation of Fibonacci numbers</li>
  <li>The Lucas and Padovan sequences</li>
</ul>

<p>In all cases, the digit frequencies are compatible with equiprobability within statistical fluctuations.</p>

<p>It is especially interesting to see how fully deterministic sequences, such as Fibonacci, show statistical properties similar to those expected for normal numbers.</p>

<hr />

<h1 id="part-ii---benfords-law">Part II - Benford’s law</h1>

<p>The second part of the project concerns the distribution of the <strong>first significant digit</strong>.</p>

<p>Unlike the internal digits of $\pi$, the leading digit of many real-world quantities is not uniform but follows the logarithmic distribution:</p>

\[f_d = \log_{10}(d+1) - \log_{10}(d)\]

<p>with ( $d \in [1,9]$ ).</p>

<hr />

<h2 id="analyses-performed">Analyses performed</h2>

<h3 id="1-first-digit-of-fibonacci-numbers">1. First digit of Fibonacci numbers</h3>

<p>I extracted the first digit of the numbers ( $F_n$ ) and computed the observed frequencies.</p>

<p>I then fitted the parametric model:</p>

\[f(d) = \log_{10}(d + \alpha) - \log_{10}(d + \beta)\]

<p>The exact Benford’s law hypothesis corresponds to:</p>

\[(\alpha_0, \beta_0) = (1.0, 0.0)\]

<p>In this case as well I:</p>

<ul>
  <li>Performed the fit</li>
  <li>Computed the covariance matrix</li>
  <li>Built the 68% and 95% confidence ellipse</li>
  <li>Evaluated $\Delta\chi^2$ relative to the theoretical hypothesis</li>
</ul>

<hr />

<h3 id="2-products-of-random-variables">2. Products of random variables</h3>

<p>It is known that the product of many independent random variables tends to follow Benford’s law.</p>

<p>I verified this behavior numerically for:</p>

\[Z_n = \prod_{k=0}^{n} X_k\]

<p>where ( $X_k$ ) are uniform variables.</p>

<p>As ( n ) increases, the first-digit distribution rapidly converges to the theoretical logarithmic distribution.</p>]]></content><author><name></name></author><category term="Test" /><category term="Color" /><summary type="html"><![CDATA[Python Since most of my projects are written in C++, I’m sharing here two small projects built with Jupyter notebooks. These scripts can be opened with free online services such as Google Colab. Charts The first script is used to generate the plots shown in Chapter 7 of the thesis for the augmentative communication project. You can visit the project and download the thesis PDF below. Visit the project website Download the thesis (PDF) Here are two examples of the resulting plots. Statistical analysis of the digits of $\pi$, irrational numbers, and Benford’s law In this project I have explored the statistical behavior of the digits of some irrational numbers and specific numerical sequences, with the goal of experimentally verifying theoretical properties such as digit normality and Benford’s law. The project can be downloaded using the button below. Download the notebook (IPYNB) The entire work was developed in Python, using scientific libraries such as mpmath, numpy, scipy, and matplotlib. Part I - Digit density in irrational numbers Goal Verify experimentally the hypothesis that $\pi$ behaves like a normal number, i.e., that each decimal digit (0-9) appears with frequency 1/10. Methodology 1. Computing 50,000 digits of $\pi$ I used the mpmath library to generate $\pi$ with arbitrary precision. It was necessary to set the number of significant digits (mp.dps) correctly and convert the number to a string to analyze each digit. 2. Computing frequencies For each digit ( $d \in [0,9]$ ) I computed: \[f_d = \frac{n_d}{N}\] where ( $n_d$ ) is the number of occurrences of the digit and ( $N = 5 \times 10^4$ ). 3. Uncertainty estimates Assuming a binomial distribution, I estimated the error as: \[\sigma_{f_d} = \sqrt{\frac{f_d(1-f_d)}{N}}\] 4. Linear fit of the data To formally test the equiprobability hypothesis I fitted the model: \[f_{lin}(d; \alpha, \beta) = \frac{\alpha}{10} + \beta d\] using scipy.optimize.curve_fit. The theoretical uniform-distribution hypothesis corresponds to: \[(\alpha_0, \beta_0) = (1.0, 0.0)\] 5. Statistical analysis From the fit I obtained: Best-fit parameters ( $\hat{\alpha}, \hat{\beta}$ ) Covariance matrix Parameter correlation Minimum $\chi^2$: \[\chi^2_{min} = \sum_{d=0}^{9} \left( \frac{f_d - f_{lin}(d;\hat{\alpha},\hat{\beta})}{\sigma_{f_d}} \right)^2\] With 10 points and 2 parameters, the degrees of freedom are: \[n_{dof} = 8\] I then computed the p-value as the survival probability of the $\chi^2$ distribution. 6. Confidence ellipse Using the covariance matrix returned by the fit, I built the ellipse defined by: \[\Delta\chi^2 = \chi^2(\alpha,\beta) - \chi^2_{min} = \chi^2_{2,\,0.95}\] The plot shows: The best-fit point ( $(\hat{\alpha}, \hat{\beta})$ ) The theoretical hypothesis ( (1,0) ) The 68% confidence ellipse The 95% confidence ellipse This allows a visual and quantitative assessment of the compatibility of the equiprobability hypothesis with the data. Extension to other numbers The same analysis was repeated for: ( e ) ( $\sqrt{2}$ ) The golden ratio ( $\varphi$ ) The concatenation of Fibonacci numbers The Lucas and Padovan sequences In all cases, the digit frequencies are compatible with equiprobability within statistical fluctuations. It is especially interesting to see how fully deterministic sequences, such as Fibonacci, show statistical properties similar to those expected for normal numbers. Part II - Benford’s law The second part of the project concerns the distribution of the first significant digit. Unlike the internal digits of $\pi$, the leading digit of many real-world quantities is not uniform but follows the logarithmic distribution: \[f_d = \log_{10}(d+1) - \log_{10}(d)\] with ( $d \in [1,9]$ ). Analyses performed 1. First digit of Fibonacci numbers I extracted the first digit of the numbers ( $F_n$ ) and computed the observed frequencies. I then fitted the parametric model: \[f(d) = \log_{10}(d + \alpha) - \log_{10}(d + \beta)\] The exact Benford’s law hypothesis corresponds to: \[(\alpha_0, \beta_0) = (1.0, 0.0)\] In this case as well I: Performed the fit Computed the covariance matrix Built the 68% and 95% confidence ellipse Evaluated $\Delta\chi^2$ relative to the theoretical hypothesis 2. Products of random variables It is known that the product of many independent random variables tends to follow Benford’s law. I verified this behavior numerically for: \[Z_n = \prod_{k=0}^{n} X_k\] where ( $X_k$ ) are uniform variables. As ( n ) increases, the first-digit distribution rapidly converges to the theoretical logarithmic distribution.]]></summary></entry><entry xml:lang="en"><title type="html">Bachelor’s Thesis</title><link href="https://sigfrido11.github.io/personal_website/example/2025/09/19/bachelor-thesis-en.html" rel="alternate" type="text/html" title="Bachelor’s Thesis" /><published>2025-09-19T00:00:00+00:00</published><updated>2025-09-19T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/example/2025/09/19/bachelor-thesis-en</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/example/2025/09/19/bachelor-thesis-en.html"><![CDATA[<h2 id="bachelors-thesis">Bachelor’s Thesis</h2>

<p>My bachelor’s thesis investigates the possible existence and detection of a hypothetical exotic supernucleus, the <em>c-deuteron</em>. This state is theorised as a bound system between a charmed baryon, $\Lambda_{c}^{+}$, and a neutron. Theoretical studies suggest it could offer unique insights into interactions between charmed baryons and nucleons, opening a new window on strong-interaction dynamics in the presence of the charm quark. Although no experimental confirmation exists yet, searches in high-energy collision facilities aim to identify this exotic supernucleus.</p>

<p>You can read the full thesis using the button below:</p>
<div class="thesis-download">
  <a class="btn" href="/personal_website/assets/pdf/tesi_triennale.pdf" download="">
    Download the thesis (PDF)
  </a>
  <a class="btn secondary" href="https://amslaurea.unibo.it/id/eprint/37352/" target="_blank" rel="noopener">
    Website
  </a>
</div>

<style>
  .thesis-download {
    margin-top: 1.25rem;
    text-align: center;
    display: flex;
    gap: 0.8rem;
    justify-content: center;
    flex-wrap: wrap;
  }
  .thesis-download .btn {
    display: inline-block;
    padding: 0.75em 1.6em;
    border-radius: 999px;
    background: linear-gradient(120deg, #0b6fa4, #00a67c);
    color: #fff;
    box-shadow: 0 10px 25px -12px rgba(0, 166, 124, 0.55);
    transition: transform 0.15s ease, box-shadow 0.2s ease, filter 0.2s ease;
  }
  .thesis-download .btn.secondary {
    background: linear-gradient(120deg, #3a4f63, #5a7490);
  }
  .thesis-download .btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 14px 28px -14px rgba(0, 166, 124, 0.65), 0 0 12px rgba(11, 111, 164, 0.65);
    filter: brightness(1.06);
  }
  .thesis-download .btn:active {
    transform: translateY(1px) scale(0.99);
    box-shadow: 0 8px 18px -12px rgba(0, 166, 124, 0.7), 0 0 16px rgba(11, 111, 164, 0.75);
  }
</style>

<h2 id="what-was-done">What was done?</h2>

<p>Using the <a href="https://arxiv.org/abs/1901.05249">Thermal Fist</a> simulation framework, multiple event samples were generated to study how varying key parameters affects the production of the c-deuteron: freeze-out temperature, freeze-out radius, and charm fugacity. The plots below summarise the observed trends and best-fit parameters.</p>

<div class="bachelor-media">
  <img src="/personal_website/assets/img/pexels/2dgraph.png" />
  <img src="/personal_website/assets/img/pexels/var_radius.png" />
  <img src="/personal_website/assets/img/pexels/var_temperaure.png" />
  <img src="/personal_website/assets/img/pexels/var_fugacity.png" />

 </div>

<p>For full details, see the thesis.</p>

<p>The next step focused on detecting secondary deuterons from c-deuteron decay. The transverse-momentum distribution of the c-deuteron was derived from the previous analysis, then events were generated with <strong>Pythia 8</strong> so that the $p_T$ spectrum matched the expected one.</p>

<p>Using a Hit-or-Miss approach with ALICE detector specifications, we estimated the fraction of secondary deuterons whose tracks could be correctly reconstructed.</p>

<p>The increase in reconstructed deuterons, under reasonable assumptions, is:
\(N_{\text{deut}} = (1938 \pm 12)\ \text{deuterons}\)</p>

<p>Again, all methodological details are in the thesis text.</p>

<h2 id="explore-the-code">Explore the code</h2>

<p>The analysis code is available on GitHub:</p>
<div class="thermal-fist">
  <a class="btn secondary" href="https://github.com/Sigfrido11/tesi_triennale" target="_blank" rel="noopener">
    Open the repository
  </a>
</div>

<p>In <code class="language-plaintext highlighter-rouge">tesi.C</code> you will find the data analysis and plotting routines; the <code class="language-plaintext highlighter-rouge">rilevazioni/</code> folder (plus the accompanying Pythia files) contains the Monte Carlo implementation used for the reconstruction study.</p>]]></content><author><name></name></author><category term="Example" /><category term="A Tag" /><category term="Katex" /><summary type="html"><![CDATA[Bachelor’s Thesis My bachelor’s thesis investigates the possible existence and detection of a hypothetical exotic supernucleus, the c-deuteron. This state is theorised as a bound system between a charmed baryon, $\Lambda_{c}^{+}$, and a neutron. Theoretical studies suggest it could offer unique insights into interactions between charmed baryons and nucleons, opening a new window on strong-interaction dynamics in the presence of the charm quark. Although no experimental confirmation exists yet, searches in high-energy collision facilities aim to identify this exotic supernucleus. You can read the full thesis using the button below: Download the thesis (PDF) Website What was done? Using the Thermal Fist simulation framework, multiple event samples were generated to study how varying key parameters affects the production of the c-deuteron: freeze-out temperature, freeze-out radius, and charm fugacity. The plots below summarise the observed trends and best-fit parameters. For full details, see the thesis. The next step focused on detecting secondary deuterons from c-deuteron decay. The transverse-momentum distribution of the c-deuteron was derived from the previous analysis, then events were generated with Pythia 8 so that the $p_T$ spectrum matched the expected one. Using a Hit-or-Miss approach with ALICE detector specifications, we estimated the fraction of secondary deuterons whose tracks could be correctly reconstructed. The increase in reconstructed deuterons, under reasonable assumptions, is: \(N_{\text{deut}} = (1938 \pm 12)\ \text{deuterons}\) Again, all methodological details are in the thesis text. Explore the code The analysis code is available on GitHub: Open the repository In tesi.C you will find the data analysis and plotting routines; the rilevazioni/ folder (plus the accompanying Pythia files) contains the Monte Carlo implementation used for the reconstruction study.]]></summary></entry><entry xml:lang="it"><title type="html">Tesi triennale</title><link href="https://sigfrido11.github.io/personal_website/example/2025/09/19/bachelor-thesis.html" rel="alternate" type="text/html" title="Tesi triennale" /><published>2025-09-19T00:00:00+00:00</published><updated>2025-09-19T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/example/2025/09/19/bachelor-thesis</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/example/2025/09/19/bachelor-thesis.html"><![CDATA[<h2 id="tesi-triennale">Tesi triennale</h2>

<p>La tesi di laurea triennale è un’indagine sulla possibile esistenza e rilevazione di un ipotetico supernucleo ancora non osservato sperimentalmente, chiamato <em>c‑deuterone</em>. Il c‑deuterone è un supernucleo esotico ipotizzato come uno stato
legato tra un barione $\Lambda_{c}^{+}$ e un neutrone. Studi teorici suggeriscono che tale sistema possa fornire approfondimenti unici sulle interazioni tra barioni charmati e nucleoni, offrendo una nuova finestra sulle dinamiche delle interazioni forti in presenza del quark charm. Sebbene la conferma sperimentale sia ancora assente, la sua ricerca in strutture dove avvengono collisioni ad alta energia mira a identificare la possibile esistenza di questo supernucleo esotico.</p>

<p>Puoi leggere la tesi completa dai link qui sotto.</p>

<div class="thesis-download">
  <a class="btn" href="/personal_website/assets/pdf/tesi_triennale.pdf" download="">
    Scarica la tesi (PDF)
  </a>
  <a class="btn secondary" href="https://amslaurea.unibo.it/id/eprint/37352/" target="_blank" rel="noopener">
    Visita il sito
  </a>
</div>

<style>
  .thesis-download {
    margin-top: 1.25rem;
    text-align: center;
    display: flex;
    gap: 0.8rem;
    gap: 0.8rem;
    justify-content: center;
    flex-wrap: wrap;
  }
  .thesis-download .btn {
    display: inline-block;
    padding: 0.75em 1.6em;
    border-radius: 999px;
    background: linear-gradient(120deg, #0b6fa4, #00a67c);
    color: #fff;
    box-shadow: 0 10px 25px -12px rgba(0, 166, 124, 0.55);
    transition: transform 0.15s ease, box-shadow 0.2s ease, filter 0.2s ease;
  }
  .thesis-download .btn.secondary {
    background: linear-gradient(120deg, #3a4f63, #5a7490);
  }
  .thesis-download .btn:hover {
    transform: translateY(-1px);
    box-shadow: 0 14px 28px -14px rgba(0, 166, 124, 0.65), 0 0 12px rgba(11, 111, 164, 0.65);
    filter: brightness(1.06);
  }
  .thesis-download .btn:active {
    transform: translateY(1px) scale(0.99);
    box-shadow: 0 8px 18px -12px rgba(0, 166, 124, 0.7), 0 0 16px rgba(11, 111, 164, 0.75);
  }
</style>

<h2 id="cosa-è-stato-fatto">Cosa è stato fatto?</h2>

<p>Grazie al programma di analisi <a href="https://arxiv.org/abs/1901.05249">Thermal Fist</a>, si sono generati diversi eventi analizzando come la variazione di parametri della simulazione influenzi la produzione del supernucleo: temperatura di freeze-out, raggio di freeze-out e fugacità di charm. I grafici seguenti riassumono gli andamenti individuati e i parametri di best fit.</p>

<div class="bachelor-media">
  <img src="/personal_website/assets/img/pexels/2dgraph.png" />
  <img src="/personal_website/assets/img/pexels/var_radius.png" />
  <img src="/personal_website/assets/img/pexels/var_temperaure.png" />
  <img src="/personal_website/assets/img/pexels/var_fugacity.png" />


 </div>

<p>Per maggiori dettagli rimando al testo.</p>

<p>Successivamente si è proceduto con la fase relativa alla rilevazione dei deutoni secondari derivanti dal decadimento del c-deuterone. Usando i dati precedentemente raccolti si è ottenuta la distribuzione dell’impulso trasverso del c-deuterone e si sono generati, con Pythia 8, tali supernuclei in modo che l’impulso trasverso risultasse coerente con quanto trovato.</p>

<p>Con un approccio di tipo Hit or Miss, impiegando le specifiche del rivelatore di ALICE, è stata stimata la frazione di deutoni secondari da decadimento del c-deuterone la cui traccia risulta ricostruibile.</p>

<p>L’incremento del numero di deutoni è risultato, sotto opportune ipotesi, pari a:
\(N_{deut} = (1938 \pm 12) \text{deutoni}\)</p>

<p>Per approfondire, rimando nuovamente al testo.</p>

<h2 id="esplora-il-codice">Esplora il codice</h2>

<p>Per toccare con mano il codice è possibile visitare il seguente <a href="https://github.com/Sigfrido11/tesi_triennale">link</a>. Nel file <code class="language-plaintext highlighter-rouge">tesi.C</code> trovi la parte di codice relativa all’analisi dei dati prodotti e alla generazione dei grafici, mentre nella cartella <code class="language-plaintext highlighter-rouge">rilevazioni/</code>, oltre ai file di Pythia, si trova il codice con l’implementazione Monte Carlo.</p>]]></content><author><name></name></author><category term="Example" /><category term="A Tag" /><category term="Katex" /><summary type="html"><![CDATA[Tesi triennale La tesi di laurea triennale è un’indagine sulla possibile esistenza e rilevazione di un ipotetico supernucleo ancora non osservato sperimentalmente, chiamato c‑deuterone. Il c‑deuterone è un supernucleo esotico ipotizzato come uno stato legato tra un barione $\Lambda_{c}^{+}$ e un neutrone. Studi teorici suggeriscono che tale sistema possa fornire approfondimenti unici sulle interazioni tra barioni charmati e nucleoni, offrendo una nuova finestra sulle dinamiche delle interazioni forti in presenza del quark charm. Sebbene la conferma sperimentale sia ancora assente, la sua ricerca in strutture dove avvengono collisioni ad alta energia mira a identificare la possibile esistenza di questo supernucleo esotico. Puoi leggere la tesi completa dai link qui sotto. Scarica la tesi (PDF) Visita il sito Cosa è stato fatto? Grazie al programma di analisi Thermal Fist, si sono generati diversi eventi analizzando come la variazione di parametri della simulazione influenzi la produzione del supernucleo: temperatura di freeze-out, raggio di freeze-out e fugacità di charm. I grafici seguenti riassumono gli andamenti individuati e i parametri di best fit. Per maggiori dettagli rimando al testo. Successivamente si è proceduto con la fase relativa alla rilevazione dei deutoni secondari derivanti dal decadimento del c-deuterone. Usando i dati precedentemente raccolti si è ottenuta la distribuzione dell’impulso trasverso del c-deuterone e si sono generati, con Pythia 8, tali supernuclei in modo che l’impulso trasverso risultasse coerente con quanto trovato. Con un approccio di tipo Hit or Miss, impiegando le specifiche del rivelatore di ALICE, è stata stimata la frazione di deutoni secondari da decadimento del c-deuterone la cui traccia risulta ricostruibile. L’incremento del numero di deutoni è risultato, sotto opportune ipotesi, pari a: \(N_{deut} = (1938 \pm 12) \text{deutoni}\) Per approfondire, rimando nuovamente al testo. Esplora il codice Per toccare con mano il codice è possibile visitare il seguente link. Nel file tesi.C trovi la parte di codice relativa all’analisi dei dati prodotti e alla generazione dei grafici, mentre nella cartella rilevazioni/, oltre ai file di Pythia, si trova il codice con l’implementazione Monte Carlo.]]></summary></entry><entry xml:lang="en"><title type="html">Particle project</title><link href="https://sigfrido11.github.io/personal_website/example/2024/02/12/particle-en.html" rel="alternate" type="text/html" title="Particle project" /><published>2024-02-12T00:00:00+00:00</published><updated>2024-02-12T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/example/2024/02/12/particle-en</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/example/2024/02/12/particle-en.html"><![CDATA[<h1 id="particle-physics-simulation-and-k-reconstruction">Particle Physics Simulation and K* Reconstruction</h1>

<h2 id="overview">Overview</h2>

<p>This project can be explored at the following link.</p>
<div class="thesis-download">
  <a class="btn secondary" href="https://github.com/Sigfrido11/Particle_sim" target="_blank" rel="noopener">
    View the project site
  </a>
</div>

<p>This project implements a <strong>Monte Carlo simulation of particle physics events</strong> using ROOT for statistical analysis and visualization.</p>

<p>The main goal is:</p>

<blockquote>
  <p><strong>Reconstruct the K*</strong> resonance (mass ~0.892 GeV) from the invariant-mass spectrum of $\pi$-K pairs.</p>
</blockquote>

<p>The code simulates events with light particles ($\pi$, K, p) and an unstable resonance (K*) whitch decays into two particles. Then it analyzes the invariant-mass spectra to identify the resonance peak above the combinatorial background.</p>

<hr />

<h1 id="project-structure">Project Structure</h1>

<p>The project is split into three main components:</p>

<h2 id="1-particlecpp">1 <code class="language-plaintext highlighter-rouge">particle.cpp</code></h2>

<p>Implements the <code class="language-plaintext highlighter-rouge">Particle</code> class, which represents a physical particle with:</p>

<ul>
  <li>name</li>
  <li>momentum (px, py, pz)</li>
  <li>mass</li>
  <li>charge</li>
  <li>optional decay width (for resonances)</li>
</ul>

<h3 id="main-features">Main features</h3>

<ul>
  <li>
    <p>Relativistic energy calculation:
\(E = \sqrt{p^2 + m^2}\)</p>
  </li>
  <li>
    <p>Invariant mass calculation between two particles:</p>
  </li>
</ul>

\[m_{inv} = \sqrt{(E1 + E2)^2 - |p1 + p2|^2}\]

<ul>
  <li>Two-body decay (<code class="language-plaintext highlighter-rouge">Decay2Body</code>)</li>
  <li>Includes resonance width effects (Breit-Wigner simulated via Gaussian distribution)</li>
  <li>Isotropic generation of decay products</li>
  <li>Relativistic boost to the laboratory frame</li>
</ul>

<p>This class is the physics core of the project.</p>

<hr />

<h2 id="2-maincpp">2 <code class="language-plaintext highlighter-rouge">main.cpp</code></h2>

<p>It is the <strong>simulation engine</strong>.</p>

<h3 id="what-it-does">What it does</h3>

<p>Defines particle types:</p>
<ul>
  <li>$\pi^+$, $\pi^-$</li>
  <li>$K^+$, $K^-$</li>
  <li>$p^+$, $p^-$</li>
  <li>K* resonance (mass 0.89166 GeV, width 0.050 GeV)</li>
</ul>

<p>Simulates 100,000 events with 100 particles each.</p>

<hr />

<h2 id="particle-generation">Particle Generation</h2>

<p>Particles are generated with the following probabilities:</p>

<table>
  <thead>
    <tr>
      <th>Particle</th>
      <th>Probability</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$\pi^+$</td>
      <td>40%</td>
    </tr>
    <tr>
      <td>$\pi^-$</td>
      <td>40%</td>
    </tr>
    <tr>
      <td>$K^+$</td>
      <td>5%</td>
    </tr>
    <tr>
      <td>$K^-$</td>
      <td>5%</td>
    </tr>
    <tr>
      <td>$p^+$</td>
      <td>4.5%</td>
    </tr>
    <tr>
      <td>$p^-$</td>
      <td>4.5%</td>
    </tr>
    <tr>
      <td>K*</td>
      <td>1%</td>
    </tr>
  </tbody>
</table>

<p>The magnitude of the momentum follows an isotropic exponential distribution:</p>

\[p \sim e^{-p}\]

<hr />

<h2 id="k-production-and-decay">K* Production and Decay</h2>

<p>When a resonance is generated:</p>

<ol>
  <li>A particle <code class="language-plaintext highlighter-rouge">"resonance"</code> is created</li>
  <li>It decays into:
    <ul>
      <li>$\pi^+ K^-$  (50%)</li>
      <li>$\pi^- K^+$  (50%)</li>
    </ul>
  </li>
  <li>The following are recorded:
    <ul>
      <li>invariant mass of decay products</li>
      <li>contribution to the combinatorial background</li>
    </ul>
  </li>
</ol>

<p>This is essential to verify that the resonance peak can be reconstructed even in the presence of background.</p>

<hr />
<h1 id="analysis-analysecpp">Analysis (<code class="language-plaintext highlighter-rouge">analyse.cpp</code>)</h1>

<h2 id="the-analysis-phase-reads-the-generated-root-file-and-checks-the-physical-and-statistical-consistency-of-the-simulation">The analysis phase reads the generated ROOT file and checks the physical and statistical consistency of the simulation.</h2>

<h2 id="consistency-checks">Consistency Checks</h2>

<ul>
  <li>Total number of particles generated</li>
  <li>Species distributions ($\pi$, K, p, K*)</li>
  <li>Comparison with theoretical probabilities (compatibility within $3\sigma$)</li>
</ul>

<p>The goal is to verify that the Monte Carlo generation correctly reproduces the fractions set in the generator.</p>

<hr />

<h2 id="distribution-studies">Distribution Studies</h2>

<p>Several kinematic observables are analyzed:</p>

<ul>
  <li>Uniform angle distributions ($\phi$, $\theta$)</li>
  <li>Exponential fit of the momentum magnitude:</li>
</ul>

\[f(p) \propto e^{-p}\]

<ul>
  <li>Invariant mass spectra built for:
    <ul>
      <li>all pairs</li>
      <li>same-charge pairs</li>
      <li>opposite-charge pairs</li>
      <li>$\pi$-K pairs only</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="combinatorial-background-subtraction">Combinatorial Background Subtraction</h2>

<p>To isolate the K* signal, the difference between opposite-charge and same-charge pairs is used:</p>

\[\text{Signal}(m) =
\left( \frac{dN}{dm} \right)_{\text{opposite charge}}
-
\left( \frac{dN}{dm} \right)_{\text{same charge}}\]

<p>This method reduces the uncorrelated background, allowing the contribution of real resonances to emerge.</p>

<p>Two spectra are obtained:</p>

<ul>
  <li>Full spectrum (all combinations)</li>
  <li>Spectrum selecting only $\pi$-K pairs</li>
</ul>

<p>After removing the background, the graph of the invariant mass, visible below, show clearly a pcik in correspondence of the resonance mass k*.</p>

<div class="project-media">
  <img src="/personal_website/assets/img/graph/k*_picture.png" alt="Invariant mass plot for K* resonance" />
 </div>
<hr />

<h2 id="resonance-fit">Resonance Fit</h2>

<p>The peak is fitted with a Gaussian function:</p>

\[f(m) = A \exp\left(
-\frac{(m - \mu)^2}{2\sigma^2}
\right)\]

<p>The fit extracts:</p>

<ul>
  <li>K* mass ($\mu$)</li>
  <li>Observed width ($\sigma$)</li>
  <li>$\chi^2/\text{NDF}$</li>
  <li>Fit probability</li>
</ul>

<p>The expected result is a mass compatible with:</p>

\[m_{K^*} \approx 0.892 \ \text{GeV}\]

<hr />

<h1 id="why-this-project-is-interesting">Why This Project Is Interesting</h1>

<p>This code reproduces, in simplified form, real analysis techniques used in high-energy physics:</p>

<ul>
  <li>Resonance reconstruction via invariant mass</li>
  <li>Combinatorial background estimation and subtraction</li>
  <li>Statistical fits with ROOT</li>
  <li>Validation through $\chi^2$ and fit probability</li>
</ul>

<p>To do this, it goes through all phases of a simulation. It starts with the physical part of the project where particles are generated according to a given distribution and the decay of possible K* is studied. Thanks to the data analysis phase different histograms of possible combinations are built and the background is then removed. This process highlights a peak in the invariant-mass plot, revealing the presence of the resonance. This small-scale model allow to understand in a simplified way a possible process used to discover new particles.</p>

<h2 id="-collaborators">👥 Collaborators</h2>

<p>This project was possible thanks to the contributions of:</p>
<ul>
  <li><strong>Sigfrido11</strong>  🔗 <a href="https://github.com/Sigfrido11">GitHub</a></li>
  <li><strong>Fioralli</strong>  🔗 <a href="https://github.com/Fioralli">GitHub</a></li>
  <li><strong>SierraTangoEcho</strong>  🔗 <a href="https://github.com/SierraTangoEcho">GitHub</a></li>
</ul>]]></content><author><name></name></author><category term="Example" /><category term="A Tag" /><category term="Katex" /><summary type="html"><![CDATA[Particle Physics Simulation and K* Reconstruction Overview This project can be explored at the following link. View the project site This project implements a Monte Carlo simulation of particle physics events using ROOT for statistical analysis and visualization. The main goal is: Reconstruct the K* resonance (mass ~0.892 GeV) from the invariant-mass spectrum of $\pi$-K pairs. The code simulates events with light particles ($\pi$, K, p) and an unstable resonance (K*) whitch decays into two particles. Then it analyzes the invariant-mass spectra to identify the resonance peak above the combinatorial background. Project Structure The project is split into three main components: 1 particle.cpp Implements the Particle class, which represents a physical particle with: name momentum (px, py, pz) mass charge optional decay width (for resonances) Main features Relativistic energy calculation: \(E = \sqrt{p^2 + m^2}\) Invariant mass calculation between two particles: \[m_{inv} = \sqrt{(E1 + E2)^2 - |p1 + p2|^2}\] Two-body decay (Decay2Body) Includes resonance width effects (Breit-Wigner simulated via Gaussian distribution) Isotropic generation of decay products Relativistic boost to the laboratory frame This class is the physics core of the project. 2 main.cpp It is the simulation engine. What it does Defines particle types: $\pi^+$, $\pi^-$ $K^+$, $K^-$ $p^+$, $p^-$ K* resonance (mass 0.89166 GeV, width 0.050 GeV) Simulates 100,000 events with 100 particles each. Particle Generation Particles are generated with the following probabilities: Particle Probability $\pi^+$ 40% $\pi^-$ 40% $K^+$ 5% $K^-$ 5% $p^+$ 4.5% $p^-$ 4.5% K* 1% The magnitude of the momentum follows an isotropic exponential distribution: \[p \sim e^{-p}\] K* Production and Decay When a resonance is generated: A particle "resonance" is created It decays into: $\pi^+ K^-$ (50%) $\pi^- K^+$ (50%) The following are recorded: invariant mass of decay products contribution to the combinatorial background This is essential to verify that the resonance peak can be reconstructed even in the presence of background. Analysis (analyse.cpp) The analysis phase reads the generated ROOT file and checks the physical and statistical consistency of the simulation. Consistency Checks Total number of particles generated Species distributions ($\pi$, K, p, K*) Comparison with theoretical probabilities (compatibility within $3\sigma$) The goal is to verify that the Monte Carlo generation correctly reproduces the fractions set in the generator. Distribution Studies Several kinematic observables are analyzed: Uniform angle distributions ($\phi$, $\theta$) Exponential fit of the momentum magnitude: \[f(p) \propto e^{-p}\] Invariant mass spectra built for: all pairs same-charge pairs opposite-charge pairs $\pi$-K pairs only Combinatorial Background Subtraction To isolate the K* signal, the difference between opposite-charge and same-charge pairs is used: \[\text{Signal}(m) = \left( \frac{dN}{dm} \right)_{\text{opposite charge}} - \left( \frac{dN}{dm} \right)_{\text{same charge}}\] This method reduces the uncorrelated background, allowing the contribution of real resonances to emerge. Two spectra are obtained: Full spectrum (all combinations) Spectrum selecting only $\pi$-K pairs After removing the background, the graph of the invariant mass, visible below, show clearly a pcik in correspondence of the resonance mass k*. Resonance Fit The peak is fitted with a Gaussian function: \[f(m) = A \exp\left( -\frac{(m - \mu)^2}{2\sigma^2} \right)\] The fit extracts: K* mass ($\mu$) Observed width ($\sigma$) $\chi^2/\text{NDF}$ Fit probability The expected result is a mass compatible with: \[m_{K^*} \approx 0.892 \ \text{GeV}\] Why This Project Is Interesting This code reproduces, in simplified form, real analysis techniques used in high-energy physics: Resonance reconstruction via invariant mass Combinatorial background estimation and subtraction Statistical fits with ROOT Validation through $\chi^2$ and fit probability To do this, it goes through all phases of a simulation. It starts with the physical part of the project where particles are generated according to a given distribution and the decay of possible K* is studied. Thanks to the data analysis phase different histograms of possible combinations are built and the background is then removed. This process highlights a peak in the invariant-mass plot, revealing the presence of the resonance. This small-scale model allow to understand in a simplified way a possible process used to discover new particles. 👥 Collaborators This project was possible thanks to the contributions of: Sigfrido11 🔗 GitHub Fioralli 🔗 GitHub SierraTangoEcho 🔗 GitHub]]></summary></entry><entry xml:lang="it"><title type="html">Particle project</title><link href="https://sigfrido11.github.io/personal_website/example/2024/02/12/particle.html" rel="alternate" type="text/html" title="Particle project" /><published>2024-02-12T00:00:00+00:00</published><updated>2024-02-12T00:00:00+00:00</updated><id>https://sigfrido11.github.io/personal_website/example/2024/02/12/particle</id><content type="html" xml:base="https://sigfrido11.github.io/personal_website/example/2024/02/12/particle.html"><![CDATA[<h1 id="simulazione-di-fisica-delle-particelle-per-la-ricostruzione-della-risonanza-k">Simulazione di fisica delle particelle per la ricostruzione della risonanza K*</h1>

<h2 id="overview">Overview</h2>

<p>Questo progetto può essere esplorato al seguente link.</p>
<div class="thesis-download">
  <a class="btn secondary" href="https://github.com/Sigfrido11/Particle_sim" target="_blank" rel="noopener">
    Visita il sito del progetto
  </a>
</div>

<p>Questo progetto implementa una <strong>simulazione Monte Carlo di eventi di fisica delle particelle</strong> utilizzando ROOT per l’analisi statistica e la visualizzazione dei risultati.</p>

<p>L’obiettivo principale è:</p>

<blockquote>
  <p><strong>Ricostruire la risonanza K*</strong> (massa ~0.892 GeV) a partire dallo spettro delle masse invarianti delle coppie $\pi$–K.</p>
</blockquote>

<p>Il codice simula eventi con produzione di particelle leggere ($\pi$, K, p) e di una risonanza instabile (K*) che decade in due corpi. Successivamente analizza gli spettri di massa invariante per identificare il picco della risonanza sopra il fondo combinatoriale.</p>

<hr />

<h1 id="struttura-del-progetto">Struttura del Progetto</h1>

<p>Il progetto è diviso in tre componenti principali:</p>

<h2 id="1-particlecpp">1 <code class="language-plaintext highlighter-rouge">particle.cpp</code></h2>

<p>Implementa la classe <code class="language-plaintext highlighter-rouge">Particle</code>, che rappresenta una particella fisica con:</p>

<ul>
  <li>nome</li>
  <li>quantità di moto (px, py, pz)</li>
  <li>massa</li>
  <li>carica</li>
  <li>eventuale larghezza di decadimento (per le risonanze)</li>
</ul>

<h3 id="funzionalità-principali">Funzionalità principali</h3>

<ul>
  <li>
    <p>Calcolo dell’energia relativistica:
\(E = \sqrt{p^2 + m^2}\)</p>
  </li>
  <li>
    <p>Calcolo della massa invariante tra due particelle:</p>
  </li>
</ul>

\[m_{inv} = \sqrt{(E1 + E2)^2 - |p1 + p2|^2}\]

<ul>
  <li>Decadimento a due corpi (<code class="language-plaintext highlighter-rouge">Decay2Body</code>)</li>
  <li>Include effetto di larghezza della risonanza (Breit-Wigner simulato via distribuzione gaussiana)</li>
  <li>Genera i prodotti in modo isotropico</li>
  <li>Boost relativistico nel sistema del laboratorio</li>
</ul>

<p>Questa classe è il cuore fisico del progetto.</p>

<hr />

<h2 id="2-maincpp">2 <code class="language-plaintext highlighter-rouge">main.cpp</code></h2>

<p>È il <strong>motore della simulazione</strong>.</p>

<h3 id="cosa-fa">Cosa fa</h3>

<p>Definisce i tipi di particelle:</p>
<ul>
  <li>$\pi$⁺, $\pi$⁻</li>
  <li>K⁺, K⁻</li>
  <li>p⁺, p⁻</li>
  <li>risonanza K* (massa 0.89166 GeV, width 0.050 GeV)</li>
</ul>

<p>Simula 100.000 eventi da 100 particelle</p>

<hr />

<h2 id="generazione-delle-particelle">Generazione delle particelle</h2>

<p>Le particelle vengono generate con probabilità:</p>

<table>
  <thead>
    <tr>
      <th>Particella</th>
      <th>Probabilità</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$\pi$⁺</td>
      <td>40%</td>
    </tr>
    <tr>
      <td>$\pi$⁻</td>
      <td>40%</td>
    </tr>
    <tr>
      <td>K⁺</td>
      <td>5%</td>
    </tr>
    <tr>
      <td>K⁻</td>
      <td>5%</td>
    </tr>
    <tr>
      <td>p⁺</td>
      <td>4.5%</td>
    </tr>
    <tr>
      <td>p⁻</td>
      <td>4.5%</td>
    </tr>
    <tr>
      <td>K*</td>
      <td>1%</td>
    </tr>
  </tbody>
</table>

<p>Il modulo della quantità di moto segue una distribuzione isotropa esponenziale:</p>

\[p \sim e^{-p}\]

<hr />

<h2 id="produzione-e-decadimento-della-k">Produzione e decadimento della K*</h2>

<p>Quando viene generata una risonanza:</p>

<ol>
  <li>Viene creata una particella <code class="language-plaintext highlighter-rouge">"resonance"</code></li>
  <li>Viene fatta decadere in:
    <ul>
      <li>$\pi$⁺ K⁻  (50%)</li>
      <li>$\pi$⁻ K⁺  (50%)</li>
    </ul>
  </li>
  <li>Si registra:
    <ul>
      <li>massa invariante dei prodotti di decadimento</li>
      <li>contributo al fondo combinatoriale</li>
    </ul>
  </li>
</ol>

<p>Questo è fondamentale per verificare che il picco della risonanza sia ricostruibile anche in presenza di fondo.</p>

<hr />
<h1 id="analisi-analysecpp">Analisi (<code class="language-plaintext highlighter-rouge">analyse.cpp</code>)</h1>

<p>La fase di analisi legge il file ROOT generato e verifica la coerenza fisica e statistica della simulazione.</p>

<hr />

<h2 id="controlli-di-consistenza">Controlli di consistenza</h2>

<ul>
  <li>Numero totale di particelle generate</li>
  <li>Distribuzione delle specie ($\pi$, K, p, K*)</li>
  <li>Confronto con le probabilità teoriche (compatibilità entro $3\sigma$)</li>
</ul>

<p>L’obiettivo è verificare che la generazione Monte Carlo riproduca correttamente le frazioni impostate nel generatore.</p>

<hr />

<h2 id="studio-delle-distribuzioni">Studio delle distribuzioni</h2>

<p>Vengono analizzate diverse osservabili cinematiche:</p>

<ul>
  <li>Distribuzione uniforme degli angoli ($\phi$, $\theta$)</li>
  <li>Fit esponenziale del modulo della quantità di moto:</li>
</ul>

\[f(p) \propto e^{-p}\]

<ul>
  <li>Spettri di massa invariante costruiti per:
    <ul>
      <li>tutte le coppie</li>
      <li>coppie a stessa carica</li>
      <li>coppie a carica opposta</li>
      <li>sole coppie $\pi$–K</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="sottrazione-del-fondo-combinatoriale">Sottrazione del fondo combinatoriale</h2>

<p>Per isolare il segnale della K* si utilizza la differenza tra coppie a carica opposta e coppie a stessa carica:</p>

\[\text{Signal}(m) =
\left( \frac{dN}{dm} 
\right)_{\text{opposite charge}}
-
\left( \frac{dN}{dm} 
\right)_{\text{same charge}}\]

<p>Questo metodo riduce il fondo non correlato, lasciando emergere il contributo delle vere risonanze.</p>

<p>Si ottengono due spettri:</p>

<ul>
  <li>Spettro completo (tutte le combinazioni)</li>
  <li>Spettro selezionando solo coppie $\pi$–K</li>
</ul>

<p>Dopo aver rimosso il fondo il grafico della massa invariante visibile qui sotto mostra chiaramente un picco in corrispondenza della massa della k*.</p>

<div class="project-media">
  <img src="/personal_website/assets/img/graph/k*_picture.png" alt="Invariant mass plot for K* resonance" />
 </div>
<hr />

<h2 id="fit-della-risonanza">Fit della risonanza</h2>

<p>Il picco viene fittato con una funzione gaussiana:</p>

\[f(m) = A \exp\left(
-\frac{(m - \mu)^2}{2\sigma^2}

\right)\]

<p>Dal fit si estraggono:</p>

<ul>
  <li>Massa della K* ($\mu$)</li>
  <li>Larghezza osservata ($\sigma$)</li>
  <li>$\chi^2/\text{NDF}$</li>
  <li>Probabilità del fit</li>
</ul>

<p>Il risultato atteso è una massa compatibile con:</p>

\[m_{K^*} \approx 0.892 \ \text{GeV}\]

<hr />

<h1 id="perché-questo-progetto-è-interessante">Perché questo progetto è interessante</h1>

<p>Questo codice riproduce in forma semplificata tecniche reali di analisi in fisica delle alte energie:</p>

<ul>
  <li>Ricostruzione di risonanze tramite massa invariante</li>
  <li>Stima e sottrazione del fondo combinatoriale</li>
  <li>Fit statistici con ROOT</li>
  <li>Validazione tramite $\chi^2$ e probabilità del fit</li>
</ul>

<p>Per farlo si passa attraverso tutte le fasi di una simulazione. Si parte infatti dalla parte fisica del progetto in cui vengono generate le particelle secondo una data distribuzione e si studia il decadimento della $k^*$, all’analisi dei dati nella quale si costruiscono gli istogrammi delle possibili combinazioni per poi rimuovere il fondo. Questo processo permette quindi di vedere in piccolo ed in modo semplificato il processo usato per la scoperta di nuove particelle.</p>

<h2 id="-collaboratori">👥 Collaboratori</h2>

<p>Questo progetto è stato possibile grazie al contributo di:</p>

<ul>
  <li><strong>Sigfrido11</strong>  🔗 <a href="https://github.com/Sigfrido11">GitHub</a></li>
  <li><strong>Fioralli</strong>  🔗 <a href="https://github.com/Fioralli">GitHub</a></li>
  <li><strong>SierraTangoEcho</strong>  🔗 <a href="https://github.com/SierraTangoEcho">GitHub</a></li>
</ul>]]></content><author><name></name></author><category term="Example" /><category term="A Tag" /><category term="Katex" /><summary type="html"><![CDATA[Simulazione di fisica delle particelle per la ricostruzione della risonanza K* Overview Questo progetto può essere esplorato al seguente link. Visita il sito del progetto Questo progetto implementa una simulazione Monte Carlo di eventi di fisica delle particelle utilizzando ROOT per l’analisi statistica e la visualizzazione dei risultati. L’obiettivo principale è: Ricostruire la risonanza K* (massa ~0.892 GeV) a partire dallo spettro delle masse invarianti delle coppie $\pi$–K. Il codice simula eventi con produzione di particelle leggere ($\pi$, K, p) e di una risonanza instabile (K*) che decade in due corpi. Successivamente analizza gli spettri di massa invariante per identificare il picco della risonanza sopra il fondo combinatoriale. Struttura del Progetto Il progetto è diviso in tre componenti principali: 1 particle.cpp Implementa la classe Particle, che rappresenta una particella fisica con: nome quantità di moto (px, py, pz) massa carica eventuale larghezza di decadimento (per le risonanze) Funzionalità principali Calcolo dell’energia relativistica: \(E = \sqrt{p^2 + m^2}\) Calcolo della massa invariante tra due particelle: \[m_{inv} = \sqrt{(E1 + E2)^2 - |p1 + p2|^2}\] Decadimento a due corpi (Decay2Body) Include effetto di larghezza della risonanza (Breit-Wigner simulato via distribuzione gaussiana) Genera i prodotti in modo isotropico Boost relativistico nel sistema del laboratorio Questa classe è il cuore fisico del progetto. 2 main.cpp È il motore della simulazione. Cosa fa Definisce i tipi di particelle: $\pi$⁺, $\pi$⁻ K⁺, K⁻ p⁺, p⁻ risonanza K* (massa 0.89166 GeV, width 0.050 GeV) Simula 100.000 eventi da 100 particelle Generazione delle particelle Le particelle vengono generate con probabilità: Particella Probabilità $\pi$⁺ 40% $\pi$⁻ 40% K⁺ 5% K⁻ 5% p⁺ 4.5% p⁻ 4.5% K* 1% Il modulo della quantità di moto segue una distribuzione isotropa esponenziale: \[p \sim e^{-p}\] Produzione e decadimento della K* Quando viene generata una risonanza: Viene creata una particella "resonance" Viene fatta decadere in: $\pi$⁺ K⁻ (50%) $\pi$⁻ K⁺ (50%) Si registra: massa invariante dei prodotti di decadimento contributo al fondo combinatoriale Questo è fondamentale per verificare che il picco della risonanza sia ricostruibile anche in presenza di fondo. Analisi (analyse.cpp) La fase di analisi legge il file ROOT generato e verifica la coerenza fisica e statistica della simulazione. Controlli di consistenza Numero totale di particelle generate Distribuzione delle specie ($\pi$, K, p, K*) Confronto con le probabilità teoriche (compatibilità entro $3\sigma$) L’obiettivo è verificare che la generazione Monte Carlo riproduca correttamente le frazioni impostate nel generatore. Studio delle distribuzioni Vengono analizzate diverse osservabili cinematiche: Distribuzione uniforme degli angoli ($\phi$, $\theta$) Fit esponenziale del modulo della quantità di moto: \[f(p) \propto e^{-p}\] Spettri di massa invariante costruiti per: tutte le coppie coppie a stessa carica coppie a carica opposta sole coppie $\pi$–K Sottrazione del fondo combinatoriale Per isolare il segnale della K* si utilizza la differenza tra coppie a carica opposta e coppie a stessa carica: \[\text{Signal}(m) = \left( \frac{dN}{dm} \right)_{\text{opposite charge}} - \left( \frac{dN}{dm} \right)_{\text{same charge}}\] Questo metodo riduce il fondo non correlato, lasciando emergere il contributo delle vere risonanze. Si ottengono due spettri: Spettro completo (tutte le combinazioni) Spettro selezionando solo coppie $\pi$–K Dopo aver rimosso il fondo il grafico della massa invariante visibile qui sotto mostra chiaramente un picco in corrispondenza della massa della k*. Fit della risonanza Il picco viene fittato con una funzione gaussiana: \[f(m) = A \exp\left( -\frac{(m - \mu)^2}{2\sigma^2} \right)\] Dal fit si estraggono: Massa della K* ($\mu$) Larghezza osservata ($\sigma$) $\chi^2/\text{NDF}$ Probabilità del fit Il risultato atteso è una massa compatibile con: \[m_{K^*} \approx 0.892 \ \text{GeV}\] Perché questo progetto è interessante Questo codice riproduce in forma semplificata tecniche reali di analisi in fisica delle alte energie: Ricostruzione di risonanze tramite massa invariante Stima e sottrazione del fondo combinatoriale Fit statistici con ROOT Validazione tramite $\chi^2$ e probabilità del fit Per farlo si passa attraverso tutte le fasi di una simulazione. Si parte infatti dalla parte fisica del progetto in cui vengono generate le particelle secondo una data distribuzione e si studia il decadimento della $k^*$, all’analisi dei dati nella quale si costruiscono gli istogrammi delle possibili combinazioni per poi rimuovere il fondo. Questo processo permette quindi di vedere in piccolo ed in modo semplificato il processo usato per la scoperta di nuove particelle. 👥 Collaboratori Questo progetto è stato possibile grazie al contributo di: Sigfrido11 🔗 GitHub Fioralli 🔗 GitHub SierraTangoEcho 🔗 GitHub]]></summary></entry></feed>