Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Altezza liquido in un serbatoio

Analisi, geometria, algebra, topologia...

Moderatori: Foto UtentePietroBaima, Foto UtenteIanero

1
voti

[11] Re: Altezza liquido in un serbatoio

Messaggioda Foto Utenteonire » 3 mar 2019, 20:02

Grazie xyz mi hai aperto un mondo su Maxima e GeoGebra, sapevo della loro esistenza, ma non li avevo mai usati.
Il caso è reale, ho un serbatoio di cui misuro i livello mediante una sonda e quindi dall'altezza misuro il volume contenuto. Senza entrare troppo nei dettagli, mi occorre fare anche la l'operazione inversa per poter generare degli allarmi. Quindi mi occorrerebbe una formula in cui inserito il volume, mi tira fuori l'altezza. L'approssimazione con il metodo delle tangenti va benissimo.

Quindi da quello che ho capito, la soluzione non è banale e non esiste una soluzione "geometrica" ovvero sfruttare qualche proprietà in modo da semplificare il calcolo.

Per xyz, ho provato ad aumentare il grado dell'approssimazione di Taylor, ma quando vado ad eseguire questa istruzione mi da errore.
Codice: Seleziona tutto
s:rootscontract(xthru(rhs(%[3])));

In realtà non ho capito esattamente cosa faccia questa istruzione.
Inoltre il metodo delle tangenti non mi sembra molto semplice da implementare :mrgreen: perciò avevo provato ad aumentare il grado di Taylor.

Comunque grazie, in ultima analisi dirò che non si può fare.
Avatar utente
Foto Utenteonire
15 4
 
Messaggi: 30
Iscritto il: 9 gen 2012, 20:33

0
voti

[12] Re: Altezza liquido in un serbatoio

Messaggioda Foto Utenteonire » 3 mar 2019, 20:03

LucaCassioli ha scritto:
xyz ha scritto:Utilizzando Geogebra[...]

Non sarà facile implementare tutto questo in un PLC! :shock:


Vedo che Luca la pensa come me :D
Avatar utente
Foto Utenteonire
15 4
 
Messaggi: 30
Iscritto il: 9 gen 2012, 20:33

0
voti

[13] Re: Altezza liquido in un serbatoio

Messaggioda Foto UtenteMarcoD » 3 mar 2019, 20:10

Incomincia a tracciare la funzione volume altezza o l'inversa, poi ragioni su come interpolarla.
Poi quale è la precisione risoluzione del sensore di livello.
E se il serbatoio é a sezione ellittica ?
Avatar utente
Foto UtenteMarcoD
12,2k 5 9 13
Master EY
Master EY
 
Messaggi: 6696
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[14] Re: Altezza liquido in un serbatoio

Messaggioda Foto UtenteGoofy » 3 mar 2019, 20:25

onire ha scritto:ho un serbatoio di cui misuro i livello mediante una sonda e quindi dall'altezza misuro il volume contenuto. Senza entrare troppo nei dettagli, mi occorre fare anche la l'operazione inversa per poter generare degli allarmi.


Gli allarmi saranno di minima e massima, quindi ti servono solo due valori (o comunque un numero limitato) e a comandare fisicamente l'allarme comunque non sarà il volume ma del liquido ma il valore misurato dalla sonda e quindi una altezza.

Quindi ti basterà sapere, ad esempio, che quando nel serbatoio hai 500 l l'altezza è 0,5 m e quando hai 4000 l l'altezza è 2,3 m (numeri a caso) e fissare gli allarmi a 0,5 m e 2,3 m
Avatar utente
Foto UtenteGoofy
14,7k 4 5 9
Master EY
Master EY
 
Messaggi: 5916
Iscritto il: 10 dic 2014, 20:16

0
voti

[15] Re: Altezza liquido in un serbatoio

Messaggioda Foto Utenteonire » 3 mar 2019, 20:49

Grazie Goofy per il tuo suggerimento, ma il sistema è un po' complesso, le soglie degli allarmi possono essere variate, ed il calcolo mi serve come indicazione all'operatore, per evitare che faccia cavolate.
Avatar utente
Foto Utenteonire
15 4
 
Messaggi: 30
Iscritto il: 9 gen 2012, 20:33

1
voti

[16] Re: Altezza liquido in un serbatoio

Messaggioda Foto Utentexyz » 3 mar 2019, 21:32

onire ha scritto:.. la soluzione non è banale e non esiste una soluzione "geometrica" ovvero sfruttare qualche proprietà in modo da semplificare il calcolo.

Ho cercato in giro ma questo è uno di quei problemi risolvibili solo in modo approssimato per via numerica.

...
ho provato ad aumentare il grado dell'approssimazione di Taylor, ma quando vado ad eseguire questa istruzione mi da errore.
Codice: Seleziona tutto
s:rootscontract(xthru(rhs(%[3])));


Per il teorema di Abel Ruffini:

https://it.wikipedia.org/wiki/Teorema_di_Abel-Ruffini

non esiste una formula risolutiva per equazioni polinomiali di grado uguale o superiore a 5. Quando aumenti i coefficienti non nulli della serie di Taylor passi da una equazione di 3° grado a una di 5° o più quindi fallisce nel trovare una soluzione, servono altri metodi risolutivi.

