Topic: [Python] grafico  (Letto 235 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline crynow

  • python unicellularis
  • *
  • Post: 23
  • Punti reputazione: 0
    • Mostra profilo
[Python] grafico
« il: Gennaio 29, 2021, 20:12 »
import matplotlib.pyplot as plt
import numpy as np
import math

def grafico(r) :
    t = 0
    volume = []
    tempo = []
    while t <= 120 :
        volume_00 = 10**9+10**8*(1-math.exp(-t/100))-r*t
        volume.append(volume_00)
        tempo.append(t)
        t += 1
       
    plt.plot(tempo, volume)
    plt.xlabel("Tempo")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
       







def main() :
    r = 10**7
   
   
    Grafico = grafico(r)
   
   
   
main()


Buonasera, dovrei creare un grafico con questi elementi ma non so come fermare il while quando "volume_00" diventa minore di zero, io ho messo "while t <= 120 :" ma forse ho sbagliato.
Perchè io dovrei aumentare t che inizialmente è zero finchè volume_00 non diventa minore di zero e diagrammare i risultati del volume_00 e del tempo.

Qualcuno mi può aiutare
Grazie

Offline Legs

  • python unicellularis
  • *
  • Post: 39
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #1 il: Gennaio 29, 2021, 22:44 »
Ho modificato il codice. In realtà è possibile lavorare direttamente sull'intero array in un colpo solo.

import matplotlib.pyplot as plt
import numpy as np

def f(t,r):
return 1.0e9+1.0e8*(1.0-np.exp(-t/100.0))-r*t

tempo = np.arange(121, dtype=float)
r = 1.0e7

volume = f(tempo,r)

plt.plot(tempo, volume)
plt.xlabel("Tempo")
plt.ylabel("Volume")
plt.grid('on')
plt.show()



Adesso è a posto
« Ultima modifica: Gennaio 30, 2021, 13:22 da Legs »

Offline crynow

  • python unicellularis
  • *
  • Post: 23
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #2 il: Gennaio 30, 2021, 11:49 »
Il problema che non riesco a risolvere è il fatto che se pongo il while t <= 120: il while si ferma quando t arriva a 120, invece dovrei far fermare il while quando volume_00 arriva a un numero minore di zero e non so come impostare il while

Offline Legs

  • python unicellularis
  • *
  • Post: 39
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #3 il: Gennaio 30, 2021, 13:18 »
Il problema che non riesco a risolvere è il fatto che se pongo il while t <= 120: il while si ferma quando t arriva a 120, invece dovrei far fermare il while quando volume_00 arriva a un numero minore di zero e non so come impostare il while

Non avevo capito. Potresti mettere un if su volume_00 e usare l'istruzione break per uscire dal ciclo.

devi aggiungere questo dentro il ciclo:
if volume_00 < 0.0:
break
« Ultima modifica: Gennaio 30, 2021, 13:51 da Legs »

Offline crynow

  • python unicellularis
  • *
  • Post: 23
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #4 il: Gennaio 30, 2021, 13:38 »
import matplotlib.pyplot as plt
import numpy as np
import math

def grafico(r) :
    t = 0
    volume = []
    tempo = []
    while t >= 0 :
        volume_00 = 10**9+10**8*(1-math.exp(-t/100))-r*t
        if volume_00 < 0 : break
        volume.append(volume_00)
        tempo.append(t)
        t += 1
       
           
       
    plt.plot(tempo, volume)
    plt.xlabel("Tempo")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
       







def main() :
    r = 10**7
   
   
   
    Grafico = grafico(r)   
   
   
main()


Avrei rimediato facendo cosi ma quel "while t>=0 :" mi sembra sbalgiato anche se il risultato esce perchè alla fine avrei scritto una cosa senza senso se dico "fin tanto che t maggiore o uguale a zero vai avanti"

Offline Legs

  • python unicellularis
  • *
  • Post: 39
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #5 il: Gennaio 30, 2021, 13:53 »
O scusami. Vedo che avevi già capito da solo come uscire dal ciclo.
Per quanto riguarda la condizione su t puoi tranquillamente continuare a tenere t<=120 che ti fa da valvola di blocco nel caso volume_00 dovesse essere sempre positivo.

Offline crynow

  • python unicellularis
  • *
  • Post: 23
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #6 il: Gennaio 30, 2021, 17:30 »
Grazie degli spunti.
Se posso porre un altro quesito, io adesso ho il codice in questo modo:
import matplotlib.pyplot as plt
import numpy as np
import math


def grafico(r) :
    t = 0
    volume = []
    tempo = []
    while t <= 120:       
        volume_0 = 10**9+10**8*(1-math.exp(-t/100))-r*t
        if volume_0 < 0 : break
        volume.append(volume_0)
        tempo.append(t)
        t += 1
       
           
       
    plt.plot(tempo, volume)
    plt.xlabel("Tempo")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
       







def main() :
    r = float(input("Inserire il valore di r: "))
   
   
   
    Grafico = grafico(r)   
   
   
main()


come faccio a mettere un valore di default di r cioè, io ho scritto che mi deve essere dato in ingresso ma se l'utente non scrive nulla e preme invio come faccio a far si che r valga 10**7?

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 351
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #7 il: Gennaio 30, 2021, 23:31 »
come faccio a mettere un valore di default di r cioè, io ho scritto che mi deve essere dato in ingresso ma se l'utente non scrive nulla e preme invio come faccio a far si che r valga 10**7?

Prova a modificarla così :
def grafico(r=10**7) :
    t = 0
    volume = []
    tempo = []
    while t <= 120:       
        volume_0 = 10**9+10**8*(1-math.exp(-t/100))-r*t
        if volume_0 < 0 : break
        volume.append(volume_0)
        tempo.append(t)
        t += 1
       

Offline crynow

  • python unicellularis
  • *
  • Post: 23
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #8 il: Gennaio 31, 2021, 10:20 »
import matplotlib.pyplot as plt
import numpy as np
import math


def grafico(r=10**7) :
    t = 0
    volume = []
    tempo = []
    while t <= 120:       
        volume_0 = 10**9+10**8*(1-math.exp(-t/100))-r*t
        if volume_0 < 0 : break
        volume.append(volume_0)
        tempo.append(t)
        t += 1
       
    plt.plot(tempo, volume)
    plt.xlabel("Tempo")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
 
   
       



def main() :
    r = float(input("i: "))
    x = 0.50
   
    Grafico = grafico(r)
   

   
main()


Ho provato ma mi da errore poi

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 351
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #9 il: Gennaio 31, 2021, 12:36 »
La prossima volta posta anche il tracebak, per individuare esattamente l'errore.

Ovviamente, c'è bisogno di gestire il mancato input, è una condizione elementare, probabilmente il Tuo errore sarà qualcosa così :
>>> r = float(input('i : '))
i :
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    r = float(input('i : '))
ValueError: could not convert string to float: ''

ed è dato dal tentativo di convertire una stringa vuota in un numero.

Per altro, bisogna diversificare anche la chiamata nel caso l'utente non abbia inserito valori, per utilizzare il default ... ti faccio un esempio della Tua funzione modificata in modo che restituisca i dati, invece di plottarli :

>>> import math

>>> def funz_esempio(r=10**7):
t = 0
volume = []
tempo = []
while t <= 120:
volume_0 = 10**9 + 10**8 * (1 - math.exp(-t/100)) - r * t
if volume_0 < 0 : break
volume.append(volume_0)
tempo.append(t)
t += 10
return tempo, volume

>>> r = input('i : ')
i :
>>> r
''
>>> if r:
tempo, volume = funz_esempio(float(r))
else:
tempo, volume = funz_esempio()


>>> for i in range(len(tempo)):
print('tempo :', tempo[i], ' - volume :' , volume[i])


tempo : 0  - volume : 1000000000.0
tempo : 10  - volume : 909516258.1964041
tempo : 20  - volume : 818126924.6922019
tempo : 30  - volume : 725918177.9318283
tempo : 40  - volume : 632967995.3964361
tempo : 50  - volume : 539346934.0287367
tempo : 60  - volume : 445118836.39059734
tempo : 70  - volume : 350341469.620859
tempo : 80  - volume : 255067103.58827782
tempo : 90  - volume : 159343034.02594006
tempo : 100  - volume : 63212055.88285577
>>>

Come vedi, non ho inserito niente allo input di r e testato la condizione prima di invocare funz_esempio, invocandola SENZA passare un parametro (che avrebbe dato errore), in modo tale che utilizzasse i valori di default.

... spero Ti sia più chiaro come operare, adesso.
Ciao

Offline crynow

  • python unicellularis
  • *
  • Post: 23
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #10 il: Gennaio 31, 2021, 14:00 »
def grafico(r=10**7) :
    t = 0
    volume = []
    tempo = []
    while t <= 120:       
        volume_0 = 10**9+10**8*(1-math.exp(-t/100))-r*t
        if volume_0 < 0 : break
        volume.append(volume_0)
        tempo.append(t)
        t += 1
       
    plt.plot(tempo, volume)
    plt.xlabel("Tempo")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
   


   
       



def main() :
    r = input("Inserire il valore di r: ")
    x = 0.50
    if r:
        grafico(float(r))
    else:
        grafico()
    Grafico = grafico(r)
   


   
main()


intendi una cosa tipo cosi?
perchè anche cosi poi mi da errore

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 351
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #11 il: Gennaio 31, 2021, 15:28 »
...intendi una cosa tipo cosi?
perchè anche cosi poi mi da errore
.
Errore che non hai riportato ... riporta il traceback che viene segnalato, assieme al codice che lo causa

Offline Legs

  • python unicellularis
  • *
  • Post: 39
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #12 il: Gennaio 31, 2021, 16:56 »
perchè anche cosi poi mi da errore
È strano però. A me funziona. Ho fatto qualche ritocco per sistemare la fase di input. Per il momento ho tolto la x visto che tanto non viene usata.
In pratica ho un messo un controllo generico sull'input in modo da impedire che uno possa pasticciarlo.
import matplotlib.pyplot as plt
import math

def grafico(r=1.0e7) :
    t = 0.0
    volume = []
    tempo = []
    while t <= 120.0:       
        volume_0 = 1.0e9+1.0e8*(1-math.exp(-t/100.0))-r*t
        if volume_0 < 0.0:
        break
        volume.append(volume_0)
        tempo.append(t)
        t += 1.0
       
    plt.plot(tempo, volume)
    plt.xlabel("Tempo")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
   

def main() :
try:
    r = float(input("Inserire il valore di r: "))
    grafico(r)
except:
grafico()

main()


Comunque utilizza la notazione esponenziale per i numeri e ricordati che stai lavorando con numeri in virgola mobile.

Offline crynow

  • python unicellularis
  • *
  • Post: 23
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #13 il: Febbraio 01, 2021, 09:31 »
Prima cosa, scusa nuzzopippo avevo dimendicato di mettere l'errore.
Ringrazio molto tutti quanti ho capito poi dove era l'errore e ho risolto con try e except.

Se posso chiedere l'ultimo consiglio:
def grafico(r=1.0e7) :
    t = 0
    volume = []
    tempo = []
    while t <= 120:       
        volume_0 = 1.0e9+1.0e8*(1-math.exp(-t/100))-r*t
        if volume_0 < 0 :
            break
        volume.append(volume_0)
        tempo.append(t)
        t += 1
       
    plt.plot(tempo, volume)
    plt.xlabel("Tempo ( giorni ) ")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
   


   def t_f(r,x) :
    t = 0
    v = 10**9
    v_0 = v * x
    valore = []
    while t <= 106 :
        volume_0 = 10**9+10**8*(1-math.exp(-t/100))-r*t
        valore.append(volume_0)
        t += 0.1
    return valore

     
       



def main() :
    try :
        r = float(input("Inserire il valore di r: "))
        grafico(r)
    except :
        grafico()
       
    x= 0.50
   
    T_F = t_f(r,x)
    print("m:", T_F)   

   
     
   
   

   
main()


praticamente dovrei fare una seconda funzione t_f che calcola l'istante t_f in cui il volume dell'acqua scende di una percentuale x del suo valore iniziale V= 1.0e9.
Cioè x vale 0.50 la funzione mi dovrebbe restituire l'istante in cui il volume dell'acqua e sceso del 50%.

Qualche anima pia che mi può dare consigli

Scusate se vi sto "scocciando"

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 351
  • Punti reputazione: 0
    • Mostra profilo
Re:[Python] grafico
« Risposta #14 il: Febbraio 01, 2021, 16:02 »
Prima cosa, scusa nuzzopippo avevo dimendicato di mettere l'errore.
...
praticamente dovrei fare una seconda funzione t_f che calcola l'istante t_f in cui il volume dell'acqua scende di una percentuale x del suo valore iniziale V= 1.0e9.
Cioè x vale 0.50 la funzione mi dovrebbe restituire l'istante in cui il volume dell'acqua e sceso del 50%.

Qualche anima pia che mi può dare consigli

Scusate se vi sto "scocciando"

Ok, scusato :)

