"Errore" visualizzazione output

di il
6 risposte

"Errore" visualizzazione output

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);
}

6 Risposte

  • Re: "Errore" visualizzazione output

    Non si capisce, che vuol dire visualizzare una piramide??

  • Re: "Errore" visualizzazione output

    Non si capisce bene come ha detto Oregon, ma se devi mettere i risultati graficamente a “triangolo”, dovrai prepararti N righe usando la sprintf() e poi fare il padding di spazi a sinistra e a destra, fino ad arrivare a una lunghezza predefinita uguale per tutte le righe 

  • Re: "Errore" visualizzazione output

    08/01/2024 - oregon ha scritto:


    Non si capisce, che vuol dire visualizzare una piramide??

    al momento si visualizzano cosi : 

    12345

    1234

    123

    12

    1

    io vorrei farle visualizzare cosi: 

    1

       1

    2    1

       2    1

    3    2    1

       3    2

    4    3

       4

    5

    quindi fare diventare la 1° riga la 1° colonna, la 2° riga la 2° colonna e cosi via…

  • Re: "Errore" visualizzazione output

    Per farlo devi avere tutti i dati a disposizione.

    Quindi non devi visualizzarli man mano che li ottieni ma li devi memorizzare in una matrice con opportune righe/colonne, nelle corrette posizioni e, alla fine, usare la matrice per visualizzare i dati come ti servono.

  • Re: "Errore" visualizzazione output

    Ma se il punto è stampare in un certo modo dei valori contenuti in alcuni array, perché non facilitare il compito a chi vuole aiutarti estrapolando dal programma generale il problema specifico e ponendolo nel modo più semplice e immediato possibile!?

    Ovviamente questo è solo il mio punto di vista, ma penso che un approccio del genere possa aumentare le probabilità di avere delle risposte.

  • Re: "Errore" visualizzazione output

    Concordo con @Nippolo ma non sempre chi chiede aiuto sa come farlo

Devi accedere o registrarti per scrivere nel forum
6 risposte