View Javadoc
1   /*
2    * Copyright (C) 2015 Alberto Irurueta Carro (alberto@irurueta.com)
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *         http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package com.irurueta.numerical.fitting;
17  
18  import com.irurueta.algebra.Matrix;
19  
20  import java.util.Arrays;
21  
22  /**
23   * Base class to fit a multi dimension function y = f(x1, x2, ...) by using
24   * provided data (x, y)
25   */
26  public abstract class MultiDimensionFitter extends Fitter {
27      /**
28       * Input points x where a multidimensional function f(x1, x2, ...) is
29       * evaluated where each column of the matrix represents each dimension of
30       * the point and each row is related to each sample corresponding to
31       * provided y pairs of values
32       */
33      protected Matrix x;
34  
35      /**
36       * Result of evaluation of multidimensional function f(x1, x2, ...)
37       * at provided x points. This is provided as input data along x array
38       */
39      protected double[] y;
40  
41      /**
42       * Standard deviations of each pair of points (x, y).
43       */
44      protected double[] sig;
45  
46      /**
47       * Number of samples (x, y) in provided input data
48       */
49      protected int ndat;
50  
51      /**
52       * Estimated parameters of linear single dimensional function
53       */
54      protected double[] a;
55  
56      /**
57       * Covariance of estimated parameters of linear single dimensional function
58       */
59      protected Matrix covar;
60  
61      /**
62       * Estimated chi square value of input data
63       */
64      protected double chisq;
65  
66      /**
67       * Constructor
68       */
69      protected MultiDimensionFitter() {
70      }
71  
72      /**
73       * Constructor
74       *
75       * @param x   input points x where a multidimensional function f(x1, x2, ...)
76       *            is evaluated
77       * @param y   result of evaluation of multidimensional function
78       *            f(x1, x2, ...) at provided x points
79       * @param sig standard deviations of each pair of points (x, y)
80       * @throws IllegalArgumentException if provided matrix rows and arrays
81       *                                  don't have the same length
82       */
83      protected MultiDimensionFitter(final Matrix x, final double[] y, final double[] sig) {
84          setInputData(x, y, sig);
85      }
86  
87      /**
88       * Constructor
89       *
90       * @param x   input points x where a multidimensional function f(x1, x2, ...)
91       *            is evaluated
92       * @param y   result of evaluation of linear multidimensional function
93       *            f(x1, x2, ...) at provided x points
94       * @param sig standard deviation of all pair of points assuming that
95       *            standard deviations are constant
96       * @throws IllegalArgumentException if provided matrix rows and arrays
97       *                                  don't have the same length
98       */
99      protected MultiDimensionFitter(final Matrix x, final double[] y, final double sig) {
100         setInputData(x, y, sig);
101     }
102 
103     /**
104      * Returns input points x where a multidimensional function f(x1, x2, ...)
105      * is evaluated and where each column of the matrix represents
106      * each dimension of the point and each row is related to each sample
107      * corresponding to provided y pairs of values
108      *
109      * @return input point x
110      */
111     public Matrix getX() {
112         return x;
113     }
114 
115     /**
116      * Returns result of evaluation of multidimensional function f(x)
117      * at provided x points. This is provided as input data along with x array
118      *
119      * @return result of evaluation
120      */
121     public double[] getY() {
122         return y;
123     }
124 
125     /**
126      * Returns standard deviations of each pair of points (x,y).
127      *
128      * @return standard deviations of each pair of points (x,y)
129      */
130     public double[] getSig() {
131         return sig;
132     }
133 
134     /**
135      * Sets required input data to start function fitting
136      *
137      * @param x   input points x where a multidimensional function f(x1, x2, ...)
138      *            is evaluated and where each column of the matrix represents each
139      *            dimension of the point and each row is related to each sample
140      *            corresponding to provided y pairs of values
141      * @param y   result of evaluation of multidimensional function
142      *            f(x1, x2, ...) at provided x points. This is provided as input data along
143      *            with x array
144      * @param sig standard deviations of each pair of points (x,y)
145      * @throws IllegalArgumentException if provided arrays don't have the same
146      *                                  size
147      */
148     public final void setInputData(final Matrix x, final double[] y, final double[] sig) {
149         if (x.getRows() != y.length || sig.length != y.length) {
150             throw new IllegalArgumentException();
151         }
152 
153         this.x = x;
154         this.y = y;
155         this.sig = sig;
156 
157         ndat = y.length;
158     }
159 
160     /**
161      * Sets required input data to start function fitting and assuming constant
162      * standard deviation errors in input data
163      *
164      * @param x   input points x where a multidimensional function f(x1, x2, ...)
165      *            is evaluated and where each column of the matrix represents each
166      *            dimension of the point and each row is related to each sample
167      *            corresponding to provided y pairs of values
168      * @param y   result of evaluation of multidimensional function
169      *            f(x1, x2, ...) at provided x points. This is provided as input data along
170      *            with x array
171      * @param sig standard deviation of all pair of points assuming that
172      *            standard deviations are constant
173      * @throws IllegalArgumentException if provided arrays don't have the same
174      *                                  size
175      */
176     public final void setInputData(final Matrix x, final double[] y, final double sig) {
177         if (x.getRows() != y.length) {
178             throw new IllegalArgumentException();
179         }
180 
181         this.x = x;
182         this.y = y;
183 
184         this.sig = new double[y.length];
185         Arrays.fill(this.sig, sig);
186 
187         ndat = y.length;
188     }
189 
190     /**
191      * Returns estimated parameters of linear single dimensional function
192      *
193      * @return estimated parameters
194      */
195     public double[] getA() {
196         return a;
197     }
198 
199     /**
200      * Returns covariance of estimated parameters of linear single dimensional
201      * function
202      *
203      * @return covariance of estimated parameters
204      */
205     public Matrix getCovar() {
206         return covar;
207     }
208 
209     /**
210      * Returns estimated chi square value of input data
211      *
212      * @return estimated chi square value of input data
213      */
214     public double getChisq() {
215         return chisq;
216     }
217 }