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 ///////////////////////////////////////////////////////////////////////////////