/* * Juan Velasquez - 26 * Numerical Analysis - cs407 * 2006-04-09 - Spring 2006 * * Analysis #A - To compute a set of functions that compute properties for the earth. */ #include #include #define MAXN 10 // Least Squares vars double PressureCurveFitted1[5], PressureCurveFitted2[5]; // uses polynomial coefficients generated on the fly double Pressure(double alt); // uses a hard coded x array from prior calculation double Pressure26(double alt); double Temperature26(double alt); double Celerity26(double temp); double Gravity26(double alt); double convertMilliBarsToKSM(double millibars); // Lagrange Interpolation functions struct pair { double x; double y; }; int lagrange_interpolate( int n, struct pair table[], int k, double x, double *y, int debug ); int main() { double alt=0, temp=0; header(); calculatePressurePolyValues(); return 0; while(1) { printf("Altitude (double): "); scanf("%lf",&alt); if (alt<=0) { return 0; } printf("Pressure: %lf\n", Pressure26(alt)); printf(" Temp: %lf\n", temp=Temperature26(alt)); printf("Celerity: %lf\n", Celerity26(temp)); printf(" Gravity: %lf\n", Gravity26(alt)); printf("\n"); } return 0; } double Pressure26(double alt) { //double PressureCurveFit1[] = { 0.012217, -0.835692, 19.939858, -207.500562, 997.557278}; //double PressureCurveFit2[] = { 0.000052, -0.010532, 0.801042, -28.366402, 422.738095}; double PressureCurveFit1[] = { -9.6666667e-04, 7.8333333e-02, -2.3791667e+00, 3.4291667e+01, -2.5116667e+02}; double PressureCurveFit2[] = { -2.0833333e-06, 5.2083333e-04, -5.1041667e-02, 2.4729167e+00, -6.1125000e+01}; alt = alt/1000; if (alt < 25) { return convertMilliBarsToKSM( func(PressureCurveFit1, 5, alt) ); //return func(PressureCurveFit1, 5, alt); } else if (alt < 65) { return convertMilliBarsToKSM( func(PressureCurveFit2, 5, alt) ); //return func(PressureCurveFit2, 5, alt); } else if (alt >= 65) { return 0; } else { printf("Error: Pressure(%lf): Can't process invalid altitude.\n", alt); } } double Temperature26(double alt) { int n=15, i=0; double y=0; struct pair table[15]; double TemperatureAry[2][15] = { {0.0, 5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0}, {290.0, 240.0, 220.0, 225.0, 230.0, 245.0, 255.0, 265.0, 270.0, 275.0, 270.0, 255.0, 235.0, 215.0, 200.0} }; // since my lagrange function used a different format for data, I have to convert for (i=0; i= 65000.0) { return 1000.0; } else { return ( pow(1.4 * 8314.32 / 28.9644 * temp, 0.5) ); } } double Gravity26(double alt) { return (398622000000000.0/pow(6378178.0+alt,2.0)); } double convertMilliBarsToKSM(double millibars) { return (millibars * 1000.0 * 0.010197162); } double func(double x[10], int degree, double xVal) { int i, power; double sum = 0.0; power = degree-1; for (i=0;i n, then fail. if (k>n) { return 0; } // if less than floor(k/2) data points to left or right halfk = k/2; // using an int here is on purpose halfk_top = k - halfk; // count the number of data points above and below x. if (debug) { printf("lagrange_interpolate(): calculating location of x in table.\n"); } for (i=0; i2) { printf("lagrange_interpolate(): points_less_x=%i\tpoints_greater_x=%i.\n", points_less_x, points_greater_x); } // figure out the starting data point for K points // start_point is 0 indexed if (debug) { printf("lagrange_interpolate(): calculating starting data point.\n"); } if ( halfk > points_less_x ) { // then use all of them start_point = 0; } else if ( halfk_top > points_greater_x ) { // then use all of those start_point = n - k; } else { start_point = points_less_x - halfk; } if (debug) { printf("lagrange_interpolate(): starting interpolation.\n"); } for (i=0; i2) { printf("lagrange_interpolate(): i=%i\tj=%i.\n", (start_point+i), (start_point+j)); } // double check demoinator is not zero // even though this should never happen denom = table[start_point+i].x - table[start_point+j].x; if ( denom ) { l = l * ( (x - table[start_point+j].x)/denom ); if (debug>3) { printf("lagrange_interpolate(): calculating l%i\tl=%lf.\n", (i+1), l); } } else { if (debug>2) { printf("lagrange_interpolate(): strange, demoninator in l%i is zero.\n", (i+1)); } } } } ans += table[start_point+i].y * l; if (debug>2) { printf("lagrange_interpolate(): using data point: y%i=%lf.\n", (start_point+i), table[start_point+i].y ); } if (debug>2) { printf("lagrange_interpolate(): calculating y\ty=%lf.\n", ans); } } *y = ans; return 1; }