Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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
Codice sorgente - presumibilmente C++
//**********versione 1************
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float funz(int N, float x0, float vet[])
{
int i;
int y=0;
for(i=0; i<N+1; i++)
{
y=y+vet[i]*pow(x0, i);
}
return(y);
}
//***********funzione per la derivata**********
float deriv(int N, float x0, float vet[])
{
int i;
float d=0;
for(i=N; i>0; i--)
{
d=d+i*vet[i]*pow(x0, (i-1));
}
return(d);
}
//***********funzione per calcolare il punto**********
float calc(float x0, float y, int d)
{
float risultato;
risultato=x0-(y/d);
return risultato;
}
int controllo(float q, float x0)
{
int stato;
float e, e1, e2;
e=0.0001;
e1=(q-x0);
if(e1<0)
e2=-(e1);
elseif(e1>0)
e2=e1;
if(e2<e)
stato=1;
else
stato=0;
return stato;
}
main ()
{
int N, stat;
float fun[6];
float x0;
float y0;
float d0;
int i;
float q;
printf("inserisci il grado del polinomio (il valore massimo):\n");
scanf("%d", &N);
for(i=0; i<N+1; i++)
{
printf("inserisci il valore del coefficiente per x^%d\n", i);
scanf("%f", &fun[i]);
}
printf("inserire il valore da cui partire per calcolare lo zero\n");
scanf("%f", &x0);
stat=0;
while(stat==0)
{
y0= funz(N, x0, fun);
printf("il valore della funzione nel punto x0=%f\n", y0);
d0=deriv(N, x0, fun);
printf("il valore della derivata nel pto x0=%f\n", d0);
q=calc(x0, y0, d0);
stat=controllo(q, x0);
x0=q;
printf("calovolo %f", x0);
}
if(stat==1)
printf("il valore dell x in y=0 è %f\n", x0);
return0;
}
Codice sorgente - presumibilmente C++
//
***********versione due*************
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float funz(int N, float x0, float vet[])
{
int i;
int y=0;
for(i=0; i<N+1; i++)
{
y=y+vet[i]*pow(x0, i);
}
return(y);
}
//***********funzione per la derivata**********
float deriv(int N, float x0, float vet[])
{
int i;
float d=0;
for(i=N; i>0; i--)
{
d=d+i*vet[i]*pow(x0, (i-1));
}
return(d);
}
//***********funzione per calcolare il punto**********
float calc(int N, float x0, float vet[])
{
float e=0.0001;
float p;
float diff;
while(1)
{
p=x0-(funz(N, x0, vet)/deriv(N, x0, vet));
diff=(p-x0);
if(diff>0)
{
diff=diff*1;
if(diff<=e)
break;
if(diff>e)
x0=p;
}
elseif(diff<0)
{
diff=diff*(-1);
if(diff<=e)
break;
if(diff>e)
x0=p;
}
}
return(p);
}
main ()
{
int N, stat;
float fun[6];
float x0;
float y0;
float d0;
int i;
float q;
printf("inserisci il grado del polinomio (il valore massimo):\n");
scanf("%d", &N);
for(i=0; i<N+1; i++)
{
printf("inserisci il valore del coefficiente per x^%d\n", i);
scanf("%f", &fun[i]);
}
printf("inserire il valore da cui partire per calcolare lo zero\n");
scanf("%f", &x0);
y0= funz(N, x0, fun);
printf("il valore della funzione nel punto x0=%f\n", y0);
d0=deriv(N, x0, fun);
printf("il valore della derivata nel pto x0=%f\n", d0);
q=calc(N, x0, fun);
printf("\nvalore di x in 0 =%f\n", q);
return0;
}
Codice sorgente - presumibilmente C++
//**********versione tre********
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float funz(int N, float x0, float vet[])
{
int i;
int y=0;
for(i=0; i<N+1; i++)
{
y=y+vet[i]*pow(x0, i);
}
return(y);
}
//***********funzione per la derivata**********
float deriv(int N, float x0, float vet[])
{
int i;
float d=0;
for(i=N; i>0; i--)
{
d=d+i*vet[i]*pow(x0, (i-1));
}
return(d);
}
//***********funzione per calcolare il punto**********
float calc(int N, float x0, float vet[])
{
float nuovox;
nuovox=x0-(funz(N, x0, vet)/deriv(N, x0, vet));
return nuovox;
}
main ()
{
int N, stat;
float fun[6];
float x0;
float errore;
float newx;
int i;
float q;
printf("inserisci il grado del polinomio (il valore massimo):\n");
scanf("%d", &N);
for(i=0; i<N+1; i++)
{
printf("inserisci il valore del coefficiente per x^%d\n", i);
scanf("%f", &fun[i]);
}
printf("inserire il valore da cui partire per calcolare lo zero\n");
in queste due funzioni, la dichiarazione del parametro vet[] è errata
usa
Codice sorgente - presumibilmente C++
float funz(int N, float x0, float vet[])
float deriv(int N, float x0, float vet[])
grazie mille un errore è stato rimosso
ora però continua a bloccarsi sempre sullo stesso valore quando arriva alla funzione calcolo per trovare lo zero
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++
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
//*********** calcolo funzione **************
float funz(int N, float x0, float vet[])
{
int i;
int y=0;
for(i=0; i<N+1; i++)
{
y=y+vet[i]*pow(x0, i);
}
return(y);
}
//********* calcolo derivata *****************
float deriv(int N, float x0, float vet[])
{
int i;
float d=0;
for(i=N; i>0; i--)
{
d=d+i*vet[i]*pow(x0, (i-1));
}
return(d);
}
//********* calcolo punto successivo *************
float calc(int N, float x0, float vet[])
{
float e=0.0001;
float zero;
float dif,e1;
while(1)
{
zero = x0-(funz(N, x0, vet)/deriv(N, x0, vet));
dif=(zero-x0);
e1=fabs(dif);
if(e1<=e)
break;
elseif(e1>e)
x0=zero;
}
return zero;
}
main ()
{
int N, i;
float fun[6];
float x0;
float risul;
printf("inserire il valore massimo del polinomio\n");
scanf("%d", &N);
for(i=0; i<N+1; i++)
{
printf("inserire il valore del coefficiente di x^%d\n", i);