]> git.mxchange.org Git - flightgear.git/blob - src/FDM/UIUCModel/uiuc_1Dinterpolation.cpp
Goodbye automake.
[flightgear.git] / src / FDM / UIUCModel / uiuc_1Dinterpolation.cpp
1 /**********************************************************************
2
3  FILENAME:     uiuc_1Dinterpolation.cpp
4
5 ----------------------------------------------------------------------
6
7  DESCRIPTION:  reads in the yData and xData arrays and the value of x 
8                to be interpolated on; performs 1D interpolation, 
9                i.e. y=f(x)
10
11 ----------------------------------------------------------------------
12
13  STATUS:       alpha version
14
15 ----------------------------------------------------------------------
16
17  REFERENCES:   syntax based on interp function in c172_aero.c
18                mathematics based on linear interpolation functions 
19                found in
20                Kreyszig, Erwin. Advanced Engineering Mathematics, 
21                7th ed. NY: John Wiley & Sons, 1993.
22
23 ----------------------------------------------------------------------
24
25  HISTORY:      02/03/2000   initial release
26                09/01/2002   (RD) added second interpolation routine
27                             for integer case
28
29 ----------------------------------------------------------------------
30
31  AUTHOR(S):    Jeff Scott         <jscott@mail.com>
32                Robert Deters      <rdeters@uiuc.edu>
33
34 ----------------------------------------------------------------------
35
36  VARIABLES:
37
38 ----------------------------------------------------------------------
39
40  INPUTS:       -array of x data
41                -array of y data
42                -max number of data pairs
43                -x value to be interpolated on
44
45 ----------------------------------------------------------------------
46
47  OUTPUTS:      -y as function of x
48
49 ----------------------------------------------------------------------
50
51  CALLED BY:    uiuc_coefficients.cpp
52
53 ----------------------------------------------------------------------
54
55  CALLS TO:     none
56
57 ----------------------------------------------------------------------
58
59  COPYRIGHT:    (C) 2000 by Michael Selig
60
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.
64
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.
69
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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
73
74 **********************************************************************/
75 #include <simgear/compiler.h>    // MSVC: to disable C4244 d to f warning
76
77 #include "uiuc_1Dinterpolation.h"
78
79
80 double uiuc_1Dinterpolation( double xData[100], double yData[100], int xmax, double x )
81 {
82   double x1=0, x2=0, y1=0, y2=0, L1=0, L2=0;
83   int i=2;
84   float yfx=0;
85
86   //check bounds on x to see if data range encloses it
87   // NOTE: [1] is first element of all arrays, [0] not used
88   if (x <= xData[1])         //if x less than lowest x
89     {
90       yfx = yData[1];        //let y equal lowest y
91     }
92   else if (x >= xData[xmax]) //if x greater than greatest x
93     {
94       yfx = yData[xmax];     //let y equal greatest y
95     }
96   else                       //x between xmax and x min
97     {
98       /*loop increases i until x is less than a known x, 
99         e.g. Alpha from LaRCsim less than Alpha given in 
100         tabulated data; once this value is found, i becomes 
101         the upper bound and i-1 the lower bound*/
102       while (xData[i] <= x)    //bracket upper bound
103         {
104           i++;
105         }
106       x2 = xData[i];          //set upper bounds
107       y2 = yData[i];
108       x1 = xData[i-1];        //set lower bounds
109       y1 = yData[i-1];
110
111       //calculate Langrange polynomial coefficients 
112       //(see Kreyszig, pg. 937)
113       L1 = (x - x2) / (x1 - x2);
114       L2 = (x - x1) / (x2 - x1);
115
116       //solve for y=f(x)
117       yfx = L1 * y1 + L2 * y2;
118     }
119   return yfx;
120 }
121
122
123 int uiuc_1Dinterpolation( double xData[], int yData[], int xmax, double x )
124 {
125   double x1=0, x2=0, xdiff=0;
126   int y1=0, y2=0;
127   int i=2;
128   int yfx=0;
129
130   //check bounds on x to see if data range encloses it
131   // NOTE: [1] is first element of all arrays, [0] not used
132   if (x <= xData[1])         //if x less than lowest x
133     {
134       yfx = yData[1];        //let y equal lowest y
135     }
136   else if (x >= xData[xmax]) //if x greater than greatest x
137     {
138       yfx = yData[xmax];     //let y equal greatest y
139     }
140   else                       //x between xmax and x min
141     {
142       /*loop increases i until x is less than a known x, 
143         e.g. Alpha from LaRCsim less than Alpha given in 
144         tabulated data; once this value is found, i becomes 
145         the upper bound and i-1 the lower bound*/
146       while (xData[i] <= x)    //bracket upper bound
147         {
148           i++;
149         }
150       x2 = xData[i];          //set upper bounds
151       y2 = yData[i];
152       x1 = xData[i-1];        //set lower bounds
153       y1 = yData[i-1];
154
155       xdiff = x2 - x1;
156       if (y1 == y2)
157         yfx = y1;
158       else if (x < x1+xdiff/2)
159         yfx = y1;
160       else
161         yfx = y2;
162     }
163   return yfx;
164 }
165
166 // end uiuc_1Dinterpolation.cpp