Oppure

Loading
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 :hail:

//**********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
28/12/14 10:19
Andreronda
nessuno può darmi una mano ? :(
aaa
28/12/14 10:38
SamIAm
Ciao

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


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

usa

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

aaa
28/12/14 11:09
Andreronda
Postato originariamente da SamIAm:

Ciao

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


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

usa

float funz(int N, float x0, float vet[])
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:
aaa
28/12/14 13:50
Andreronda
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 :)

#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;
						else if (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);
			scanf("%f", &fun[i]);
		}
	
	printf("inserire il valore di x0\n");
	scanf("%f", &x0);
	
	
	risul=calcolo( N, x0, fun );
	printf("valore di x = %f\n", risul);
	return 0;
}


aaa