Dato un serbatoio cilindrico di lunghezza L, raggio di base R, avendolo riposto a terra in modo che sia appoggiato solidalmente al terreno lungo la sua lunghezza e avendo inserito un volume di liquido al suo interno V, trovare una formula computazionalmente semplice che esprima l'altezza h raggiunta dal liquido nel serbatoio.
Come prima cosa conviene osservare che è molto più semplice trovare una formula che esprima il volume del liquido rispetto all'altezza, piuttosto che la funzione inversa, per cui troviamo il volume data l'altezza e poi invertiamo la formula.
Scrivo così perché per trovare il volume è sufficiente integrare la regione di area occupata dal liquido sulla base circolare e poi moltiplicarla per la lunghezza del cilindro, invece per trovare l'altezza dato il volume bisognerebbe calcolare l'integrale curvilineo della regione della calotta. Meglio essere pigri.
Se piazzo il cerchio con centro O tale che O=(0,0) e esprimo il versore della gravità concorde a x ottengo che il liquido occuperà questa sezione:
Se la formula del cerchio è

il centro del cerchio è lo zero, quindi il punto di contatto con il terreno sarà x=R mentre la sommità della cisterna sarà x=-R.
Quindi se la cisterna è vuota (h=0) dovrò partire ad integrare da x=R e finire a terra, cioè a x=R. Ovviamente il punto di inizio e fine coincidono e l'area sarà nulla.
Se la cisterna è colma (h=2R) dovrò partire a integrare da x=-R (ricordo che lo zero coincide con il centro del cerchio della base della cisterna) e finire a x=R.
Quindi il punto generico, rispetto a questa convenzione, dell'altezza del liquido è R-h.
Devo quindi impostare questo integrale per calcolare l'area:

L'area è due volte quell'integrale, perché ricavando y dalla formula

e prendendo solo la radice positiva calcolo solo metà area.
Ho calcolato l'integrale con Mathematica (sì, sono pigro, ma se volete calcolarlo a mano potete sostituire

e ricondurlo all'integrale del seno al quadrato).
- Codice: Seleziona tutto
Assuming[h > 0 && h <2* R && R > 0, Integrate[2*Sqrt[R^2 - x^2], {x, R - h, R}]]
Il comando qui sopra serve per far integrare la funzione facendo assumere a Mathematica che h sia positivo e minore del diametro della cisterna.
Avendo inoltre definito delle relazioni fra numeri Mathematica assume automaticamente che h ed R non siano complessi.
Mathematica risponde:
- Codice: Seleziona tutto
ConditionalExpression[ R (h Sqrt[-((h (h - 2 R))/R^2)] + \[Pi] R - Sqrt[h (-h + 2 R)] - R ArcCos[-1 + h/R]), h < R]
In pratica ci risponde che ha trovato una formula per h<R, cioè che sappiamo come calcolare riempimenti fino a metà cisterna. Yuppie!
Non dobbiamo dimenticare di moltiplicare la formula per L, la lunghezza della cisterna, per ottenere il volume di liquido in essa contenuto.
La formula adesso deve essere invertita.
Questa formula ci permette di trovare il volume in funzione dell'altezza, noi dobbiamo trovare invece la funzione inversa.
Prima però facciamo una cosa importante.
Tutte le volte che vogliamo invertire (in questo caso numericamente, la formula è troppo complessa per cercare una forma chiusa) e approssimare DOBBIAMO avere a che fare con numeri puri.
Questa formula restituisce un volume, avendo in ingresso delle lunghezze (h ed R).
La normalizzazione più logica è quella che esprime l'altezza h in funzione del raggio R e il volume del liquido nel serbatoio in funzione del volume del serbatoio.
Abbiamo:

Sapendo che il volume della cisterna è

e chiamando

, con un po' di algebra, possiamo scrivere il rapporto fra il volume della cisterna e il volume V (che chiamo gamma) come:

Quindi posso definire su Mathematica questa funzione:
- Codice: Seleziona tutto
G[a_] := 2/Pi*Sqrt[a*(1 - a)]*(2*a - 1) + 1/Pi*ArcCos[1 - 2*a]
Che non posso invertire in forma chiusa, ma numericamente sì, col comando:
- Codice: Seleziona tutto
a[G_] := InverseFunction[G][a]
Adesso la disegno col comando Plot e la guardo:
- Codice: Seleziona tutto
Plot[a[x], {x, 0, 1}]

- alphadigamma.jpg (7.12 KiB) Osservato 11365 volte
Mi rendo conto che assomiglia ad una radice quadrata, che diventa lineare crescendo, che mi fa capire che a quella radice quadrata è stata sommata una retta.
Compilo quindi una tabella di valori con la funzione inversa (ricordo che la funzione inversa è stata ottenuta in via numerica, quindi non ho una formula) con:
- Codice: Seleziona tutto
data = Table[{x, G[x]}, {x, 0, 0.5, 0.001}]
che produce una matrice di 500 punti x,G(x).
Ovviamente faccio calcolare i punti fino a gamma=0.5, perché successivamente la funzione dovrà essere simmetrica e posso poi scegliere di ricavarla per simmetria, senza sprecare risorse di calcolo.
Cerco quindi il best fitting della matrice con una radice, una retta e una costante (conviene sempre aggiungere una piccola costante, o meglio, se si usa anche un polinomio, fare il fitting sul polinomio a cui non sono stati tolti dei termini. In genere si ottengono risultati migliori).
Uso il comando:
- Codice: Seleziona tutto
Fit[data, {1, x, Sqrt[x]}, x]
che mi restituisce:
- Codice: Seleziona tutto
-0.0072414 + 0.355769 Sqrt[x] + 0.509338 x
Ho trovato quindi una interpolante. La disegno sopra la funzione invertita numericamente:
In rosso ho la funzione calcolata numericamente e in blu la mia interpolante.
Direi che fino a gamma=0.5 posso essere soddisfatto.
Dopo non ho dato istruzioni al modello, quindi non posso pretendere che sia fedele alla funzione.
Correggiamo quindi questo problema.
Se osservo nuovamente la funzione invertita numericamente:

- alphadigamma.jpg (7.12 KiB) Osservato 11365 volte
Posso osservare che da gamma=0.5 fino a gamma=1 la funzione (ovviamente) gode di simmetria rispetto all'intervallo in cui gamma va da 0 a 0.5.
Quindi è vera la relazione di simmetria

La applico su:

ottenendo

cioè

Ho quindi trovato un modello composto da due sottomodelli.
Valutiamo l'errore del modello, utilizzando un modello campione dato dalla inversione numerica. Faccio disegnare l'errore relativo fra modelli:

- errore.jpg (6.7 KiB) Osservato 11365 volte
Ottenendo un errore massimo di circa sei parti su mille. Direi sia accettabile.
Ecco come ho fatto questo semplice modello.
Spero possa tornarti utile
La ragione per la quale reputo sbagliato l'uso di un metodo iterativo è che si ucciderebbe una mosca con un cannone. Meglio sbagliare in modo accettabile, trovando una soluzione semplice, piuttosto che cercare una soluzione precisissima ma complicata che sprema le risorse di calcolo all'osso.
Ciao,
Pietro.