Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - trovare la radice di un numero con il metodo di Newton
Forum - C/C++ - trovare la radice di un numero con il metodo di Newton

Avatar
Andreronda (Normal User)
Newbie


Messaggi: 6
Iscritto: 16/12/2014

Segnala al moderatore
Postato alle 12:27
Martedì, 16/12/2014
Buongiorno a tutti,
avrei un problema con un programma che calcola la radice di polinomi nella forma Pn(x)= an x^n + a(n-1)x^(n-1)....a1x+ a0 usando l'algoritmo di Newton-Raphson
n può valere al massimo 5 se interessa.
la funzione deve ricevere in input n, an, a(n-1)....a0 e il primo valore di x da cui partire per calcolare la funzione e la sua derivata.
il punto è questo il mio programma si blocca in un ciclo infinito nella funzione calc in cui il valore di xo e di p non viene refreshato.
Ho fatto tre versioni del programma cambiando la suddetta funzione ma nulla, si blocca sempre nello stesso punto.
Sommi programmato professionisti illuminatemi :hail:

Codice sorgente - presumibilmente C++

  1. //**********versione 1************
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6.  
  7. float funz(int N, float x0, float vet[])
  8.         {
  9.                 int i;
  10.                 int y=0;
  11.                 for(i=0; i<N+1; i++)
  12.                         {
  13.                                 y=y+vet[i]*pow(x0, i);
  14.                         }
  15.                 return(y);
  16.         }
  17. //***********funzione per la derivata**********
  18.  
  19. float deriv(int N, float x0, float vet[])
  20.  
  21.         {
  22.                 int i;
  23.                 float d=0;
  24.                 for (i=N; i>0; i--)
  25.                         {
  26.                                 d=d+i*vet[i]*pow(x0, (i-1));
  27.                         }
  28.                 return (d);
  29.         }
  30.  
  31. //***********funzione per calcolare il punto**********
  32. float calc(float x0, float y, int d)
  33.  
  34.         {
  35.                 float risultato;
  36.                
  37.                 risultato=x0-(y/d);
  38.                
  39.                 return risultato;
  40.         }
  41.  
  42. int controllo(float q, float x0)
  43.         {      
  44.                 int stato;
  45.                 float e, e1, e2;
  46.                 e=0.0001;
  47.                 e1=(q-x0);
  48.                 if(e1<0)
  49.                         e2=-(e1);
  50.                 else if(e1>0)
  51.                         e2=e1;
  52.                 if(e2<e)
  53.                         stato=1;
  54.                 else
  55.                         stato=0;
  56.                 return stato;
  57.         }      
  58.  
  59. main ()
  60. {
  61.         int N, stat;
  62.         float fun[6];
  63.         float x0;
  64.         float y0;
  65.         float d0;
  66.         int i;
  67.         float q;
  68.  
  69.         printf("inserisci il grado del polinomio (il valore massimo):\n");
  70.         scanf("%d", &N);
  71.        
  72.         for(i=0; i<N+1; i++)
  73.                 {
  74.                         printf("inserisci il valore del coefficiente per x^%d\n", i);
  75.                         scanf("%f", &fun[i]);
  76.                 }
  77.         printf("inserire il valore da cui partire per calcolare lo zero\n");
  78.         scanf("%f", &x0);
  79.        
  80.         stat=0;
  81.  
  82.         while(stat==0)
  83.                 {      
  84.                         y0= funz(N, x0, fun);
  85.                         printf("il valore della funzione nel punto x0=%f\n", y0);
  86.                        
  87.                         d0=deriv(N, x0, fun);
  88.                         printf("il valore della derivata nel pto x0=%f\n", d0);
  89.                                
  90.                         q=calc(x0, y0, d0);
  91.                         stat=controllo(q, x0);
  92.                         x0=q;
  93.                         printf("calovolo %f", x0);
  94.                 }      
  95.        
  96.         if (stat==1)
  97.                 printf("il valore dell x in y=0 è %f\n", x0);
  98.  
  99. return 0;
  100. }





