// fit_data_file.java least square fit of data file // java -cp . fit_data_file vars order file_name // vars 1,2,3 or 4 number of independent variables // order < 100 for one variable // order < 33 for two variables // order < 10 for three variables // order < 5 for four variables import java.io.*; public class fit_data_file { int Apwr[] = new int[200]; // powers of each variable in a term int Bpwr[] = new int[200]; int Cpwr[] = new int[200]; int Dpwr[] = new int[200]; boolean first = true; // uses by data_set, fit, then check String data_file_name; FileReader handle; BufferedReader file_in; String input_line = new String(""); int found=0; int line=0; // input line count double tol = 1.0E-4; // minimum value of coefficient fit_data_file(int vars, int order, String file_name) { data_file_name=file_name; int n=order; // max depends on number of variables int mm=vars; // max 4 dimensions int nnn[] = new int[1]; // number of terms computed System.out.println("fit_data_file.java"); System.out.println("fit to "+n+" degree polynomial in "+mm+" variables"); if(mm==1) { gen_1d_powers(n, mm, nnn, Apwr); double A[][] = new double[nnn[0]][nnn[0]]; double C[] = new double[nnn[0]]; double Y[] = new double[nnn[0]]; fit_1d(n, mm, nnn, A, Y, C); check_1d(n, mm, nnn, C); } else if(mm==2) { gen_2d_powers(n, mm, nnn, Apwr, Bpwr); double A[][] = new double[nnn[0]][nnn[0]]; double C[] = new double[nnn[0]]; double Y[] = new double[nnn[0]]; fit_2d(n, mm, nnn, A, Y, C); check_2d(n, mm, nnn, C); } else if(mm==3) { gen_3d_powers(n, mm, nnn, Apwr, Bpwr, Cpwr); double A[][] = new double[nnn[0]][nnn[0]]; double C[] = new double[nnn[0]]; double Y[] = new double[nnn[0]]; fit_3d(n, mm, nnn, A, Y, C); check_3d(n, mm, nnn, C); } else if(mm==4) { if(n<1 || n>4) { System.out.println("order must be 1,2,3 or 4 to fit 4 variables"); System.exit(1); } gen_4d_powers(n, mm, nnn, Apwr, Bpwr, Cpwr, Dpwr); double A[][] = new double[nnn[0]][nnn[0]]; double C[] = new double[nnn[0]]; double Y[] = new double[nnn[0]]; fit_4d(n, mm, nnn, A, Y, C); check_4d(n, mm, nnn, C); } else { System.out.println("number of variables must be 1,2,3 or 4 to fit"); System.exit(1); } } // end fit_data_file void fit_1d(int n, int mm, int nnn[], double A[][], double Y[], double C[]) { int i, j, k, nn; double Av[] = new double[100]; // at least n double term_i, term_j; double au[] = new double[2]; boolean debug = false; nn = nnn[0]; for(i=0; itol) { System.out.println(C[i]+" * a^"+Apwr[i]); } } } // end fit_1d void fit_2d(int n, int mm, int nnn[], double A[][], double Y[], double C[]) { int i, j, k, nn; double Av[] = new double[33]; // at least n double Bv[] = new double[33]; // powers of variables double term_i, term_j; double abu[] = new double[3]; boolean debug = false; nn = nnn[0]; for(i=0; itol) { System.out.println(C[i]+" * a^"+Apwr[i]+" * b^"+Bpwr[i]); } } } // end fit_2d void fit_3d(int n, int mm, int nnn[], double A[][], double Y[], double C[]) { int i, j, k, nn; double Av[] = new double[20]; // at least n double Bv[] = new double[20]; // powers of variables double Cv[] = new double[20]; double term_i, term_j; double abcu[] = new double[4]; boolean debug = false; nn = nnn[0]; for(i=0; itol) { System.out.println(C[i]+" * a^"+Apwr[i]+" * b^"+Bpwr[i]+ " * c^"+Cpwr[i]); } } } // end fit_3d void fit_4d(int n, int mm, int nnn[], double A[][], double Y[], double C[]) { int i, j, k, nn; double Av[] = new double[10]; // at least n double Bv[] = new double[10]; // powers of variables double Cv[] = new double[10]; double Dv[] = new double[10]; double term_i, term_j; double abcdu[] = new double[5]; boolean debug = false; nn = nnn[0]; for(i=0; itol) { System.out.println(C[i]+" * a^"+Apwr[i]+" * b^"+Bpwr[i]+ " * c^"+Cpwr[i]+" * d^"+Dpwr[i]); } } } // end fit_4d void gen_1d_powers(int n, int mm, int nnn[], // only one value returned int a[]) { int i; /* need more, or generalize, for more variables */ if(mm != 1) System.out.println( "ERROR, this only good for 1 independent variable"); for(i=0; i<=n; i++) a[i]=i; nnn[0] = n+1; System.out.println("trying "+nnn[0]+" terms"); } // end gen_1d_powers void gen_2d_powers(int n, int mm, int nnn[], // only one value returned int a[], int b[]) { int i,j; /* need more, or generalize, for more variables */ int ii = 0; /* pointer to next available a[ii], b[ii] */ int nn=1; /* power being generated */ boolean debug = true; if(mm != 2) System.out.println( "ERROR, this only good for 2 independent variables"); a[0]=0; b[0]=0; if(debug) System.out.println("terms used to find fit"); if(debug) System.out.println("a^0 b^0 \n"); i=nn; j=0; while(nn<=n) /* n is highest sum of powers */ { ii++; a[ii] = i; b[ii] = j; System.out.println(ii+" a^"+a[ii]+" * b^"+b[ii]); if(i==0 && j==nn) /* increment nn, set i,j */ { nn++; i = nn; j = 0; if(debug) System.out.println(""); } else { i--; j++; } } nnn[0] = ii+1; System.out.println("trying "+nnn[0]+" terms"); } // end gen_2d_powers void gen_3d_powers(int n, int mm, int nnn[], // only one value returned int a[], int b[], int c[]) { int i,j,k; /* need more, or generalize, for more variables */ int ii = 0; /* pointer to next available a[ii], b[ii], c[ii] */ int nn=1; /* power being generated */ boolean debug = true; if(mm != 3) System.out.println( "ERROR, this only good for 3 independent variables"); a[0]=0; b[0]=0; c[0]=0; if(debug) System.out.println("terms used to find fit"); if(debug) System.out.println("a^0 b^0 c^0 \n"); i=nn; j=0; k=0; while(nn<=n) /* n is highest sum of powers */ { ii++; a[ii] = i; b[ii] = j; c[ii] = k; System.out.println(ii+" a^"+a[ii]+" * b^"+b[ii]+" * c^"+c[ii]); if(i==0 && j==0 && k==nn) /* increment nn, set i,j,k */ { nn++; i = nn; j = 0; k = 0; if(debug) System.out.println(""); } else if(i==nn) { i--; j=1; /* k should be zero */ } else if(j==nn) { j--; /* i should be zero */ k=1; } else if(j>0) { j--; k++; } else if(j==0) { i--; j=nn-i; k=0; } } nnn[0] = ii+1; System.out.println("trying "+nnn[0]+" terms"); } // end gen_3d_powers void gen_4d_powers(int n, int mm, int nnn[], // only one value returned int a[], int b[], int c[], int d[]) { // n=highest sum of powers, maximum 4 here. // mm=number of independent variables, maximum 4 for 4 variables. // nnn= number of coefficients, returned int pwrs44ix[]={0,1,5,15,34,66}; // start of each order int pwrs4[][]={{0,0,0,0},{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}, {2,0,0,0},{1,1,0,0},{1,0,1,0},{1,0,0,1},{0,2,0,0}, {0,1,1,0},{0,1,0,1},{0,0,2,0},{0,0,1,1},{0,0,0,2}, {3,0,0,0},{2,1,0,0},{2,0,1,0},{2,0,0,1},{1,2,0,0}, {1,1,1,0},{1,1,0,1},{1,0,2,0},{1,0,1,1},{1,0,0,2}, {0,3,0,0},{0,2,1,0},{0,2,0,1},{0,1,2,0},{0,1,1,1}, {0,0,3,0},{0,0,2,1},{0,0,1,2},{0,0,0,3},{4,0,0,0}, {3,1,0,0},{3,0,1,0},{3,0,0,1},{2,2,0,0},{2,1,1,0}, {2,1,0,1},{2,0,2,0},{2,0,1,1},{2,0,0,2},{1,3,0,0}, {1,2,1,0},{1,2,0,1},{1,0,3,0},{1,0,2,1},{1,0,1,2}, {1,0,0,3},{0,4,0,0},{0,3,1,0},{0,3,0,1},{0,2,2,0}, {0,2,1,1},{0,2,0,2},{0,1,3,0},{0,1,2,1},{0,1,1,2}, {0,1,0,3},{0,0,4,0},{0,0,3,1},{0,0,2,2},{0,0,1,3}, {0,0,0,4}}; if(mm != 4) System.out.println( "ERROR, this only good for mm=4 independent variables"); System.out.println("terms used to find fit "); for(int i=0; i<=n; i++) // power requested { for(int ii=pwrs44ix[i]; iiamax) amax=a1; if(a1umax) umax=u1; if(u1tol) { ua = ua + Av[Apwr[i]] * C[i]; } } diff = Math.abs(u1-ua); if(debug) System.out.println("sample="+k+", u_fit="+ua+", u_data="+u1+ ", diff="+(u1-ua)); if(diff>maxe) maxe=diff; sum = sum + diff; sumsq = sumsq + diff*diff; if(debug) // compare to all terms { ua = 0.0; for(i=0; iamax) amax=a1; if(a1bmax) bmax=b1; if(b1umax) umax=u1; if(u1amax) amax=a1; if(a1bmax) bmax=b1; if(b1cmax) cmax=c1; if(c1umax) umax=u1; if(u1maxe) maxe=diff; sum = sum + diff; sumsq = sumsq + diff*diff; k++; } System.out.println("check_3d k="+k+", amin="+amin+", amax="+amax+ ", bmin="+bmin+", bmax="+bmax); System.out.println(" cmin="+cmin+", cmax="+cmax+ ", umin="+umin+", umax="+umax); max_err = maxe; avg_err = sum/(double)k; rms_err = Math.sqrt(sumsq/(double)k); System.out.println("rms_err="+rms_err+", avg_err="+avg_err+ ", max_err="+max_err); System.out.println(" "); } // end check_3d void check_4d(int n, int mm, int nnn[], double C[]) { double a1, b1, c1, d1, u1, ua, diff; double sumsq = 0.0; double sum = 0.0; double rms_err; double avg_err; double max_err; double maxe = 0.0; double amin=0.0, amax=0.0, bmin=0.0, bmax=0.0, cmin=0.0; double cmax=0.0, dmin=0.0, dmax=0.0, umin=0.0, umax=0.0; double Av[] = new double[10]; // at least n double Bv[] = new double[10]; // powers of variables double Cv[] = new double[10]; double Dv[] = new double[10]; int i, k; int nn = nnn[0]; double abcdu[] = new double[5]; k = 0; while(data_set4d(abcdu)==1) { a1=abcdu[0]; b1=abcdu[1]; c1=abcdu[2]; d1=abcdu[3]; u1=abcdu[4]; Av[0] = 1.0; Bv[0] = 1.0; Cv[0] = 1.0; Dv[0] = 1.0; for(i=1; i<=n; i++) { Av[i] = Av[i-1]*a1; Bv[i] = Bv[i-1]*b1; Cv[i] = Cv[i-1]*c1; Dv[i] = Dv[i-1]*d1; } if(k==0) { amin=a1; amax=a1; bmin=b1; bmax=b1; cmin=c1; cmax=c1; dmin=c1; dmax=c1; umin=u1; umax=u1; } if(a1>amax) amax=a1; if(a1bmax) bmax=b1; if(b1cmax) cmax=c1; if(c1dmax) dmax=d1; if(d1umax) umax=u1; if(u1maxe) maxe=diff; sum = sum + diff; sumsq = sumsq + diff*diff; k++; } System.out.println("check_4d k="+k+", amin="+amin+", amax="+amax+ ", bmin="+bmin+", bmax="+bmax); System.out.println(" cmin="+cmin+", cmax="+cmax+", dmin="+dmin+ ", dmax="+dmax+", umin="+umin+", umax="+umax); max_err = maxe; avg_err = sum/(double)k; rms_err = Math.sqrt(sumsq/(double)k); System.out.println("rms_err="+rms_err+", avg_err="+avg_err+ ", max_err="+max_err); System.out.println(" "); } // end check_4d void simeq(final double A[][], final double Y[], double X[]) { // solve real linear equations for X where Y = A * X // method: Gauss-Jordan elimination using maximum pivot // usage: simeq(A,Y,X); // Translated to java by : Jon Squire , 26 March 2003 // First written by Jon Squire December 1959 for IBM 650, translated to // other languages e.g. Fortran converted to Ada converted to C // then converted to java int n=A.length; int m=n+1; double B[][]=new double[n][m]; // working matrix int row[]=new int[n]; // row interchange indicies int hold , I_pivot; // pivot indicies double pivot; // pivot element value double abs_pivot; if(A[0].length!=n || Y.length!=n || X.length!=n) { System.out.println("Error in Matrix.solve, inconsistent array sizes."); } // build working data structure for(int i=0; i abs_pivot) { I_pivot = i; pivot = B[row[i]][k]; abs_pivot = Math.abs(pivot); } } // have pivot, interchange row indicies hold = row[k]; row[k] = row[I_pivot]; row[I_pivot] = hold; // check for near singular if(abs_pivot < 1.0E-10) { for(int j=k+1; j