diff --git a/index.html b/index.html new file mode 100644 index 0000000..cf07ce0 --- /dev/null +++ b/index.html @@ -0,0 +1,86 @@ + + + + + + + Esperienza di Thomson + + + + + + + + + + + + + + + + + + + +

Esperienza di Thomson

+

Introduzione

+

Questa esperienza utilizza un tubo di Crookes a raggi catodici per determinare il rapporto massa/carica di un + elettrone.

+

Il catodo emette un fascio di raggi catodici per effetto termoionico

+

L'esperimento è diviso in due fasi

+ +
+

Punto $P$ appartenente alla circonferenza generata dal solenoide

+ + + + +

Punto $P'$ appartenente alla parabola generata dal condensatore

+ + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + + \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 0000000..caacb6c --- /dev/null +++ b/script.js @@ -0,0 +1,261 @@ +"use strict"; +class Punto { + /** + * Due punti con cordinate dati in centimetri + * @param x ascissa + * @param y ordinata + */ + constructor(x, y) { + this.x = x; + this.y = y; + } + xMetri() { + return this.x / 100; + } + yMetri() { + return this.y / 100; + } +} +let decimals = 3; +function itNETex(n) { + let ns = n.toExponential().toString(); + let split = ns.split("e"); + let base = split[0].substring(0, 2 + decimals).replace(".", ","); + let expN = parseInt(split[1]); + if (expN != 0) { + return base + `\\cdot 10^{${expN}}`; + } + else + return base; +} +const mu0 = 4 * Math.PI * 10 ** -7; // Costante di permeabilità del vuoto +class Raggio { + /** + * Calcola il raggio di una circonferenza con centro C(0,r) e passante per P + * @param P Punto P + * @returns il raggio della Circonferenza + */ + constructor(P) { + this.p = P; + } + calcola() { + return (this.p.xMetri() ** 2 + this.p.yMetri() ** 2) / (2 * this.p.yMetri()); + } + renderMath() { + return ` +

Calcolo del raggio

