Approssimazione di cos(T*pigreco)con Taylor e poi con il polinomio interpolatore dato dai nodi di Chebyshev

di il
5 risposte

Approssimazione di cos(T*pigreco)con Taylor e poi con il polinomio interpolatore dato dai nodi di Chebyshev

Buon pomeriggio...Nel codice che vi posto qui di seguito l' "unica" parte che non va è il calcolo dell'approssimazione di cos(T*pigreco),con T numero reale inserito dall'utente,attraverso il polinomio interpolatore determinato dalla tavola della funzione coseno relativa ai nodi di Chebyshev associati a un intervallo dato ( in questo caso [ 0, Pigreco/2] ). Non so se nel codice ho sbagliato proprio la funzione che calcola i nodi(i quali devono essere equidistanti tra loro) o la funzione che approssima il coseno di (T*pigreco). Per sicurezza ho provato con T=0.25,così da avere coseno di 45°. Per farla breve,con Taylor sembra approssimare decentemente. Con Chebyshev(premetto che il valore di T,una volta inserito,è lo stesso sia nel calcolo con Taylor che con Chebyshev) mi dà #INF00 (forma indeterminata). Ora vi metto il codice. Perdonatemi
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void letturaT(double&);
double letturatolleranza(double&);
double potenza(double, int);
double fattoriale(int);
double cosenotaylor(double,double,int&);
double cosenochebyshev(double,double,double,int);
void nodichebyshev(double,double,int,double[]);
int main()
{
printf("Programma C++ che,definita la costante T,approssima cos(T*Pigreco),entro la tolleranza letta,usando il polinomio di Taylor con x0=0 e il criterio di arresto a \nposteriori,e stampa il grado n0 del polinomio e l'approssimazione calcolata.Poi stampa l'approssimazione di cos(T*pigreco)trovata con il polinomio interpolatore\n");
printf("determinato dalla tavola della funzione coseno relativa agli (n0 +1) nodi di Chebyshev associati all'intervallo [0,Pigreco/2].Confrontare l'output nei casi T=0.1 e\nT=0.4,avendo inserito in entrambi i casi prima tolleranza 10^-3 e poi 10^-10\n");
double T,tau;
letturaT(T);
int n0=0;
double eps=letturatolleranza(tau);
double appross_coseno_taylor=cosenotaylor(T,eps,n0);
printf("Il risultato dell'approssimazione' di cos(T*Pigreco) con il polinomio di Taylor e'%lf\n",appross_coseno_taylor);
printf("Il grado n0 del polinomio di Taylor che approssima il coseno(T*Pigreco)e' %d\n",n0);
int n_nodi=n0+1;
double pi_mezzi=M_PI*1./2;
double appross_coseno_chebyshev=cosenochebyshev(T,0,pi_mezzi,n_nodi);
printf("L'approssimazione di cos(T*Pigreco)con il polinomio interpolatore dato dalla tavola degli n0+1 nodi di Chebyshev associati a [0,Pigreco/2] e'%lf\n",appross_coseno_chebyshev);
return 0;
}
//Lettura della tolleranza con cui sarà approssimata e^x tramite Taylor:
double letturatolleranza(double& tau){
printf("Inserire la tolleranza toll con cui sara' approssimato cos(Tpigreco) tramite Taylor\n");scanf("%lf",&tau);
return tau;
}
//Lettura della variabile x della funzione e^x,con x appartenente a [-1,1]:
void letturaT(double&x){
{printf("Inserire l'argomento (reale) T di cos(Tpigreco):\n");scanf("%lf",&x);}	
return;
}
//Calcolo della potenza(per il numeratore del singolo termine del polinomio di Taylor del coseno):
double potenza (double x, int n)
{
	 int i; double p=1;
 
	 for (i=1; i<=n; ++i)
		  p=p*x;
 
	 return p;
}
//Calcolo del fattoriale(per il denominatore del singolo termine del polinomio di Taylor del coseno):
double fattoriale (int n)
{
		 double fattoriale=1;
 
		 for (int i=1; i<=n; i++) fattoriale=(fattoriale*i);
 
		 return fattoriale;
}
//Calcolo dell'approssimazione del coseno di(T*pigreco) tramite il polinomio di Taylor:
double cosenotaylor(double x,double eps,int& n){
int segno=1;
n=0;
double appross=0;	
double z;
z=x*M_PI;
do {
	 appross+=segno*(potenza(z, n)/ fattoriale(n));
     n+=2;
     segno=-segno;
		  }
		while((potenza(z, n)/ fattoriale(n))>eps);
return appross;
}
/*Calcolo dell'approssimazione del coseno di (T*pigreco) tramite il polinomio interpolatore relativo agli (n0)+1 nodi
di Chebyshev associati all'intervallo [0,M_PI/2]:*/
double cosenochebyshev(double x,double a,double b,int n){
x*=M_PI; //per avere coseno(T*Pigreco)
double v[n+1],somma=0,elle_i;
nodichebyshev(a,b,n,v);
for(int i=0;i<=n;i++){
	elle_i=1;
	for(int j=0;j<=n;j++){
		if(j!=i) elle_i*=((x-v[j])/(v[i]-v[j]));//l(i)=prodotto per j=0,..,n con j!=i di (x-xj)/(xi-xj)
	}
 somma+=elle_i*cos(v[i]);
}
return somma;
}
//Calcolo degli (n0)+1 nodi di Chebyshev associati all'intervallo [0,M_PI/2]:
void nodichebyshev(double a,double b,int n,double v[]){
//n=n0+1 nodi
//x(i) (nodo chebyshev)=(a+b)/2 + (  (b-a)/2 * cos(M_PI*(2i+1)/(2n+2))  )
for(int i=0;i<=n;i++)
	v[i]=((a+b)*1./2)+(b-a)*1./2*cos(M_PI*((2*i+1)/(2*n+2)));
return;
}

5 Risposte

Devi accedere o registrarti per scrivere nel forum
5 risposte