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 variate function [y1, y2, ...] = f([x1, x2, ...]) 24 * by using provided data (x, y). 25 */ 26 public abstract class MultiVariateFitter 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 multi variate function f(x1, x2, ...) at 37 * provided x points. 38 * Each row contains the function evaluation for a given point x, and 39 * each column contains values for each output variable f1, f2, ... 40 */ 41 protected Matrix y; 42 43 /** 44 * Standard deviations of each pair of points (x, y). 45 */ 46 protected double[] sig; 47 48 /** 49 * Number of samples (x, y) in provided input data. 50 */ 51 protected int ndat; 52 53 /** 54 * Estimated parameters of linear single dimensional function. 55 */ 56 protected double[] a; 57 58 /** 59 * Covariance of estimated parameters of linear single dimensional function. 60 */ 61 protected Matrix covar; 62 63 /** 64 * Estimated chi square value of input data. 65 */ 66 protected double chisq; 67 68 /** 69 * Constructor. 70 */ 71 protected MultiVariateFitter() { 72 } 73 74 /** 75 * Constructor. 76 * 77 * @param x input points x where a multi variate function f(x1, x2, ...) is 78 * evaluated. 79 * @param y result of evaluation of multi variate function f(x1, x2, ...) at 80 * provided x points. 81 * @param sig standard deviations of each pair of points (x, y). 82 * @throws IllegalArgumentException if provided matrix rows and arrays don't 83 * have the same length. 84 */ 85 protected MultiVariateFitter(final Matrix x, final Matrix y, final double[] sig) { 86 setInputData(x, y, sig); 87 } 88 89 /** 90 * Constructor. 91 * 92 * @param x input points x where a multi variate function f(x1, x2, ...) is 93 * evaluated. 94 * @param y result of evaluation of multi variate function f(x1, x2, ...) at 95 * provided x points. 96 * @param sig standard deviation of all pair of points assuming that 97 * standard deviations are constant. 98 * @throws IllegalArgumentException if provided matrix rows and arrays don't 99 * have the same length. 100 */ 101 protected MultiVariateFitter(final Matrix x, final Matrix y, final double sig) { 102 setInputData(x, y, sig); 103 } 104 105 /** 106 * Returns input points x where a multi variate function f(x1, x2, ...) 107 * is evaluated and where each column of the matrix represents 108 * each dimension of the point and each row is related to each sample 109 * corresponding to provided y pairs of values. 110 * 111 * @return input point x. 112 */ 113 public Matrix getX() { 114 return x; 115 } 116 117 /** 118 * Returns result of evaluation of multi variate function f(x) at provided 119 * x points. This is provided as input data along with x array. 120 * 121 * @return result of evaluation. 122 */ 123 public Matrix getY() { 124 return y; 125 } 126 127 /** 128 * Returns standard deviations of each pair of points (x,y). 129 * 130 * @return standard deviations of each pair of points (x,y). 131 */ 132 public double[] getSig() { 133 return sig; 134 } 135 136 /** 137 * Sets required input data to start function fitting. 138 * 139 * @param x input points x where a multi variate function f(x1, x2, ...) 140 * is evaluated and where each column of the matrix represents each 141 * dimension of the point and each row is related to each sample 142 * corresponding to provided y pairs of values. 143 * @param y result of evaluation of multi variate function 144 * f(x1, x2, ...) at provided x points. This is provided as input data along 145 * with x array. 146 * @param sig standard deviations of each pair of points (x,y). 147 * @throws IllegalArgumentException if provided arrays don't have the same 148 * size. 149 */ 150 public final void setInputData(final Matrix x, final Matrix y, final double[] sig) { 151 if (x.getRows() != y.getRows() || sig.length != y.getRows()) { 152 throw new IllegalArgumentException(); 153 } 154 155 this.x = x; 156 this.y = y; 157 this.sig = sig; 158 159 ndat = sig.length; 160 } 161 162 /** 163 * Sets required input data to start function fitting and assuming constant 164 * standard deviation errors in input data. 165 * 166 * @param x input points x where a multi variate function f(x1, x2, ...) 167 * is evaluated and where each column of the matrix represents each 168 * dimension of the point and each row is related to each sample 169 * corresponding to provided y pairs of values. 170 * @param y result of evaluation of multi variate function 171 * f(x1, x2, ...) at provided x points. This is provided as input data along 172 * with x array. 173 * @param sig standard deviations of each pair of points (x,y). 174 * @throws IllegalArgumentException if provided arrays don't have the same 175 * size. 176 */ 177 public final void setInputData(final Matrix x, final Matrix y, final double sig) { 178 if (x.getRows() != y.getRows()) { 179 throw new IllegalArgumentException(); 180 } 181 182 this.x = x; 183 this.y = y; 184 185 ndat = y.getRows(); 186 this.sig = new double[ndat]; 187 Arrays.fill(this.sig, sig); 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 }