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
26 09/01/2002 (RD) added second interpolation routine
29 ----------------------------------------------------------------------
31 AUTHOR(S): Jeff Scott <jscott@mail.com>
32 Robert Deters <rdeters@uiuc.edu>
34 ----------------------------------------------------------------------
38 ----------------------------------------------------------------------
40 INPUTS: -array of x data
42 -max number of data pairs
43 -x value to be interpolated on
45 ----------------------------------------------------------------------
47 OUTPUTS: -y as function of x
49 ----------------------------------------------------------------------
51 CALLED BY: uiuc_coefficients.cpp
53 ----------------------------------------------------------------------
57 ----------------------------------------------------------------------
59 COPYRIGHT: (C) 2000 by Michael Selig
61 This program is free software; you can redistribute it and/or
62 modify it under the terms of the GNU General Public License
63 as published by the Free Software Foundation.
65 This program is distributed in the hope that it will be useful,
66 but WITHOUT ANY WARRANTY; without even the implied warranty of
67 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
68 GNU General Public License for more details.
70 You should have received a copy of the GNU General Public License
71 along with this program; if not, write to the Free Software
72 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
73 USA or view http://www.gnu.org/copyleft/gpl.html.
75 **********************************************************************/
76 #include <simgear/compiler.h> // MSVC: to disable C4244 d to f warning
78 #include "uiuc_1Dinterpolation.h"
81 double uiuc_1Dinterpolation( double xData[100], double yData[100], int xmax, double x )
83 double x1=0, x2=0, y1=0, y2=0, L1=0, L2=0;
87 //check bounds on x to see if data range encloses it
88 // NOTE: [1] is first element of all arrays, [0] not used
89 if (x <= xData[1]) //if x less than lowest x
91 yfx = yData[1]; //let y equal lowest y
93 else if (x >= xData[xmax]) //if x greater than greatest x
95 yfx = yData[xmax]; //let y equal greatest y
97 else //x between xmax and x min
99 /*loop increases i until x is less than a known x,
100 e.g. Alpha from LaRCsim less than Alpha given in
101 tabulated data; once this value is found, i becomes
102 the upper bound and i-1 the lower bound*/
103 while (xData[i] <= x) //bracket upper bound
107 x2 = xData[i]; //set upper bounds
109 x1 = xData[i-1]; //set lower bounds
112 //calculate Langrange polynomial coefficients
113 //(see Kreyszig, pg. 937)
114 L1 = (x - x2) / (x1 - x2);
115 L2 = (x - x1) / (x2 - x1);
118 yfx = L1 * y1 + L2 * y2;
124 int uiuc_1Dinterpolation( double xData[], int yData[], int xmax, double x )
126 double x1=0, x2=0, xdiff=0;
131 //check bounds on x to see if data range encloses it
132 // NOTE: [1] is first element of all arrays, [0] not used
133 if (x <= xData[1]) //if x less than lowest x
135 yfx = yData[1]; //let y equal lowest y
137 else if (x >= xData[xmax]) //if x greater than greatest x
139 yfx = yData[xmax]; //let y equal greatest y
141 else //x between xmax and x min
143 /*loop increases i until x is less than a known x,
144 e.g. Alpha from LaRCsim less than Alpha given in
145 tabulated data; once this value is found, i becomes
146 the upper bound and i-1 the lower bound*/
147 while (xData[i] <= x) //bracket upper bound
151 x2 = xData[i]; //set upper bounds
153 x1 = xData[i-1]; //set lower bounds
159 else if (x < x1+xdiff/2)
167 // end uiuc_1Dinterpolation.cpp