Ciclio do-while e loop infinito

di il
16 risposte

Ciclio do-while e loop infinito

Salve a tutti, il codice che scrivo dovrebbe avere il fine di calcolare iterativamente dei coefficienti partendo da un valore iniziale di un variabile Tc e andando a ricalcolarla alla fine del ciclo,per rieffettuarlo e arrivare a convergenza. Però ottengo alla fine un loop infinito. Che ho sbagliato? Grazie mille

eps=1;
do
{
Tc_c=Tc;
deltaT=((Tc+Tp)/2+273);
printf("'%f'\n",deltaT);

alpha=ni/Pr;

Ra=((Tp-Tc)*(g*pow(L,3))/(ni*alpha*deltaT));

Nu=(1+1.44*(1-(1708*pow(sin(1.8*beta),1.6))/(Ra*cos(beta)))*(1-(1708/(Ra*cos(beta))))+(pow(((Ra*cos(beta))/5830),0.333)-1));

h_cpc=((Nu)*((k)/L));

h_rca=((e_c)*sigma*(pow((Tc+273),2)+pow((Ta+273),2))*(Tc+Ta+2*273));

h_rpc=(sigma*(pow((Tp+273.15),2)+pow((Tc+273.15),2))*(Tp+Tc+2*273.15)*e_p*e_c)/(e_c+e_p-e_p*e_c);

coeff_top=(pow((1/(h_cpc+h_rpc)+1/(+hw+h_rca)),-1));

Tc_c=(Tp-coeff_top*(Tp-Ta)/(h_cpc+h_rpc));

eps=(Tc_c-Tc);
}while (fabs(eps)>0.001);

