// LagrangeFit.java // // 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 import java.awt.*; import java.awt.event.*; import java.text.*; class LagrangeFit extends Frame { LagrangeFit() { setTitle("LagrangeFit(x) 0 to 2 of e^x"); setSize(450,500); setBackground(Color.white); setForeground(Color.black); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setVisible(true); } double f(double x) // "exact" function e^x { return Math.exp(x); } void L(int n, int j, double p[]) // Lagrange polynomial generation { double termx, termc, h; double q[] = new double[20]; // working polynomial coefficients System.out.println("computing terms of L_"+n+","+j); h = 1.0/(double)n; p[0] = 1.0; // identity polynomial to start product for(int i=1; i<=n; i++) p[i] = 0.0; for(int i=0; i<=n; i++) { if(i!=j) { termx = 1.0/((j-i)*h); // (x )/(x_j-x_i) termc = -h*i*termx; // ( -x_i)/(x_j-x_i) // do product p[] * (termx * x + termc) for(int k=0; k<=n; k++) q[k] = p[k] * termc; for(int k=1; k<=n; k++) q[k] = q[k] + p[k-1]*termx; for(int k=0; k<=n; k++) p[k] = q[k]; } } // print L_n,j(x) = p[...] System.out.println("L_"+n+","+j+"(x) = "+p[0]+" x^0 + "); for(int i=1; i<=n; i++) System.out.println(" "+p[i]+" x^"+i+" + "); System.out.println(" "); } public void paint(Graphics g) { // set up function to be approximated final int n=100; // number of samples for plotting final double nf=(double)n; double fx[] = new double[n]; // f(x) double ax[] = new double[n]; // approximation(x) final double xmin=0.0; final double xmax=2.0; double ymin=1.0; // for automatic scaling some day double ymax=7.0; double dx; // x step increment double xstart; // initial value double x; // stepped value xmin to xmax xstart=xmin; dx = (xmax-xmin)/(double)n; // do NOT use x=x+dx, very inaccurate! for(int i=0; i