+ Si calcola il raggio della circonferenza con centro $C(0cm,y_C)$ e passante per $P(${this.p.x} cm,${this.p.y} cm)$
+ Per convenienza, convertiamo centrimetri in metri, quindi:
+ $C(0\\space m;0\\space m)$ e $P(${itNETex(this.p.xMetri())} m;${itNETex(this.p.yMetri())} m)$ + + Partendo dall'equazione di una circonferenza di raggio $r$ e appurato che $y_C=r$ (e quindi $C(0,r)$) + $$ + x^2+(y-y_C)^2=r^2 + $$ + $$ + x^2+(y-r)^2=r^2 + $$ + $$ + x^2+y^2-2yr+\\cancel{r^2}=\\cancel{r^2} + $$ + $$ + r=\\frac{x^2+y^2}{2y}\ + $$ + Si impone quindi il passaggio per $P$ + $$ + r=\\frac{{${itNETex(this.p.xMetri())}}^2m+{${itNETex(this.p.yMetri())}}^2m}{2\\cdot${itNETex(this.p.yMetri())}m}=\\boxed{${itNETex(this.calcola())}m} + $$ + `; + } +} +class CampoMagnetico { + /** + * Calcola il campo magnetico di un solenoide + * Riguardo alle bobine di Helmholtz, è indifferente il numero di bobine considerate + * siccome l'algoritmo risulterebbe nBobine mu0 * (nSpire * nBobine) * (I/ nBobine): + * il numero di bobine moltiplicando il numero di spire e dividento l'intensità si può elidere + * e si può considerare il tutto come un solenoide uniforme + * @param N Numero di spire per una bobina + * @param I Instensità di corrente + * @param L Lunghezza complessiva del solenoide (distanza tra la prima e l'ultima bobina) + * @returns Valore del campo magnetico + */ + constructor(N, I, L) { + this.N = N; + this.I = I; + this.L = L; + } + calcola() { + return mu0 * this.N * this.I / this.L; + } + renderMath() { + return ` +

Calcolo del Campo magnetico

+ Si calcola il campo magnetico del solenoide
+ $$ + B=\\mu_0\\frac{NI}L=4\\pi\\cdot 10^{-7}\\frac{${this.N}\\cdot ${itNETex(this.I)}A}{${itNETex(this.L)}}=\\\\ + \\boxed{${itNETex(this.calcola())}T} + $$ + `; + } +} +class Fattore { + /** + * Fattore f per cui v^2=e/m*f nel condensatore + * @param V Differenza di potenziale + * @param P2 Punto appartenente alla parabola generata dal condensatore + * @param d distanza tra i poli del condensatore + * @returns fattore f + */ + constructor(V, P2, d) { + this.V = V; + this.P2 = P2; + this.d = d; + } + calcola() { + return (this.V * this.P2.xMetri() ** 2) / (2 * this.P2.yMetri() * this.d); + } + renderMath() { + return ` +

Calcolo di $\\frac{e}m$ (Parte $1$)

+ Si imposta il sistema di equazioni del moto parabolico + $$ + \\begin{equation*} + \\begin{cases} + x=vt\\\\ + y=\\frac12at^2 + \\end{cases} + \\end{equation*} + $$ + $$ + \\begin{equation*} + \\begin{cases} + t=\\frac{x}v\\\\ + y_P=\\frac12\\frac{\\Delta V\\cdot e}{dm}\\frac{x_P^2}{v^2} + \\end{cases} + \\end{equation*} + $$ + + $$ + v=\\sqrt{\\frac{e\\Delta Vx_P^2}{2dmy_P}}=\\sqrt{\\frac{e\\cdot ${itNETex(this.V)} V \\cdot{(${itNETex(this.P2.xMetri())})}^2}{2m\\cdot${itNETex(this.d)} m \\cdot ${itNETex(this.P2.yMetri())} m}}=\\sqrt{\\frac{e}m${itNETex(this.calcola())}} + $$ + + Si assume $t =${itNETex(this.calcola())} $ + `; + } +} +class EmRapporto { + /** + * Calcola il rapporto e/m + * @param fattore Il fattore f + * @param B Campo magnetico del solenoide + * @param r raggio della circonferenza + * @returns e/m + */ + constructor(fattore, B, r) { + this.fattore = fattore; + this.B = B; + this.r = r; + } + calcola() { + return (this.fattore / (this.B * this.r)) ** 2; + } + renderMath() { + return ` +

Calcolo di $\\frac{e}m$ (Parte $2$)

+ + + $$ + F_{\\mathscr{L}}=e\\cdot v\\cdot b + $$ + Forza di Lorentz + + $$ + F_C=m\\frac{v^2}r + $$ + + Forza di Lorentz + + + $$ + F_{\\mathscr{L}}= F_C + $$ + + $$ + e\\cdot \\cancel{v}\\cdot B = m\\frac{v^{\\cancel 2}}r + $$ + + $$ + \\frac{e}m = \\frac{v}{Br} + $$ + + $$ + \\frac{e}m = \\frac{\\sqrt{\\frac{e}m}f}{Br} + $$ + + $$ + \\sqrt{\\frac{e}m}=\\frac{f}{Br} + $$ + `; + } +} +/** + * Esperimento di Thompson + * @param P Punto appartenente alla circonferenza generata dal solenoide + * @param P2 Punto appartenente alla parabola generata dal condensatore + * @param I Intensità di corrente fornita al solenoide + * @param V Differenza di potenziale della corrente fornita al condensatore + * @param N Numero di spire di una bobina del solenoide + * @param L Lunghezza del solenoide + * @param d Distanza tra i poli del condensatore + * @returns rapporto e/m + */ +function thomson(P, P2, I, V, N, L, d) { + let html = ``; + let B = new CampoMagnetico(N, I, L); + html += B.renderMath(); + let rc = new Raggio(P); + html += rc.renderMath(); + let r = rc.calcola(); + let f = new Fattore(V, P2, d); + html += f.renderMath(); + let em = new EmRapporto(f.calcola() ** 0.5, B.calcola(), r); + html += em.renderMath(); + html += ` + $$ + \\frac{ e } m =\\frac{${itNETex(f.calcola())} } { ${itNETex(B.calcola())} ${itNETex(r)} } = ${itNETex(em.calcola())} + $$ + Abbiamo dimostrato l'esperienza di Thomson + `; + document.getElementById("results").innerHTML = html; + MathJax.typesetPromise() +} +let P = new Punto(5, 2); +let P2 = new Punto(7, 2); +let I = 0.89; //A +let V = 2500; //V +let N = 320; +let L = 0.1; //m +let d = 0.06; //m +let px = document.getElementById("px"); +let py = document.getElementById("py"); +let p2x = document.getElementById("p2x"); +let p2y = document.getElementById("p2y"); +let Ie = document.getElementById("I"); +let Ve = document.getElementById("V"); +let Ne = document.getElementById("N"); +let Le = document.getElementById("L"); +let de = document.getElementById("d"); +px.value = P.x.toString(); +py.value = P.y.toString(); +p2x.value = P2.x.toString(); +p2y.value = P2.y.toString(); +Ie.value = I.toString(); +Ve.value = V.toString(); +Ne.value = N.toString(); +Le.value = L.toString(); +de.value = d.toString(); +let calc = document.getElementById("calc"); +calc.addEventListener("click", function clicked() { + thomson(new Punto(parseFloat(px.value), parseFloat(py.value)), new Punto(parseFloat(p2x.value), parseFloat(p2y.value)), parseFloat(Ie.value), parseFloat(Ve.value), parseFloat(Ne.value), parseFloat(Le.value), parseFloat(de.value)); +}); diff --git a/script.ts b/script.ts new file mode 100644 index 0000000..4c4f9fb --- /dev/null +++ b/script.ts @@ -0,0 +1,290 @@ +class Punto {// misure in cm + x: number; + y: number; + /** + * Due punti con cordinate dati in centimetri + * @param x ascissa + * @param y ordinata + */ + constructor(x: number, y: number) { + this.x = x; + this.y = y; + } + xMetri(): number { + return this.x / 100; + } + yMetri(): number { + return this.y / 100; + } +} + +let decimals = 3; + +function itNETex(n: number): string { + let ns: string = n.toExponential().toString(); + let split: Array = ns.split("e"); + let base: string = split[0].substring(0, 2 + decimals).replace(".", ","); + let expN: number = parseInt(split[1]); + if (expN != 0) { + return base + `\\cdot 10^{${expN}}`; + } + else return base; +} + +const mu0 = 4 * Math.PI * 10 ** -7; // Costante di permeabilità del vuoto + + +class Raggio { + p: Punto; + /** + * Calcola il raggio di una circonferenza con centro C(0,r) e passante per P + * @param P Punto P + * @returns il raggio della Circonferenza + */ + constructor(P: Punto) { + this.p = P; + } + calcola(): number { + return (this.p.xMetri() ** 2 + this.p.yMetri() ** 2) / (2 * this.p.yMetri()) + } + renderMath(): string { + return ` +

