1 /**********************************************************************
3 FILENAME: uiuc_1Dinterpolation.cpp
5 ----------------------------------------------------------------------
7 DESCRIPTION: reads in the yData and xData arrays and the value of x
8 to be interpolated on; performs 1D interpolation,
11 ----------------------------------------------------------------------
15 ----------------------------------------------------------------------
17 REFERENCES: syntax based on interp function in c172_aero.c
18 mathematics based on linear interpolation functions
20 Kreyszig, Erwin. Advanced Engineering Mathematics,
21 7th ed. NY: John Wiley & Sons, 1993.
23 ----------------------------------------------------------------------
25 HISTORY: 02/03/2000 initial release
27 ----------------------------------------------------------------------
29 AUTHOR(S): Jeff Scott <jscott@mail.com>
31 ----------------------------------------------------------------------
35 ----------------------------------------------------------------------
37 INPUTS: -array of x data
39 -max number of data pairs
40 -x value to be interpolated on
42 ----------------------------------------------------------------------
44 OUTPUTS: -y as function of x
46 ----------------------------------------------------------------------
48 CALLED BY: uiuc_coefficients.cpp
50 ----------------------------------------------------------------------
54 ----------------------------------------------------------------------
56 COPYRIGHT: (C) 2000 by Michael Selig
58 This program is free software; you can redistribute it and/or
59 modify it under the terms of the GNU General Public License
60 as published by the Free Software Foundation.
62 This program is distributed in the hope that it will be useful,
63 but WITHOUT ANY WARRANTY; without even the implied warranty of
64 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
65 GNU General Public License for more details.
67 You should have received a copy of the GNU General Public License
68 along with this program; if not, write to the Free Software
69 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
70 USA or view http://www.gnu.org/copyleft/gpl.html.
72 **********************************************************************/
73 #include <simgear/compiler.h> // MSVC: to disable C4244 d to f warning
75 #include "uiuc_1Dinterpolation.h"
78 double uiuc_1Dinterpolation( double xData[100], double yData[100], int xmax, double x )
80 double x1=0, x2=0, y1=0, y2=0, L1=0, L2=0;
84 //check bounds on x to see if data range encloses it
85 // NOTE: [1] is first element of all arrays, [0] not used
86 if (x <= xData[1]) //if x less than lowest x
88 yfx = yData[1]; //let y equal lowest y
90 else if (x >= xData[xmax]) //if x greater than greatest x
92 yfx = yData[xmax]; //let y equal greatest y
94 else //x between xmax and x min
96 /*loop increases i until x is less than a known x,
97 e.g. Alpha from LaRCsim less than Alpha given in
98 tabulated data; once this value is found, i becomes
99 the upper bound and i-1 the lower bound*/
100 while (xData[i] <= x) //bracket upper bound
104 x2 = xData[i]; //set upper bounds
106 x1 = xData[i-1]; //set lower bounds
109 //calculate Langrange polynomial coefficients
110 //(see Kreyszig, pg. 937)
111 L1 = (x - x2) / (x1 - x2);
112 L2 = (x - x1) / (x2 - x1);
115 yfx = L1 * y1 + L2 * y2;
121 int uiuc_1Dinterpolation( double xData[], int yData[], int xmax, double x )
123 double x1=0, x2=0, xdiff=0;
128 //check bounds on x to see if data range encloses it
129 // NOTE: [1] is first element of all arrays, [0] not used
130 if (x <= xData[1]) //if x less than lowest x
132 yfx = yData[1]; //let y equal lowest y
134 else if (x >= xData[xmax]) //if x greater than greatest x
136 yfx = yData[xmax]; //let y equal greatest y
138 else //x between xmax and x min
140 /*loop increases i until x is less than a known x,
141 e.g. Alpha from LaRCsim less than Alpha given in
142 tabulated data; once this value is found, i becomes
143 the upper bound and i-1 the lower bound*/
144 while (xData[i] <= x) //bracket upper bound
148 x2 = xData[i]; //set upper bounds
150 x1 = xData[i-1]; //set lower bounds
156 else if (x < x1+xdiff/2)
164 // end uiuc_1Dinterpolation.cpp