Advertisement
chenyunchen

Numerical Analysis - hw#2

Jul 26th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.02 KB | None | 0 0
  1. import java.io.FileNotFoundException;
  2. import java.io.FileReader;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.util.*;
  6.  
  7. public class hw {
  8.   static ArrayList<Double> r = new ArrayList<Double>();
  9.     public static void main(String[] args) throws IOException {
  10.         prepare();
  11.     }
  12.  
  13.     public static double error (double[] a,ArrayList<Double> dataX, ArrayList<Double> dataY){
  14.         int m = a.length-1;
  15.         int n = dataX.size();
  16.         double sum = 0;
  17.         for (int i=0; i<n; i++){
  18.             double delta = dataY.get(i) - p(a,dataX.get(i));
  19.             sum += Math.pow(delta,2);
  20.         }
  21.         sum =sum/(n+m-1);
  22.         return sum;
  23.     }
  24.  
  25.     public static double p(double[] a, double x){
  26.         int n =a.length;
  27.         double sum =0;
  28.         double xe = 1;
  29.         for(int i=0; i<n; i++){
  30.             sum += a[i]*xe;
  31.             xe *= x;
  32.         }
  33.         return sum;
  34.     }
  35.  
  36.     public static double[] elimination(double[][] A, double[] b) {
  37.         int n = A.length;
  38.         for (int k = 0; k < n; k++) {
  39.             for (int i = k + 1; i < n; i++) {
  40.                 double ch = A[i][k] / A[k][k];
  41.                 for (int j = k; j < n; j++)
  42.                     A[i][j] -= ch * A[k][j];
  43.                 b[i] -= ch * b[k];
  44.             }
  45.         }
  46.  
  47.         double[] x = new double[n];
  48.         for (int i = n - 1; i >= 0; i--) {
  49.             double sum = 0;
  50.             for (int j = i + 1; j < n; j++) {
  51.                 sum += A[i][j] * x[j];
  52.             }
  53.             x[i] = (b[i] - sum) / A[i][i];
  54.         }
  55.         return x;
  56.     }
  57.  
  58.     public static void prepare() throws IOException {
  59.         FileReader file = new FileReader("Data.txt");
  60.         FileWriter fileRead = new FileWriter("result.txt");
  61.         FileWriter fileFunc = new FileWriter("bestFun.txt");
  62.         Scanner in = new Scanner(file);
  63.         String f = in.nextLine();
  64.         ArrayList<Double> x = new ArrayList<Double>();
  65.         ArrayList<Double> y = new ArrayList<Double>();
  66.         while (in.hasNext()) {
  67.             x.add(in.nextDouble());
  68.             y.add(in.nextDouble());
  69.         }
  70.  
  71.         double[] xn = new double[x.size()];
  72.         double[] yn = new double[y.size()];
  73.         for (int i = 0; i < x.size(); i++) {
  74.             xn[i] = x.get(i);
  75.             yn[i] = y.get(i);
  76.         }
  77.  
  78.     for (double s = 0.72; s < 12.1339; s += 0.05){
  79.       System.out.println(lagrangeFormula(s, xn, yn));
  80.     }
  81.         for (double s = 0.72; s < 12.1339; s += 0.0001){
  82.             double result =dividedDifference(s, xn, yn);
  83.             r.add(result);
  84.             System.out.println(s+" "+result);
  85.             fileRead.write(s+" "+result+"\r\n");
  86.             fileRead.flush();
  87.         }
  88.  
  89.         int m=1;
  90.         double[] a =leastSquare(x, y ,m);
  91.         double minErr =error(a,x,y);
  92.         m++;
  93.         do{
  94.             double[] curA =leastSquare(x,y,m);
  95.             double curErr =error(curA, x, y);
  96.             System.out.println("degree: "+ (m-1) + ", error: " + curErr);
  97.             if(minErr > 2* curErr || minErr>0.1){
  98.                 minErr =curErr;
  99.                 a =curA;
  100.                 m++;
  101.             }
  102.             else
  103.                 break;
  104.         }while(m<50);
  105.  
  106.         System.out.print("best function\n");
  107.         fileFunc.write("best function\r\n");
  108.         fileFuncOut.flush();
  109.         for (int i = a.length-1; i>=0; i--) {
  110.             System.out.printf("x^%s: %.15f\n",i,a[i]);
  111.             fileFunc.write(String.format("x^%s: %.15f\r\n",i,a[i]));
  112.             fileFunc.flush();
  113.         }
  114.  
  115.     }
  116.  
  117.     public static double lagrangeFormula(double x, double[] xnext, double[] ynext) {
  118.         int n = xnext.length;
  119.         double[] xntern = new double[n];
  120.         for (int i = 0; i <= n - 1; i++) {
  121.             double upper = 1;
  122.             double lower = 1;
  123.             // upper
  124.             for (int j = 0; j <= n - 1; j++) {
  125.                 if (i != j)
  126.                     upper *= (x - xnext[j]);
  127.             }
  128.             // lower
  129.             for (int j = 0; j <= n - 1; j++) {
  130.                 if (i != j)
  131.                     lower *= (xnext[i] - xnext[j]);
  132.             }
  133.             xntern[i] = ynext[i] * upper / lower;
  134.         }
  135.  
  136.         double sum = 0;
  137.         for (int i = 0; i <= n - 1; i++)
  138.             sum += xntern[i];
  139.  
  140.         return sum;
  141.     }
  142.  
  143.     public static double dividedDifference(double x, double[] xnext, double[] ynext) {
  144.         int n = xnext.length;
  145.         double m[][] = new double[n][n];
  146.  
  147.         for (int i = 0; i < n; i++)
  148.             m[i][0] = ynext[i];
  149.  
  150.         for (int j = 1; j < n; j++) {
  151.             for (int i = 0; i < n - j; i++)
  152.                 m[i][j] = (m[i + 1][j - 1] - m[i][j - 1]) / (xnext[i + j] - xnext[i]);
  153.         }
  154.  
  155.         double sum = 0;
  156.         for (int i = n - 1; i > 0; i--) {
  157.             sum = sum + m[0][i];
  158.             sum = sum * (x - xnext[i - 1]);
  159.         }
  160.         sum += m[0][0];
  161.  
  162.         return sum;
  163.  
  164.     }
  165.  
  166.     public static double[] leastSquare(ArrayList<Double> dataX, ArrayList<Double> dataY, int m) {
  167.  
  168.         ArrayList<Double> x = new ArrayList<Double>();
  169.         ArrayList<Double> y = new ArrayList<Double>();
  170.         for (int i = 0; i < 2*m + 1; i++){
  171.             x.add(0.0);
  172.         }
  173.  
  174.         for (int i = 0; i < m + 1; i++){
  175.             y.add(0.0);
  176.         }
  177.  
  178.  
  179.         for (int i = 0; i < dataX.size(); i++) {
  180.             double xe = 1.0;
  181.             double ye = dataY.get(i);
  182.             double curX = dataX.get(i);
  183.             double temp;
  184.             temp = x.get(0);
  185.             x.set(0, temp + xe);
  186.             temp = y.get(0);
  187.             y.set(0, temp + ye);
  188.  
  189.             for (int j = 1; j < m*2+1; j++) {
  190.                 xe *= curX;
  191.                 ye *= curX;
  192.                 if(j < m+1){
  193.                     temp = y.get(j);
  194.                     y.set(j, temp + ye);
  195.                 }
  196.                 temp = x.get(j);
  197.                 x.set(j, temp + xe);
  198.             }
  199.         }
  200.  
  201.         double[][] matrix =new double[m+1][m+1];
  202.         double[] constant  =new double[m+1];
  203.         for (int i = 0; i < m+1; i++) {
  204.             for (int j = i; j < i+m+1; j++){
  205.                 matrix[i][j-i] = x.get(j);
  206.             }
  207.             constant[i] = y.get(i);
  208.         }
  209.         double[] a = elimination(matrix, constant);
  210.         return a;
  211.     }
  212.  
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement