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