In realtà non ho capito esattamente cosa faccia questa istruzione.

Semplicemente prende la terza soluzione (è un lista con 3 elementi) e la semplifica visto che ci sono degli esponenti uguali vengono raggruppati tra di loro.

Inoltre il metodo delle tangenti non mi sembra molto semplice da implementare

In realtà è fattibile sia con funzioni dove è possibile pre-calcolare la derivata, sia quando non è possibile pre-calcolare la derivata ma questo esula da questa domanda, si tratta di un problema di programmazione. La pagina di wikipedia in Inglese spiega molte più cose ed è presente una possibile implementazione informatica (oltre a quella manuale):

https://en.wikipedia.org/wiki/Newton%27s_method
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[17] Re: Altezza liquido in un serbatoio

Messaggioda Foto Utenteonire » 3 mar 2019, 23:08

Ho provato a convertire l'implementazione in python, ma non converge mai, come possibile vedere qui

Codice: Seleziona tutto
#These choices depend on the problem being solved
x0 = 2 #The initial value
def f(x):
    return x*x-2

def fprime(x):
    return 2*x

tolerance = 10^(-7) #7 digit accuracy is desired
epsilon = 10^(-14) #Don't want to divide by a number smaller than this

maxIterations = 20 #Don't allow the iterations to continue indefinitely
haveWeFoundSolution = 0 #Have not converged to a solution yet

for i in range(1, maxIterations):

    y = f(x0)
    yprime = fprime(x0)

    if(abs(yprime) < epsilon): #Don't want to divide by too small of a number
                            # denominator is too small
        break; #Leave the loop

    x1 = x0 - y/yprime #Do Newton's computation

    if(abs(x1 - x0) <= tolerance * abs(x1)): #If the result is within the desired tolerance
        haveWeFoundSolution = 1
        break; #Done, so leave the loop
   
    x0 = x1 #Update x0 to start the process again

if (haveWeFoundSolution):
    print(x1)
#... % x1 is a solution within tolerance and maximum number of iterations
else:
#... % did not converge
    print("Non converge")


non ho capito se ho sbagliato la conversione o se c'è qualche errore nell'implementazione.
Avatar utente
Foto Utenteonire
15 4
 
Messaggi: 30
Iscritto il: 9 gen 2012, 20:33

1
voti

[18] Re: Altezza liquido in un serbatoio

Messaggioda Foto Utentexyz » 4 mar 2019, 0:55

In Python l'operatore "^" è operatore xor (exclusive or) non l'elevamento a potenza. In Python si usa l'operatore "**" per elevare a potenza ma per i numeri si usa la notazione IEEE 754, quindi "10^(-7)" si scrive semplicemente "1E-7".

Ti ho corretto il codice è indentato in conformità PEP 8:

Codice: Seleziona tutto
#!/usr/bin/env python3

# These choices depend on the problem being solved

x0 = 2  # The initial value


def f(x):
    return x * x - 2


def fprime(x):
    return 2 * x


TOLERANCE = 1E-7        # 7 digit accuracy is desired
EPSILON = 1E-14         # Don't want to divide by a number smaller than this

MAX_ITERATIONS = 20     # Don't allow the iterations to continue indefinitely

found_solution = False  # Have not converged to a solution yet

for i in range(MAX_ITERATIONS):

    y = f(x0)
    yprime = fprime(x0)

    # Don't want to divide by too small of a number
    # denominator is too small
    if abs(yprime) < EPSILON:
        break   # Leave the loop

    x1 = x0 - y / yprime        # Do Newton's computation

    # If the result is within the desired tolerance
    if abs(x1 - x0) <= TOLERANCE * abs(x1):
        found_solution = True
        break   # Done, so leave the loop

    x0 = x1  # Update x0 to start the process again

if found_solution:
    # x1 is a solution within tolerance and maximum number of iterations
    print(x1)
else:
    # did not converge
    print("Non converge")


In esecuzione:

Codice: Seleziona tutto
$> python3 newton.py
1.4142135623730951
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[19] Re: Altezza liquido in un serbatoio

Messaggioda Foto UtenteEcoTan » 4 mar 2019, 9:05

onire ha scritto:il calcolo mi serve come indicazione all'operatore

Puoi preparare una tabella su carta, magari con Excel.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5423
Iscritto il: 29 gen 2014, 8:54

0
voti

[20] Re: Altezza liquido in un serbatoio

Messaggioda Foto Utenteonire » 4 mar 2019, 10:07

xyz ha scritto:In Python l'operatore "^" è operatore xor (exclusive or) non l'elevamento a potenza....

che figura barbina con il python :?

EcoTan ha scritto:Puoi preparare una tabella su carta, magari con Excel.

Proverò come suggerito da xyz, in ultima analisi ricorrerò ad Excel.
Avatar utente
Foto Utenteonire
15 4
 
Messaggi: 30
Iscritto il: 9 gen 2012, 20:33

PrecedenteProssimo

Torna a Matematica generale

Chi c’è in linea

Visitano il forum: Google [Bot] e 28 ospiti