Advertisement
Guest User

Interpolate.java

a guest
Aug 19th, 2012
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.03 KB | None | 0 0
  1. import java.lang.Double;
  2. import java.lang.Integer;
  3. import java.util.List;
  4. import java.util.LinkedList;
  5. import java.util.Arrays;
  6. import java.math.BigDecimal;
  7. import java.lang.System;
  8.  
  9. public class Interpolate {
  10.     public static VetoSet[] interpVetoArray(VetoSet[] input, int power, int numPoints) {
  11.         VetoSet[] interpInput = new VetoSet[input.length];
  12.         for(int i = 0; i < input.length; i++)
  13.             interpInput[i] = interpVeto(input[i], power, numPoints);
  14.         return interpInput;
  15.     }
  16.    
  17.     public static VetoSet interpVeto(VetoSet input, int power, int numPoints) {
  18.         BigDecimal depth = input.getDepth();
  19.         Pair[] inputVP = input.getVetoPairs();
  20.         Pair[] outputVP = Interpolate.fixValues(inputVP, power, numPoints);
  21.         VetoSet result = new VetoSet(depth, outputVP);
  22.         return result;
  23.     }
  24.    
  25.     public static Pair[] fixValues(Pair[] data, int power, int numPoints) {
  26.         List<Pair> resultList = new LinkedList<Pair>();
  27.         double maxX = ((BigDecimal) Utility.maximum(Utility.unzipFst(data))).doubleValue();
  28.         double minX = ((BigDecimal) Utility.minimum(Utility.unzipFst(data))).doubleValue();
  29.         double increase = (maxX - minX) / numPoints;
  30.         BigDecimal first, second;
  31.         for(double i = minX; i < maxX; i += increase) {
  32.             first = new BigDecimal(i);
  33.             second = new BigDecimal(interpolate(data, BigDecimal.valueOf(i), power));
  34.             resultList.add(new Pair(first, second));
  35.         }
  36.         Pair[] result = new Pair[resultList.size()];
  37.         resultList.toArray(result);
  38.         return result;
  39.     }
  40.    
  41.     // Wrapper function for interpCore
  42.     public static Double interpolate(Pair[] data, BigDecimal x, int power) {
  43.         double[] dataX = new double[data.length];
  44.         double[] dataY = new double[data.length];
  45.         for(int i = 0; i < data.length; i++) {
  46.             dataX[i] = data[i].getFst().doubleValue();
  47.             dataY[i] = data[i].getSnd().doubleValue();
  48.         }
  49.         double input = x.doubleValue();
  50.         Double output = new Double(interpCore(dataX, dataY, input, power));
  51.         return output;
  52.     }
  53.    
  54.     private static double interpCore(double[] dataX, double[] dataY, double x, int power) {
  55.         int xIndex = 0;
  56.         while(xIndex < dataX.length - (1 + power + (dataX.length - 1) % power) && dataX[xIndex + power] < x) {
  57.             xIndex += power;
  58.         }
  59.  
  60.         double matrix[][] = new double[power + 1][power + 2];
  61.         for(int i = 0; i < power + 1; ++i) {
  62.             for(int j = 0; j < power; ++j)  {
  63.                 matrix[i][j] = Math.pow(dataX[xIndex + i], (power - j));
  64.             }
  65.             matrix[i][power] = 1;
  66.             matrix[i][power + 1] = dataY[xIndex + i];
  67.         }
  68.         double[] coefficients = lin_solve(matrix);
  69.         double answer = 0;
  70.         for(int i = 0; i < coefficients.length; ++i) {
  71.             answer += coefficients[i] * Math.pow(x, (power - i));
  72.         }
  73.         return answer;
  74.     }
  75.  
  76.     private static double[] lin_solve(double[][] matrix)
  77.     {
  78.         double[] results = new double[matrix.length];
  79.         int[] order = new int[matrix.length];
  80.         for(int i = 0; i < order.length; ++i) { order[i] = i; }
  81.         int maxIndex;
  82.         for(int i = 0; i < matrix.length; ++i) {
  83.             maxIndex = i;
  84.             for(int j = i + 1; j < matrix.length; ++j) {
  85.                 if(Math.abs(matrix[maxIndex][i]) < Math.abs(matrix[j][i])) { maxIndex = j; }
  86.             }
  87.             if(maxIndex != i) {
  88.                 {
  89.                     int temp = order[i];
  90.                     order[i] = order[maxIndex];
  91.                     order[maxIndex] = temp;
  92.                 }
  93.  
  94.                 for(int j = 0; j < matrix[0].length; ++j)
  95.                 {
  96.                     double temp = matrix[i][j];
  97.                     matrix[i][j] = matrix[maxIndex][j];
  98.                     matrix[maxIndex][j] = temp;
  99.                 }
  100.             }
  101.             if(Math.abs(matrix[i][i]) < 1e-15) {
  102.                 throw new RuntimeException("Singularity detected");
  103.             }
  104.             for(int j = i + 1; j < matrix.length; ++j) {
  105.                 double factor = matrix[j][i] / matrix[i][i];
  106.                 for(int k = i; k < matrix[0].length; ++k) {
  107.                     matrix[j][k] -= matrix[i][k] * factor;
  108.                 }
  109.             }
  110.         }
  111.         for (int i = matrix.length - 1; i >= 0; --i)
  112.         {
  113.             results[i] = matrix[i][matrix.length];
  114.             for (int j = i + 1; j < matrix.length; ++j) { results[i] -= results[j] * matrix[i][j]; }
  115.             results[i] /= matrix[i][i];
  116.         }
  117.         double[] correctResults = new double[results.length];
  118.         for (int i = 0; i < order.length; ++i) { correctResults[order[i]] = results[i]; }
  119.         return results;
  120.     }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement