Topic: Ciclo while all'interno di un ciclo For  (Letto 342 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline lucajust

  • python unicellularis
  • *
  • Post: 22
  • Punti reputazione: 0
    • Mostra profilo
Ciclo while all'interno di un ciclo For
« il: Maggio 22, 2018, 12:04 »
Salve a tutti, dovrei creare una matrice bidimensionale, pertanto, nel programma da me scritto, è necessario un ciclo while all'interno di un ciclo for.
questo è lo script completo:
from fipy import *
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
import binascii
import os

# int
dx = 10 #[grid steps]
A = np.array ([0,1,1,1,1,1])
B = np.zeros (150)
C = np.hstack((B,A,B,B,B,B,B,B,B,B,B,B,B,B,B,B))
conc = 5E-3
sample = C*conc
nx = np.shape(sample)[0]
mesh = Grid1D(nx=nx, dx=dx)
x = mesh.cellCenters[0]
mm=0
sec = [0]
conta_sec = 0
timeStepDuration = 1
index = np.arange(0, 5, 0.1)
d = 1 #cm

# set PHI
phiPHI = CellVariable(name="PHI", mesh=mesh, value = 0.)
phiPHI.setValue(sample)
print phiPHI


for coeff in index:

    #coeff V
    V = CellVariable(name="velocità", mesh=mesh, rank=1)
    v = - coeff + 5 #mm/s
    V.setValue(v,)

    #coeff D
    D = CellVariable(name="mixing", mesh=mesh, value = 0.)
    mixing = 1 #[mm^2/s]
    D.setValue(mixing,)

    #boundaries values
    valueLeft = 0
    valueRight = 0

    #boundaries conditions
    phiPHI.faceGrad.constrain(valueLeft, mesh.facesRight)
    phiPHI.faceGrad.constrain(valueLeft, mesh.facesLeft)

    #equation
    eqPHI = TransientTerm() ==  -VanLeerConvectionTerm(V) + DiffusionTerm(D)
    print ('solve for v=' + str(v))

    #Initial value
    pila = np.array(phiPHI)
    bipila = np.array(phiPHI)
    elap_time=[0]


    #while cicle
    i=0
    while conta_sec <= 100:
        eqPHI.solve(phiPHI, dt=timeStepDuration)
        conta_sec = conta_sec + timeStepDuration
        data = np.array(phiPHI)
        pila = np.vstack((pila,data))
        conta_sec = conta_sec + timeStepDuration
        if conta_sec %10 == 0:
            elap_time = np.append(elap_time, conta_sec)
            i += 1
            print elap_time
    bipila = np.hstack((bipila, pila))
    print(bipila.shape)

np.savetxt('2Dpila' + '_C=' + str(conc) + '.txt', bipila, delimiter=',', newline='n')