beh ... datori che hai l'equazione di calcolo del volume ed hai il volume (massimo suppongo) cui comparare, suppongo che potresti estrarti il tempo rapportandolo al volume cercato risolvendo l'equazione
1.0e9+1.0e8*(1-math.exp(-t/100))-r*t = vol_search
per la variabile "t"

... cosa di cui io non sono più capace (ammesso lo sia mai stato) ... Ti dirò, mi ha intrigato questo Tuo ultimo quesito, ho provato una approssimazione (che razza di portate ... è una diga, forse?) che certo non Ti servirà ma che Ti propongo, ho trovato comodo scindere calcoli e dati dal plottaggio, ed ho calcolato, linearmente, il secondo in cui avviene il transito, per poi indicarlo nel plot con una didascalia, lo butto qua tanto per _
import matplotlib.pyplot as plt
import math

def calculate(r=1.0e7) :
    t = 0
    volume = []
    tempo = []
    while t <= 120:       
        volume_0 = 1.0e9+1.0e8*(1-math.exp(-t/100))-r*t
        if volume_0 < 0 :
            break
        volume.append(volume_0)
        tempo.append(t)
        t += 1
    return tempo, volume

def draw_values(tempo, volume, md):
    plt.plot(tempo, volume)
    plt.annotate("Volume medio\nt = %.4f" % md[1],
                 xy=(md[1], md[0]), arrowprops={'arrowstyle':'->'},
                 xytext=(md[1]+10, md[0]))
    plt.xlabel("Tempo ( giorni ) ")
    plt.ylabel("Volume")
    plt.grid('on')
    plt.show()
   