Calcolo del raggio

+ Si calcola il raggio della circonferenza con centro $C(0cm,y_C)$ e passante per $P(${this.p.x} cm,${this.p.y} cm)$
+ Per convenienza, convertiamo centrimetri in metri, quindi:
+ $C(0\\space m;0\\space m)$ e $P(${itNETex(this.p.xMetri())} m;${itNETex(this.p.yMetri())} m)$ + + Partendo dall'equazione di una circonferenza di raggio $r$ e appurato che $y_C=r$ (e quindi $C(0,r)$) + $$ + x^2+(y-y_C)^2=r^2 + $$ + $$ + x^2+(y-r)^2=r^2 + $$ + $$ + x^2+y^2-2yr+\\cancel{r^2}=\\cancel{r^2} + $$ + $$ + r=\\frac{x^2+y^2}{2y}\ + $$ + Si impone quindi il passaggio per $P$ + $$ + r=\\frac{{${itNETex(this.p.xMetri())}}^2m+{${itNETex(this.p.yMetri())}}^2m}{2\\cdot${itNETex(this.p.yMetri())}m}=\\boxed{${itNETex(this.calcola())}m} + $$ + `; + } +} + + +class CampoMagnetico { + N: number; + I: number; + L: number; + /** + * Calcola il campo magnetico di un solenoide + * Riguardo alle bobine di Helmholtz, è indifferente il numero di bobine considerate + * siccome l'algoritmo risulterebbe nBobine mu0 * (nSpire * nBobine) * (I/ nBobine): + * il numero di bobine moltiplicando il numero di spire e dividento l'intensità si può elidere + * e si può considerare il tutto come un solenoide uniforme + * @param N Numero di spire per una bobina + * @param I Instensità di corrente + * @param L Lunghezza complessiva del solenoide (distanza tra la prima e l'ultima bobina) + * @returns Valore del campo magnetico + */ + constructor(N: number, I: number, L: number) { + this.N = N; + this.I = I; + this.L = L; + } + calcola(): number { + return mu0 * this.N * this.I / this.L; + } + renderMath(): string { + return ` +

Calcolo del Campo magnetico

+ Si calcola il campo magnetico del solenoide
+ $$ + B=\\mu_0\\frac{NI}L=4\\pi\\cdot 10^{-7}\\frac{${this.N}\\cdot ${itNETex(this.I)}A}{${itNETex(this.L)}}=\\\\ + \\boxed{${itNETex(this.calcola())}T} + $$ + `; + } +} + + + +class Fattore { + V: number; + P2: Punto; + d: number; + /** + * Fattore f per cui v^2=e/m*f nel condensatore + * @param V Differenza di potenziale + * @param P2 Punto appartenente alla parabola generata dal condensatore + * @param d distanza tra i poli del condensatore + * @returns fattore f + */ + constructor(V: number, P2: Punto, d: number) { + this.V = V; + this.P2 = P2; + this.d = d; + } + calcola(): number {// d: distanza piastre cond + return (this.V * this.P2.xMetri() ** 2) / (2 * this.P2.yMetri() * this.d); + } + renderMath(): string { + return ` +

Calcolo di $\\frac{e}m$ (Parte $1$)

+ Si imposta il sistema di equazioni del moto parabolico + $$ + \\begin{equation*} + \\begin{cases} + x=vt\\\\ + y=\\frac12at^2 + \\end{cases} + \\end{equation*} + $$ + $$ + \\begin{equation*} + \\begin{cases} + t=\\frac{x}v\\\\ + y_P=\\frac12\\frac{\\Delta V\\cdot e}{dm}\\frac{x_P^2}{v^2} + \\end{cases} + \\end{equation*} + $$ + + $$ + v=\\sqrt{\\frac{e\\Delta Vx_P^2}{2dmy_P}}=\\sqrt{\\frac{e\\cdot ${itNETex(this.V)} V \\cdot{(${itNETex(this.P2.xMetri())})}^2}{2m\\cdot${itNETex(this.d)} m \\cdot ${itNETex(this.P2.yMetri())} m}}=\\sqrt{\\frac{e}m${itNETex(this.calcola())}} + $$ + + Si assume $t =${itNETex(this.calcola())} $ + `; + } + +} + +class EmRapporto { + fattore: number; + B: number; + r: number; + /** + * Calcola il rapporto e/m + * @param fattore Il fattore f + * @param B Campo magnetico del solenoide + * @param r raggio della circonferenza + * @returns e/m + */ + constructor(fattore: number, B: number, r: number) { + this.fattore = fattore; + this.B = B; + this.r = r; + } + calcola(): number { + return (this.fattore / (this.B * this.r)) ** 2; + } + renderMath(): string { + return ` +

Calcolo di $\\frac{e}m$ (Parte $2$)

+ + + $$ + F_{\\mathscr{L}}=e\\cdot v\\cdot b + $$ + Forza di Lorentz + + $$ + F_C=m\\frac{v^2}r + $$ + + Forza di Lorentz + + + $$ + F_{\\mathscr{L}}= F_C + $$ + + $$ + e\\cdot \\cancel{v}\\cdot B = m\\frac{v^{\\cancel 2}}r + $$ + + $$ + \\frac{e}m = \\frac{v}{Br} + $$ + + $$ + \\frac{e}m = \\frac{\\sqrt{\\frac{e}m}f}{Br} + $$ + + $$ + \\sqrt{\\frac{e}m}=\\frac{f}{Br} + $$ + `; + } +} + +/** + * Esperimento di Thompson + * @param P Punto appartenente alla circonferenza generata dal solenoide + * @param P2 Punto appartenente alla parabola generata dal condensatore + * @param I Intensità di corrente fornita al solenoide + * @param V Differenza di potenziale della corrente fornita al condensatore + * @param N Numero di spire di una bobina del solenoide + * @param L Lunghezza del solenoide + * @param d Distanza tra i poli del condensatore + * @returns rapporto e/m + */ +function thomson(P: Punto, P2: Punto, I: number, V: number, N: number, L: number, d: number) { + let html = ``; + let B: CampoMagnetico = new CampoMagnetico(N, I, L); + html += B.renderMath(); + let rc: Raggio = new Raggio(P); + html += rc.renderMath(); + let r = rc.calcola(); + let f: Fattore = new Fattore(V, P2, d); + html += f.renderMath(); + let em: EmRapporto = new EmRapporto(f.calcola() ** 0.5, B.calcola(), r); + html += em.renderMath(); + html += ` + $$ + \\frac{ e } m =\\frac{${itNETex(f.calcola())} } { ${itNETex(B.calcola())} ${itNETex(r)} } = ${itNETex(em.calcola())} + $$ + Abbiamo dimostrato l'esperienza di Thomson + `; + document.getElementById("results")!.innerHTML = html; +} + + +let P: Punto = new Punto(5, 2); +let P2: Punto = new Punto(7, 2); +let I = 0.89;//A +let V = 2500;//V +let N: number = 320; +let L: number = 0.1;//m +let d: number = 0.06; //m + + +let px: HTMLInputElement = document.getElementById("px") as HTMLInputElement; +let py: HTMLInputElement = document.getElementById("py") as HTMLInputElement; +let p2x: HTMLInputElement = document.getElementById("p2x") as HTMLInputElement; +let p2y: HTMLInputElement = document.getElementById("p2y") as HTMLInputElement; +let Ie: HTMLInputElement = document.getElementById("I") as HTMLInputElement; +let Ve: HTMLInputElement = document.getElementById("V") as HTMLInputElement; +let Ne: HTMLInputElement = document.getElementById("N") as HTMLInputElement; +let Le: HTMLInputElement = document.getElementById("L") as HTMLInputElement; +let de: HTMLInputElement = document.getElementById("d") as HTMLInputElement; + +//DEfaults +px.value = P.x.toString(); +py.value = P.y.toString(); +p2x.value = P2.x.toString(); +p2y.value = P2.y.toString(); +Ie.value = I.toString(); +Ve.value = V.toString(); +Ne.value = N.toString(); +Le.value = L.toString(); +de.value = d.toString(); + +let calc: HTMLButtonElement = document.getElementById("calc") as HTMLButtonElement; +calc.addEventListener("click", function clicked(): void { + thomson(new Punto(parseFloat(px.value), parseFloat(py.value)), new Punto(parseFloat(p2x.value), parseFloat(p2y.value)), parseFloat(Ie.value), parseFloat(Ve.value), parseFloat(Ne.value), parseFloat(Le.value), parseFloat(de.value)); +}); \ No newline at end of file