I had to write a program to calculate the Lagrange polynomial of the maddening degree of function: \$\log(x+1)+\cos(x-1)\$
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define GRADE 6
/* Funzione per costruire la successione dei nodi (xi,yi) dei punti di valutazione*/
void nodeSuccession(double* xNode, double* yNode, double* xVal){
int i;
printf("xNode [");
for(i = 0; i < GRADE + 1; i++){
xNode[i] = i; /* Array contenete le ascisse dei nodi */
printf("%.4f, ", xNode[i]);
yNode[i] = 0; /* Array contenete le ordinate dei nodi */
}
printf("\b\b]\n");
printf("yNode [");
for(i = 0; i < GRADE + 1; i++){
yNode[i] = (log(xNode[i] + 1)) + cos(xNode[i] - 1);
printf("%.4f, ", yNode[i]);
}
printf("\b\b]\n");
printf("xVal [");
for(i = 0; i < GRADE; i++){
xVal[i] = (xNode[i] + xNode[i+1]) / 2;
printf("%.4f, ", xVal[i]);
}
printf("\b\b]\n");
}
/* Funzione per costruire il polinomio di lagrange e lo valuto nei punti */
double* polynomial(double *xVal, double *xNode, double *yNode){
int i, j, k;
double pr, *sum = malloc(GRADE * sizeof(double));
for(j = 0; j < GRADE; j++){
sum[j] = 0;
for(k = 0; k < GRADE + 1; k++){
pr = 1;
for(i = 0; i < GRADE + 1; i++){
if(k != i)
pr = pr * ((xVal[j] - xNode[i])/(xNode[k] - xNode[i]));
}
sum[j] = sum[j] + yNode[k] * pr;
}
}
return sum;
}
/* Funzione per la valutazione dell'errore di interpolazione */
double* error(double *xVal, double *sum){
int i;
double *err = malloc(GRADE * sizeof(double));
for(i = 0; i < GRADE; i++)
err[i] = fabs(((log(xVal[i] + 1)) + cos(xVal[i] - 1)) - sum[i]);
return err;
}
int main(void){
int i;
double xNode[GRADE + 1], xVal[GRADE], yNode[GRADE + 1];
double *poly = malloc(GRADE * sizeof(double)), *err = malloc(GRADE * sizeof(double));
system("clear");
printf("\n===== PROGRAMMA PER IL CALCOLO DEL POLINOMIO DI LAGRANGE =====\n\n");
nodeSuccession(xNode, yNode, xVal);
poly = polynomial(xVal, xNode, yNode);
printf("\npoly [");
for(i = 0; i < GRADE; i++)
printf("%.4f, ", poly[i]);
printf("\b\b]\n");
err = error(xVal, poly);
printf("err [");
for(i = 0; i < GRADE; i++)
printf("%.4f, ", err[i]);
printf("\b\b]\n");
free(poly);
free(err);
return 0;
}