Quello che succede è che per il primo ciclo For itera anche il ciclo while (infatti l'elap_time viene stampato), per i successivi cicli for invece il ciclo while viene saltato. Me ne accorgo perchè il con print(bipila.shape), mi da come risultato (2,2256). 
Per caso sapete indicarmi dove potrei aver sbagliato?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.859
  • Punti reputazione: 9
    • Mostra profilo
Re:Ciclo while all'interno di un ciclo For
« Risposta #1 il: Maggio 22, 2018, 20:40 »
> questo è lo script completo:

ecco, appunto... ma era proprio necessario farci leggere tutto uno script completamente incomprensibile, mezzo in italiano mezzo in inglese, pieno di variabili che si chiamano "x", "d", "v" (minuscola!), "V" (maiuscola!), "pila e bipila, occhio e malocchio", eccetera?
Fortuna che dopo un po', con l'esperienza uno impara a vedere gli errori, però davvero, la prossima volta impara prima a scrivere codice leggibile, poi pensiamo agli errori.

Quanto all'errore... indovina un po' che cosa non va in questo codice:

>>> flag = 0
>>> for round in 'abcd':
...         print('round:', round)
...         while flag < 5:
...             print('   flag:', flag)
...             flag += 1
...
round: a
   flag: 0
   flag: 1
   flag: 2
   flag: 3
   flag: 4
round: b
round: c
round: d

Offline lucajust

  • python unicellularis
  • *
  • Post: 22
  • Punti reputazione: 0
    • Mostra profilo
Re:Ciclo while all'interno di un ciclo For
« Risposta #2 il: Maggio 22, 2018, 21:10 »
Allora, io ti ringrazio che ogni volta sei disponibile a rispondere ai miei post. Però il nome delle variabili (v è la velocità di un flusso, d è un coefficiente di diffusione etc) è scelta in base ai valori sperimentali che dovrò inserire. Non sono un programmatore, quindi scrivo un poco come "mi viene". Piano piano migliorerò spero anche in questo. Il fatto di aver scritto tutto lo script deriva dal fatto che in un altro post mi hai rimproverato perchè, non avendo scritto tutto il codice, non si capiva cosa volessi ottenere  :D

Tornando all'argomento del post, credo di aver capito, nel tuo miniscript, flag parte da zero, si fa i 5 cicli while e poi diventa uguale a 5. solo che poi, rimandendo 5, quando vorresti che il ciclo while ripartisse, legge che il valore è gia 5 e passa oltre. Quindi lo stesso succede al mio conta_sec. allora alla fine del ciclo for, azzero conta_sec così dovrebbe ripartire. Provo subito! Poi passo all'altra questions  :fingers-crossed:

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.859
  • Punti reputazione: 9
    • Mostra profilo
Re:Ciclo while all'interno di un ciclo For
« Risposta #3 il: Maggio 22, 2018, 21:33 »
> Però il nome delle variabili (v è la velocità di un flusso, d è un coefficiente di diffusione etc) è scelta in base ai valori sperimentali

No. Il nome delle variabili deve essere CHIARO. Se una variabile è la "velocità di flusso", quella variabile si chiama "flow_velocity" (immagino), non certo "v". Se una variabile è il "coefficiente di diffusione", si chiama "diffusivity" (penso), non certo "d". Eccetera.

> Non sono un programmatore, quindi scrivo un poco come "mi viene".

No. Se scrivi programmi, sei un programmatore. Se lavi i piatti, sei un lavapiatti. Ogni volta che scrivi un programma sei un programmatore, ogni volta che lavi i piatti sei un lavapiatti. Guarda che "programmatore" non è una onorificenza, è la descrizione concreta di ciò che fai in quel momento.
E poi, soprattutto: non importa che cosa sei o credi di essere. Importa che se vuoi sottoporre il tuo codice a qualcuno, anche solo postarlo in un forum, allora devi prima rendere quel codice CHIARO.

> credo di aver capito

Infatti. E' una svista banale, ma avrebbe avuto molte meno possibilità di succedere se avessi organizzato meglio quel codice. E mi spiace dirtelo così, ma no, non "migliorerai piano piano" se continui a focalizzarti esclusivamente sul risultato anziché sul codice. Continuerai a scrivere piccoli (o peggio, grandi) script caotici e fragili, che "funzionano" incrociando le dita nella migliore delle ipotesi, ma che in realtà sono soggetti a continue "sviste" di questo tipo.

> Provo subito! Poi passo all'altra questions

Sì, è appunto quel che volevo dire.

Offline lucajust

  • python unicellularis
  • *
  • Post: 22
  • Punti reputazione: 0
    • Mostra profilo
Re:Ciclo while all'interno di un ciclo For
« Risposta #4 il: Maggio 22, 2018, 21:49 »
> Però il nome delle variabili (v è la velocità di un flusso, d è un coefficiente di diffusione etc) è scelta in base ai valori sperimentali

No. Il nome delle variabili deve essere CHIARO. Se una variabile è la "velocità di flusso", quella variabile si chiama "flow_velocity" (immagino), non certo "v". Se una variabile è il "coefficiente di diffusione", si chiama "diffusivity" (penso), non certo "d". Eccetera.

> Non sono un programmatore, quindi scrivo un poco come "mi viene".

No. Se scrivi programmi, sei un programmatore. Se lavi i piatti, sei un lavapiatti. Ogni volta che scrivi un programma sei un programmatore, ogni volta che lavi i piatti sei un lavapiatti. Guarda che "programmatore" non è una onorificenza, è la descrizione concreta di ciò che fai in quel momento.
E poi, soprattutto: non importa che cosa sei o credi di essere. Importa che se vuoi sottoporre il tuo codice a qualcuno, anche solo postarlo in un forum, allora devi prima rendere quel codice CHIARO.

> credo di aver capito

Infatti. E' una svista banale, ma avrebbe avuto molte meno possibilità di succedere se avessi organizzato meglio quel codice. E mi spiace dirtelo così, ma no, non "migliorerai piano piano" se continui a focalizzarti esclusivamente sul risultato anziché sul codice. Continuerai a scrivere piccoli (o peggio, grandi) script caotici e fragili, che "funzionano" incrociando le dita nella migliore delle ipotesi, ma che in realtà sono soggetti a continue "sviste" di questo tipo.

> Provo subito! Poi passo all'altra questions

Sì, è appunto quel che volevo dire.

Per me sono chiare perchè quando uso le varie equazioni, indico con le lettere, non con parole per una questione pratica. Anche perchè questo script mi serve per fare simulazioni mie per inserire i risultati in futuri articoli. In ogni caso quando mi capiterà di ripostare sul forum, mi premurerò di rendere più chiaro cosa significano le varie cose.

Comunque tornando al nocciolo della questione, ora, azzerando il contatore dei secondi, funziona e riparte ogni volta anche il ciclo while.
Quello che dovrei riuscire a fare è creare una matrice tridimensionale impilando tutte le matrici bidimensionali che si generano nel ciclo while. Credo di avere una vaga idea di come fare, eventualmente tornerò qui con la coda tra le gambe.

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Ciclo while all'interno di un ciclo For
« Risposta #5 il: Maggio 31, 2018, 19:20 »
Poi, detto fra di noi, se usi numpy e stai a fare loop espliciti, stai sbagliando candeggio.
Numpy nasce per fare calcolo matriciale. Vuoi matrici tridimensionali? Ancora una volta, niente for loop, niente while loop.
Prodotti tensoriali? YVW! Direttamente. Etc etc etc.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.859
  • Punti reputazione: 9
    • Mostra profilo
Re:Ciclo while all'interno di un ciclo For
« Risposta #6 il: Maggio 31, 2018, 21:09 »
> stai sbagliando candeggio.

cavolo riko, ma sei sicuro che ti capiscano ancora quando scrivi cose del genere?
Tanto vale scrivere "non ho mai usato brillantina Linetti", o “l’uomo in vista col baffo che conquista”...

Dammi retta, ormai nessuno studia più i classici...

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re:Ciclo while all'interno di un ciclo For
« Risposta #7 il: Giugno 01, 2018, 10:40 »
> stai sbagliando candeggio.

cavolo riko, ma sei sicuro che ti capiscano ancora quando scrivi cose del genere?
Tanto vale scrivere "non ho mai usato brillantina Linetti", o “l’uomo in vista col baffo che conquista”...

 :D :D :D

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Ciclo while all'interno di un ciclo For
« Risposta #8 il: Giugno 04, 2018, 22:00 »
Dammi retta, ormai nessuno studia più i classici...

Tu ci potresti anche avere ragione...

Offline Aezio

  • python neanderthalensis
  • ****
  • Post: 326
  • Punti reputazione: 1
    • Mostra profilo
Re:Ciclo while all'interno di un ciclo For
« Risposta #9 il: Giugno 05, 2018, 10:04 »
> stai sbagliando candeggio.

cavolo riko, ma sei sicuro che ti capiscano ancora quando scrivi cose del genere?
Tanto vale scrivere "non ho mai usato brillantina Linetti", o “l’uomo in vista col baffo che conquista”...

Dammi retta, ormai nessuno studia più i classici...

'Per una parete grande non usare un pennello grande, ma un grande pennello"; "Signora scambierebbe 1 fustino per 2 fustini..."