/* lagrange.c simple definition and build * L_n,j(x) = product i=0,n i!=j (x-x_i)/(x_j-x_i) * let 0 < x < 1 for points x_0, x_1, ... , x_n * let h = x_i - x_i-1, x_i = i * h, h = 1/n * L_n(x) = sum j=0,n f(x_j) L_n,j(x) * This L_n(x) fits f(x) with a n th order polynomial * * generate L_n,j(x) for n=1,6 j=0,n */ #include #include #undef max #define max(a,b) ((a)>(b)?(a):(b)) #undef min #define min(a,b) ((a)<(b)?(a):(b)) #undef abs #define abs(a) ((a)<0.0?(-(a)):(a)) int main(int argc, char *argv[]) { int N = 6; int i, j, k, n, m; double h, termx, termc; double p[20]; /* coefficients of polynomial */ double q[20]; /* temp */ double L[20]; /* accumulate fit of e^x */ double x, fit, err, maxerr, rmserr; printf("lagrange.c running on 00; i--) fit = (L[i]+fit)*x; fit = fit + L[0]; err = fit - exp(x); maxerr = max(maxerr, abs(err)); rmserr = rmserr + err*err; printf("check exp(%g)=%g, fit=%g, err=%g \n", x, exp(x), fit, err); } rmserr = sqrt(rmserr/(double)(m+1)); printf("maxerr=%g, rmserr=%g \n", maxerr, rmserr); /* repeat generation of L_6,* and fit e^x 00; i--) fit = (L[i]+fit)*x; fit = fit + L[0]; err = fit - exp(x); maxerr = max(maxerr, abs(err)); rmserr = rmserr + err*err; printf("check exp(%g)=%g, fit=%g, err=%g \n", x, exp(x), fit, err); } rmserr = sqrt(rmserr/(double)(m+1)); printf("maxerr=%g, rmserr=%g \n", maxerr, rmserr); printf("\n end lagrange.c \n"); return 0; } /* end lagrange.c */