16 Risposte

  • Re: Ciclio do-while e loop infinito

    Evidentemente eps in valore assoluto è sempre maggiore di 0.001.
    Quello che ti suggerisco (e che vedo avevi già iniziato a fare) è quella di inserire una printf() per ogni calcolo che fai e controlla i risultati.
  • Re: Ciclio do-while e loop infinito

    In realtà le ho cancellate per evitare di scrivere linee di codice inutili nel post, ma nel mio sorgente ho printf per tutti i coefficienti proprio per verificare il tuo dubbio.In teoria dovrebbe raggiungere la convergenza in 4 o 5 cicli (ho fatto il conto sulla carta prima) ma temo che non mi vada ad aggiornare il nuovo valore di Tc quando ricomincia il ciclo, anche se il codice mi sembra corretto. Grazie mille della risposta
  • Re: Ciclio do-while e loop infinito

    Stai usando float o double? Ti consiglio i double ...
  • Re: Ciclio do-while e loop infinito

    Ho utilizzato i double: niente più loop ma valori completamente sbagliati e ciclo ripetuto una sola volta. Grazie mille
  • Re: Ciclio do-while e loop infinito

    Ho utilizzato i double: niente più loop ma valori completamente sbagliati e ciclo ripetuto una sola volta. Grazie mille
  • Re: Ciclio do-while e loop infinito

    Ci dici quali sarebbero i valori giusti ?

    E soprattutto, quali sono i valori iniziali di queste variabili

    'Tp'
    'Tc'
    'Ta'
    'sigma'
    'Pr'
    'ni'
    'L'
    'k'
    'hw'
    'g'
    'e_p'
    'e_c'
    'beta'

    ?

    P.S. Utilizza i tag CODE per il codice ... altrimenti si fa fatica a rispondere ...
  • Re: Ciclio do-while e loop infinito

    int main()
      {
         float L=0.025, k=0.0293;
         float e_p=0.95, e_c=0.88, beta=0.785, hw=10;
         float g=9.807, Pr=0.7;
         int Ta=10, Tp=100;
         double sigma=0.00000005670373, ni=0.0000196;
         
         double Tc, Tc_c;
         double coeff_top, deltaT;
         double h_cpc, h_rpc, h_rca;
         double Ra, Nu;
         double alpha, eps;
    
    Questa è la mia dichiarazione delle variabili. Per quanto riguarda i valori corretti per esempio deltaT dovrebbe uscire 340.5 mentre con questa dichiarazione esce 2354608425308963. (scusate per il tag code ma è la prima volta che scrivo in un forum simile)
  • Re: Ciclio do-while e loop infinito

    Manca il valore iniziale di

    Tc

    e le variabili non sono tutte double come avevi detto. Devono essere tutte double.
  • Re: Ciclio do-while e loop infinito

    Il valore di Tc lo faccio inserire all'utente come valore iniziale di iterazione. Mettendo comunque tutti double riprende il loop
  • Re: Ciclio do-while e loop infinito

    Quindi, se volessi provare il tuo programma, cosa che non sono riuscito a fare fino ad ora, quanto posso inserire per Tc?

    E poi sei sicura di avere codificato correttamente tutte le formule da cui deriva il problema, in modo che il ciclo sia "convergente" (e in modo abbastanza rapido)?
  • Re: Ciclio do-while e loop infinito

    Concordo con oregon,permettici di eseguire il codice anche a noi.
    Inizia anche ad usare il punto dopo i numeri double,ovvero:
    deltaT=((Tc+Tp)/2+273);
    quella riga teoricamente verrà trasformata in
    deltaT=(double)(  ((int)(Tc+Tp)/2)+273);
    e quindi avrai una divisione di due sulla somma di tc+tp ma su un int!
    la maniera corretta è
    deltaT = ( ( Tc + (double)Tp ) / 2.0 + 273.0 );
    in questo modo informi il compilatore che i numeri sono a virgola e non interi.
    da notare anche che l'uso corretto di spazi all'interno di una formula aggiungono leggibilità al codice.
    int Ta=10, Tp=100;
    io li convertirei a double,per evitare errori in conversione,cosi avrai una formula difensiva,ovvero priva di eventuali disattenzioni di conversione.
    double Ta = 10.0, Tp = 100.0;
    deltaT = ( ( Tc + Tp ) / 2.0 + 273.0 );

    Posta tutto il codice e dicci come fare per avere il tuo stesso problema.
  • Re: Ciclio do-while e loop infinito

    #include <stdio.h>
    #include <math.h>
    
    int main()
        {
         double L=0.025, k=0.0293;
         double e_p=0.95, e_c=0.88, beta=0.785, hw=10;
         double g=9.807, Pr=0.7;
         double Ta=10, Tp=100;
         double sigma=0.00000005670373, ni=0.0000196;
         
         double Tc, Tc_c;
         double coeff_top, deltaT;
         double h_cpc, h_rpc, h_rca;
         double Ra, Nu;
         double alpha, eps;
         
         printf("insert the starting value Tc:");
         scanf("%lf",&Tc);
         
           eps=1;
           do
           {
            Tc_c=Tc;    
           deltaT=((Tc+Tp)/2+273);
           printf("'%lf'\n",deltaT);
         
           alpha=ni/Pr;
         
           Ra=((Tp-Tc)*(g*pow(L,3))/(ni*alpha*deltaT));
           printf("Raileght number is Ra:'%lf'\n",Ra);
    
           Nu=(1+1.44*(1-(1708*pow(sin(1.8*beta),1.6))/(Ra*cos(beta)))*(1-(1708/(Ra*cos(beta))))+(pow(((Ra*cos(beta))/5830),0.333)-1));
           printf("Nusselt number is Nu:'%lf'\n",Nu);
         
           h_cpc=((Nu)*((k)/L));   
           printf("The convection heat coefficient between plate and cover is '%lf'\n",h_cpc);
         
           h_rca=((e_c)*sigma*(pow((Tc+273),2)+pow((Ta+273),2))*(Tc+Ta+2*273));
           printf("The radiant heat coefficient between cover and air is '%lf'\n",h_rca);
           
           h_rpc=(sigma*(pow((Tp+273.15),2)+pow((Tc+273.15),2))*      (Tp+Tc+2*273.15)*e_p*e_c)/(e_c+e_p-e_p*e_c);
           printf("The readiant heat coefficient between plate and cover is '%lf'\n",h_rpc);
           
           coeff_top=(pow((1/(h_cpc+h_rpc)+1/(+hw+h_rca)),-1));
           printf("The top loss coefficient is '%lf'\n",coeff_top);
           
           Tc_c=(Tp-coeff_top*(Tp-Ta)/(h_cpc+h_rpc));
          printf("The cover temperature is:'%lf'\n",Tc_c);
          
          eps=(Tc_c-Tc);
          }while (eps>0.01);
    
         printf("The top loss coefficient is:'%lf'\n",coeff_top);
         printf("The real value of the cover temperature is:'%lf'\n",Tc);
         
         getchar();
         getchar();     
         return 0;       
         }
    
    Allora questo è tutto il codice e il primo valore che mi calcola per ogni variabile (deltaT, Ra, Nu...ecc) è corretto solo che me lo stampa sempre uguale all'infinito. Inserendo un valore di 35 per Tc si ottiene: deltaT=340.5, Ra=53301, Nu=3.17, h_cpc=3.72, ecc Praticamente non aggiorna il valore di Tc e quindi i risultati non cambiano, il while è sempre vero e il ciclo va all'infinito.
  • Re: Ciclio do-while e loop infinito

    Il valore di Tc non viene mai aggiornato da nessuna parte nel codice ...
  • Re: Ciclio do-while e loop infinito

    Non lo aggiorno con la riga
    Tc_c=Tc
    subito dopo l'apertura del do?
Devi accedere o registrarti per scrivere nel forum
16 risposte