def t_f(tempi, volumi, x) :
    vol_search = max(volumi) * x
    ''' Qui andrebbe inserito il calcolo del tempo partendo dalla
        formula di calcolo del volume ma ridurre la equazione
        espondenziale della incognita "t" è fuori dalla
        mia portata, se sai risolvi :
        1.0e9+1.0e8*(1-math.exp(-t/100))-r*t = vol_search

        io vado per approssimazione linerare
    '''
    # trovo l'indice del primo giorno in cui viene superato
    # il volume cercato
    vol_min = max([x for x in volumi if x < vol_search])
    index = volumi.index(vol_min)
    # differenza tra i giorni di supero del limite cercato
    scarto = volumi[index-1] - volumi[index]
    # calcolo il volume per minuto
    sec_for_day = 24 * 3600  # * 3600 se sec_for_day
    vol = scarto / sec_for_day
    # trovo il massimo minuto in cui vol_search è superato
    seconds = 0
    for i in range(sec_for_day):
        if volumi[index-1] - vol * seconds < vol_search:
            break
        seconds += 1
    # arrotondo al mezzo minuto, calcolo la frazione di giorno
    # e la sommo al girono prima del supero
    tempo = tempi[index-1] + (seconds/(3600))/24
    return vol_search, tempo
   


def main() :
    r = None
    try :
        r = float(input("Inserire il valore di r: "))
        tempi, volumi = calculate(r)
    except ValueError:
        tempi, volumi = calculate()
       
    x = 0.50
   
    T_F = t_f(tempi, volumi, x)
    # verifico il calcolo approssimato e stampo
    if not r:
        r = 1.0e7
    volume =  1.0e9+1.0e8*(1-math.exp(-T_F[1]/100))-r*T_F[1]
    print('Volume %.2f superato a %.4f giorni (%.2f)' %
          (T_F[0], T_F[1], volume))
    # plotto
    draw_values(tempi, volumi, T_F)
     
   
   
if __name__ == '__main__':
    main()


Cob il valore di default da uno scarto di 433.88 unità su 500 milioni.