16/12/14 11:27
Andreronda
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
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
//**********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); else if(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); return 0; }
// ***********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; } else if(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); return 0; }
//**********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"); scanf("%f", &x0); do { newx=calc(N, x0, fun); errore=fabs(x0-newx); x0=newx; } while (errore>0.0001); printf("\n\nLa radice dell'equazione e': %f",newx); return 0; }
Ultima modifica effettuata da Andreronda 28/12/14 11:13
aaa