Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: jmat/function/DoubleFunctionInterpolation.java


1   package jmat.function;
2   
3   import jmat.data.Matrix;
4   
5   
6   /**
7    * DOCUMENT ME!
8    *
9    * @author $author$
10   * @version $Revision: 1.2 $
11   */
12  public class DoubleFunctionInterpolation extends DoubleFunction
13  {
14      //~ Instance fields ////////////////////////////////////////////////////////
15  
16      //private int argNumber;
17      private double[][] X;
18      private double[] Y;
19  
20      //~ Constructors ///////////////////////////////////////////////////////////
21  
22      public DoubleFunctionInterpolation(double[][] in, double[] out)
23      {
24          if (in.length != out.length)
25          {
26              throw new IllegalArgumentException(
27                  "p1 = double[points][coordinates] and p2 = double[points]");
28          }
29  
30          argNumber = in[0].length;
31          X = in;
32          Y = out;
33      }
34  
35      //~ Methods ////////////////////////////////////////////////////////////////
36  
37      public double eval(double[] values)
38      {
39          checkArgNumber(values.length);
40  
41          return interpolate(values);
42      }
43  
44      public double eval(double value)
45      {
46          checkArgNumber(1);
47  
48          double[] values = new double[1];
49          values[0] = value;
50  
51          return interpolate(values);
52      }
53  
54      private int[] closest(double[] x, int num)
55      {
56          double[] d = new double[X.length];
57  
58          for (int i = 0; i < d.length; i++)
59          {
60              d[i] = dist(x, X[i]);
61          }
62  
63          int[] c = new int[num];
64          double dMin;
65  
66          for (int j = 0; j < num; j++)
67          {
68              dMin = Double.MAX_VALUE;
69  
70              for (int i = 0; i < X.length; i++)
71              {
72                  if ((d[i] < dMin))
73                  {
74                      dMin = d[i];
75                      c[j] = i;
76                  }
77              }
78  
79              d[c[j]] = Double.MAX_VALUE;
80          }
81  
82          return c;
83      }
84  
85      private double dist(double[] x, double[] y)
86      {
87          double d = 0;
88  
89          for (int i = 0; i < x.length; i++)
90          {
91              d = d + ((x[i] - y[i]) * (x[i] - y[i]));
92          }
93  
94          return d /*)*/;
95      }
96  
97      private double interpolate(double[] x)
98      {
99          int[] close = closest(x, argNumber + 1);
100         Matrix M_X = new Matrix(X).getRows(close).transpose();
101         Matrix M_Y = new Matrix(Y, Y.length).getRows(close);
102         Matrix M_x = new Matrix(x, x.length);
103 
104         Matrix A = new Matrix(1, argNumber + 1, 1).merge(M_X);
105         Matrix B = new Matrix(1, 1, 1).merge(M_x);
106         Matrix W = A.solve(B);
107         Matrix y = W.transpose().times(M_Y);
108 
109         return y.get(0, 0);
110     }
111 }
112 ///////////////////////////////////////////////////////////////////////////////
113 //  END OF FILE.
114 ///////////////////////////////////////////////////////////////////////////////