Ciao ragazzi, di recente ho dovuto scrivere un codice per l'interpolazione con i metodi di Gregory-Newton, il codice l'ho testato con vari punti e funziona perfettamente, tuttavia non riesco a fare visualizzare le differenze “forward” e “backward” come vorrei io, nel codice che metterò qua sotto le differenze vengono visualizzate come una matrice triangolare superiore , tuttavia io vorrei visualizzarle come una vera e propria piramide, spero qualcuno possa aiutarmi :)
#include <stdio.h>
#include <math.h>
#define N 6 //Numero di punti che abbiamo a disposizione
#define eps 1.e-6
#define BOLD "\033[1m"
#define RESET_COLOR "\033[0m"
int fattoriale(int x){
int i;
int fatt=1;
for(i=1;i<=x;i++){
fatt*=i;
}
return fatt;
}
int m(int n){
int i;
int ris=0;;
for(i=1;i<n;i++){
ris+=(N-i);
}
return ris;
}
double forward(double x, int n){
int i;
double bin=1;
for(i=0;i<n;i++){
bin=bin*(x-i);
}
return bin;
}
double forward_difference(double F[],double f[], int n){
printf(BOLD"\nTABELLA DELLE DIFFERENZE FORWARD\n"RESET_COLOR);
int cont,k,i;
cont=1;
k=0;
do{
for(i=0;i<n-cont;i++){
f[k++]=F[i+1]-F[i];
F[i]=f[k-1];
printf("%lf\t",f[k-1]);
}
cont++;
printf("\n");
}
while(cont<n);
return f[n];
}
double forward_interpolation(double f[],double x[],double Fo,double Xo,double h,int n){
int i,j,k;
double diff,r,ris0,ris1;
r=(Xo-x[0])/h;
ris0=Fo;
j=n;
k=0;
printf(BOLD"\nCALCOLO INTERPOLAZIONE FORWARD\n"RESET_COLOR);
for(i=1;i<n;i++){
ris1=ris0+forward(r,i)/fattoriale(i)*f[k];
diff=fabs(ris1-ris0);
if(diff<eps)
break;
printf("Con il polinomio di grado %d f(%.2lf)=%lf\n",i,Xo,ris1);
ris0=ris1;
j--;
k=k+j;
}
return ris1;
}
double backward(double x, int n){
int i;
double bin=1;
for(i=0;i<n;i++){
bin=bin*(x+i);
}
return bin;
}
double backward_difference(double B[],double b[], int n){
printf(BOLD"\nTABELLA DELLE DIFFERENZE FORWARD\n"RESET_COLOR);
int cont,k,i;
cont=1;
k=0;
do{
for(i=0;i<n-cont;i++){
b[k++]=B[i+1]-B[i];
b[k-1]=-1*b[k-1];
B[i]=b[k-1];
printf("%lf\t",b[k-1]);
}
cont++;
printf("\n");
}
while(cont<n);
return b[n];
}
double backward_interpolation(double b[],double x[],double Bo,double Xo,double h,int n){
int i,j,k;
double diff,s,ris0,ris1;
s=(Xo-x[n-1])/h;
ris0=Bo;
j=n;
k=0;
printf(BOLD"\nCALCOLO INTERPOLAZIONE BACKWARD\n"RESET_COLOR);
for(i=1;i<n;i++){
ris1=ris0+(backward(s,i)/fattoriale(i))*b[k];
diff=fabs(ris1-ris0);
if(diff<eps)
break;
printf("Con il polinomio di grado %d f(%.2lf)=%lf\n",i,Xo,ris1);
ris0=ris1;
j--;
k=k+j;
}
return ris1;
}
int main (){
//DICHIARAZIONE VARIABILI
int i;
double f0, b0, X0, h, B[N];
double F[N]={0.47943,0.64422,0.78333,0.89121,0.96456,0.99749};
double X[N], f[m(N)], b[m(N)];
//CALCOLO DEGLI X(i);
X0=0.55; //Valore in cui si vuole interpolare
h=0.2; //Passo tra gli Xi
X[0]=0.5; //Valore iniziale degli Xi (Xo)
for(i=1;i<N;i++){
X[i]=X[i-1]+h;
}
//CALCOLO DEL VETTORE B[N] (INVERSO DI F[N])
for(i=0;i<N;i++){
B[i]=F[N-1-i];
}
f0=F[0];
b0=B[0];
//CALCOLO INTERPOLAZIONE FINALE
forward_difference(F,f,N);
backward_difference(B,b,N);
forward_interpolation(f,X,f0,X0,h,N);
backward_interpolation(b,X,b0,X0,h,N);
}