Codice sorgente - presumibilmente C++

  1. //
  2. ***********versione due*************
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6.  
  7. float funz(int N, float x0, float vet[])
  8.         {
  9.                 int i;
  10.                 int y=0;
  11.                 for(i=0; i<N+1; i++)
  12.                         {
  13.                                 y=y+vet[i]*pow(x0, i);
  14.                         }
  15.                 return(y);
  16.         }
  17. //***********funzione per la derivata**********
  18.  
  19. float deriv(int N, float x0, float vet[])
  20.  
  21.         {
  22.                 int i;
  23.                 float d=0;
  24.                 for (i=N; i>0; i--)
  25.                         {
  26.                                 d=d+i*vet[i]*pow(x0, (i-1));
  27.                         }
  28.                 return (d);
  29.         }
  30.  
  31. //***********funzione per calcolare il punto**********
  32. float calc(int N, float x0, float vet[])
  33.  
  34.         {
  35.                 float e=0.0001;
  36.                 float p;
  37.                 float diff;    
  38.  
  39.                 while(1)
  40.                         {
  41.                                 p=x0-(funz(N, x0, vet)/deriv(N, x0, vet));
  42.                                
  43.                                 diff=(p-x0);
  44.                                 if(diff>0)
  45.                                         {
  46.                                                 diff=diff*1;
  47.                                                 if(diff<=e)
  48.                                                         break;
  49.                                                 if(diff>e)
  50.                                                         x0=p;
  51.                                         }      
  52.                                 else if(diff<0)
  53.                                         {
  54.                                                 diff=diff*(-1);
  55.                                                 if(diff<=e)
  56.                                                         break;
  57.                                                 if(diff>e)
  58.                                                         x0=p;
  59.                                         }
  60.                         }
  61.                 return(p);
  62.         }
  63.                                        
  64. main ()
  65. {
  66.         int N, stat;
  67.         float fun[6];
  68.         float x0;
  69.         float y0;
  70.         float d0;
  71.         int i;
  72.         float q;
  73.  
  74.         printf("inserisci il grado del polinomio (il valore massimo):\n");
  75.         scanf("%d", &N);
  76.        
  77.         for(i=0; i<N+1; i++)
  78.                 {
  79.                         printf("inserisci il valore del coefficiente per x^%d\n", i);
  80.                         scanf("%f", &fun[i]);
  81.                 }
  82.         printf("inserire il valore da cui partire per calcolare lo zero\n");
  83.         scanf("%f", &x0);
  84.        
  85.        
  86.  
  87.                         y0= funz(N, x0, fun);
  88.                         printf("il valore della funzione nel punto x0=%f\n", y0);
  89.                        
  90.                         d0=deriv(N, x0, fun);
  91.                         printf("il valore della derivata nel pto x0=%f\n", d0);
  92.                                
  93.                         q=calc(N, x0, fun);
  94.                         printf("\nvalore di x in 0 =%f\n", q);
  95.        
  96.  
  97. return 0;
  98. }





Codice sorgente - presumibilmente C++

  1. //**********versione tre********
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6.  
  7. float funz(int N, float x0, float vet[])
  8.         {
  9.                 int i;
  10.                 int y=0;
  11.                 for(i=0; i<N+1; i++)
  12.                         {
  13.                                 y=y+vet[i]*pow(x0, i);
  14.                         }
  15.                 return(y);
  16.         }
  17. //***********funzione per la derivata**********
  18.  
  19. float deriv(int N, float x0, float vet[])
  20.  
  21.         {
  22.                 int i;
  23.                 float d=0;
  24.                 for (i=N; i>0; i--)
  25.                         {
  26.                                 d=d+i*vet[i]*pow(x0, (i-1));
  27.                         }
  28.                 return (d);
  29.         }
  30.  
  31. //***********funzione per calcolare il punto**********
  32. float calc(int N, float x0, float vet[])
  33.         {
  34.                 float nuovox;
  35.                 nuovox=x0-(funz(N, x0, vet)/deriv(N, x0, vet));
  36.                 return nuovox;
  37.         }
  38.        
  39.                                        
  40. main ()
  41. {
  42.         int N, stat;
  43.         float fun[6];
  44.         float x0;
  45.         float errore;
  46.         float newx;
  47.         int i;
  48.         float q;
  49.  
  50.         printf("inserisci il grado del polinomio (il valore massimo):\n");
  51.         scanf("%d", &N);
  52.        
  53.         for(i=0; i<N+1; i++)
  54.                 {
  55.                         printf("inserisci il valore del coefficiente per x^%d\n", i);
  56.                         scanf("%f", &fun[i]);
  57.                 }
  58.         printf("inserire il valore da cui partire per calcolare lo zero\n");
  59.         scanf("%f", &x0);
  60.        
  61.        
  62.  
  63.         do
  64.         {
  65.             newx=calc(N, x0, fun);
  66.             errore=fabs(x0-newx);
  67.             x0=newx;
  68.         }
  69.         while (errore>0.0001);
  70.         printf("\n\nLa radice dell'equazione e':  %f",newx);
  71.  
  72.        
  73.  
  74. return 0;
  75. }



