Ciclio do-while e loop infinito

di Anonimizzato14343 il
16 risposte
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

  • 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.
  • 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
  • Stai usando float o double? Ti consiglio i double ...
  • Ho utilizzato i double: niente più loop ma valori completamente sbagliati e ciclo ripetuto una sola volta. Grazie mille
  • Ho utilizzato i double: niente più loop ma valori completamente sbagliati e ciclo ripetuto una sola volta. Grazie mille
  • 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 ...
  • 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)
  • Manca il valore iniziale di

    Tc

    e le variabili non sono tutte double come avevi detto. Devono essere tutte double.
  • Il valore di Tc lo faccio inserire all'utente come valore iniziale di iterazione. Mettendo comunque tutti double riprende il loop
  • 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)?
  • 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.
  • #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.
  • Il valore di Tc non viene mai aggiornato da nessuna parte nel codice ...
  • 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