Ultima modifica effettuata da Andreronda il 28/12/2014 alle 12:13
PM Quote
Avatar
Andreronda (Normal User)
Newbie


Messaggi: 6
Iscritto: 16/12/2014

Segnala al moderatore
Postato alle 11:19
Domenica, 28/12/2014
nessuno può darmi una mano ? :(

PM Quote
Avatar
SamIAm (Normal User)
Newbie


Messaggi: 16
Iscritto: 09/09/2012

Segnala al moderatore
Postato alle 11:38
Domenica, 28/12/2014
Ciao

Codice sorgente - presumibilmente C++

  1. float funz(int N, float x0, float vet[N+1])
  2. float deriv(int N, float x0, float vet[N+1])



in queste due funzioni, la dichiarazione del parametro vet[] è errata

usa

Codice sorgente - presumibilmente C++

  1. float funz(int N, float x0, float vet[])
  2. float deriv(int N, float x0, float vet[])



PM Quote
Avatar
Andreronda (Normal User)
Newbie


Messaggi: 6
Iscritto: 16/12/2014

Segnala al moderatore
Postato alle 12:09
Domenica, 28/12/2014
Testo quotato

Postato originariamente da SamIAm:

Ciao

Codice sorgente - presumibilmente C++

  1. float funz(int N, float x0, float vet[N+1])
  2. float deriv(int N, float x0, float vet[N+1])



in queste due funzioni, la dichiarazione del parametro vet[] è errata

usa

Codice sorgente - presumibilmente C++

  1. float funz(int N, float x0, float vet[])
  2. float deriv(int N, float x0, float vet[])





grazie mille :k: un errore è stato rimosso
ora però continua a bloccarsi sempre sullo stesso valore quando arriva alla funzione calcolo per trovare lo zero :rotfl:

PM Quote
Avatar
Andreronda (Normal User)
Newbie


Messaggi: 6
Iscritto: 16/12/2014

Segnala al moderatore
Postato alle 14:50
Domenica, 28/12/2014
Ho risolto  il problema,
ho rivisto la funzione calc e ho sostituito tutto il processo per il calcolo dell'errore con un semplice fabs
posto il nuovo codice correto, potrebbe tornare utile ad altri :)

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. //*********** calcolo funzione **************
  7.  
  8. float funz(int N, float x0, float vet[])
  9.         {
  10.                 int i;
  11.                 int y=0;
  12.                 for(i=0; i<N+1; i++)
  13.                         {
  14.                                 y=y+vet[i]*pow(x0, i);
  15.                         }
  16.                 return(y);
  17.         }
  18.  
  19.  
  20. //********* calcolo derivata *****************
  21.  float deriv(int N, float x0, float vet[])
  22.         {
  23.                 int i;
  24.                 float d=0;
  25.                 for (i=N; i>0; i--)
  26.                         {
  27.                                 d=d+i*vet[i]*pow(x0, (i-1));
  28.                         }
  29.                 return (d);
  30.         }
  31.  
  32. //********* calcolo punto successivo *************
  33.  
  34.  float calc(int N, float x0, float vet[])
  35.         {
  36.                 float e=0.0001;
  37.                 float zero;
  38.                 float dif,e1;
  39.                 while(1)
  40.                         {
  41.                                 zero = x0-(funz(N, x0, vet)/deriv(N, x0, vet));
  42.                                 dif=(zero-x0);
  43.                                 e1=fabs(dif);
  44.                                                 if(e1<=e)
  45.                                                                
  46.                                                                 break;
  47.                                                 else if (e1>e)
  48.                                                         x0=zero;
  49.                         }
  50.                                        
  51.                 return zero;
  52.         }
  53.        
  54.  
  55. main ()
  56.  
  57. {
  58.         int N, i;
  59.         float fun[6];
  60.         float x0;
  61.         float risul;
  62.  
  63.         printf("inserire il valore massimo del polinomio\n");
  64.         scanf("%d", &N);
  65.  
  66.         for(i=0; i<N+1; i++)
  67.                 {
  68.                         printf("inserire il valore del coefficiente di x^%d\n", i);
  69.                         scanf("%f", &fun[i]);
  70.                 }
  71.        
  72.         printf("inserire il valore di x0\n");
  73.         scanf("%f", &x0);
  74.        
  75.        
  76.         risul=calcolo( N, x0, fun );
  77.         printf("valore di x = %f\n", risul);
  78.         return 0;
  79. }



PM Quote