#include #include #include #include "PitchBlkOut.h" #define RK_order 4 #define N_Max 100 static const int Neq = 2; void XP_System(int Neq, double T, double Y[], double DY[]); void RK4_System(int n, double h, double T, double x[], int nsteps); double interpolate(int numberofpairs, double x[], double y[], double bigx, int k); double product(double x[], double bigx, int i, int upperbound,int lowerbound) ; double summation(double x[], double y[], int numberofpairs, double bigx, int upperbound, int lowerbound); double pressure23(double altitude); double temperature23(double altitude); double gravity23(double alt); double celerity23(double temperature); double max(double a, double b); void OneRun23(); void output(int j, double T, double Y[]); void Gauss(int n, double a[10][10], double b[10], double x[10]); void Search23(); double X[100]; int anykey; int MaxIter=10; double G1,G2,G3,Pert1,Pert2,Pert3; double B1,B2,B3,Tol1,Tol2,Tol3; double Xmin,Xmax; int NSUB=20; double TIME[2000],Ys[2000]; int anykey; int numstages; int control; int stage=1; //A compute in atmospheric routine double pressure; double temperature; //F compute in the function evaluation part of the integration double velocity; double c[3]; //unit vector for velocity // double celerity; double mach; double q; double af; //G compute in gravity routine double gravity; double g[3]; //O compute in output routine double lattitude; double longitude; double altitude; double acceleration; double range; //P compute in pitch program routine double az; double pang; double vend; //vertical rise time double pend; // double f[3]; //s adjust values at staging double COT[2]; double thrust[2]; double weight[2]; double flow[2]; double crosssection[2]; double CD[2]; double TI[2]; //I input quantities double plat; double plong; double height; //three coefficients for unit vectors double ft; double fg; double fa; //saved c matrix /* double X1final; double X2final; double X3final; */ void Search23() { double sta, stb, stc; double pert1a, pert1b, pert1c; double pert2a, pert2b, pert2c; double pert3a, pert3b, pert3c; double error1, error2, error3; int i = 0, j = 0; double A[10][10], B[10]; //X[10]; double temp, temp2, temp3; double resultX[10]; double saveAZ, savePA, saveTH; saveAZ = az; savePA = pang; saveTH = thrust[0]; for (i = 0; i < 10; i++) { B[i] = 0.0; X[i] = 0.0; for (j = 0; j < 10; j++) A[i][j] = 0.0; } //printf("you are here2 MaxIter is %d \n", MaxIter); for(i = 0; i < MaxIter; i++) { /* G1 =az; G2 =pang; G3 =thrust[0]; */ int p=0; int q=0; az = saveAZ; pang = savePA; thrust[0] = saveTH; OneRun23(); //do a regular run sta = X[0]; //save the regular results stb = X[1]; stc = X[2]; //printf("sta is %lf stb is %lf stc is %lf",sta,stb,stc); //printf("B1 is %lf B2 is %lf B3 is %lf",B1,B2,B3); B[0] = (B1 - sta); B[1] = (B2 - stb); B[2] = (B3 - stc); /* if (fabs(X[0] - B1) < Tol1 && fabs(X[1] - B2) < Tol2 && fabs(X[2] - B3) < Tol3) { printf("Tolerence met. Completed in %d iterations.\n", i+1); break; } */ // printf ("stc - B3 = %lf\n", fabs(stc-B3)); // printf ("stc - B3 / B3 \n ", fabs(fabs(stc-B3)/fabs(B3)); error1 = (fabs(B1 - sta) / fabs(B1)); error2 = (fabs(B2 - stb) / fabs(B2)); error3 = (fabs(B2 - stc) / fabs(B3)); printf ("erro1 is %lf error2 is %lf error3 is %lf\n tol1 is %lf tol2 is %lf tol3 is %lf" ,error1, error2, error3, Tol1, Tol2, Tol3); //if (fabs(fabs(B[0])/fabs(B1)) < Tol1 && fabs(fabs(B[1])/fabs(B2)) < Tol2 && fabs(fabs(B[2])/fabs(B3)) < Tol3) // check for tolerance //if ((error1 < Tol1) && (error2 < Tol2) && (error3 < Tol3)) if (fabs(fabs(B[0])/fabs(B1)) < Tol1 && fabs(fabs(B[1])/fabs(B2)) < Tol2 && fabs(fabs(B[2])/fabs(B3)) < Tol3) // check for tolerance { printf("Tolerence met. Completed in %d iterations.\n", i+1); break; } //change AZ az = ( saveAZ * (Pert1 +1)); G1 = az; //restore other 2 pang=savePA; thrust[0]=saveTH; OneRun23(); //perturbation run 1 pert1a = X[0]; pert1b = X[1]; pert1c = X[2]; //change PANG pang = ( savePA * (Pert2 +1)); G2 = pang; //restore other 2 az=saveAZ; thrust[0]=saveTH; OneRun23(); //perturbation run 2 pert2a = X[0]; pert2b = X[1]; pert2c = X[2]; //change thrust thrust[0] = ( saveTH * (Pert3 +1)); G3 = thrust[0]; //restore other 2 az = saveAZ; pang=savePA; OneRun23(); //perturbation run 3 pert3a = X[0]; pert3b = X[1]; pert3c = X[2]; /* G1 = saveAZ; G2 = savePA; G3 = saveTH; */ A[0][0] = (pert1a - sta) / (Pert1 * G1); A[0][1] = (pert2a - sta) / (Pert1 * G2); A[0][2] = (pert3a - sta) / (Pert1 * G3); A[1][0] = (pert1b - stb) / (Pert2 * G1); A[1][1] = (pert2b - stb) / (Pert2 * G2); A[1][2] = (pert3b - stb) / (Pert2 * G3); A[2][0]= (pert1c - stc) / (Pert3 * G1); A[2][1]= (pert2c - stc) / (Pert3 * G2); A[2][2]= (pert3c - stc) / (Pert3 * G3); /* for (p =0; p <3; p++) { for (q=0; q<3; q++) { //printf(" %lf ", A[p][q]); } //printf("\n"); } */ printf("Azimuth=%lf, Pitch angle=%lf, Thrust=%lf\n", az, pang, thrust[0]); printf("X[0] = %lf, X[1] = %lf, X[2] = %lf\n", X[0], X[1], X[2]); // feed back X[0] = 0; X[1] = 0; X[2] = 0; Gauss(3, A, B, resultX); saveAZ += resultX[0]; savePA += resultX[1]; saveTH += resultX[2]; /* az += resultX[0]; pang += resultX[1]; thrust[0] += resultX[2]; */ } } void OneRun23() { int nsteps; int tempsteps; int i=0; double y[7]; g[0] = 0.0; g[1] = 0.0; g[2] = -1.0; X[0] =0.0; X[1] =0.0; X[2] = height; X[3] =0.0; X[4] =0.0; X[5] =0.0; X[6] = weight[0]; velocity =1.0; acceleration =2.0; temperature = temperature23(height); celerity = celerity23(temperature); gravity = gravity23(height); mach = velocity/celerity; pressure = pressure23(height); q = 0.7 * pressure * (mach * mach); f[2] =1.0; for (i = 0; i < numstages; i++) { stage =i; nsteps = (int) COT[i] / TI[i]; y[6] = weight[i]; //printf("you are here\n"); if (i == 0) { //printf("runing if i =0\n"); RK4_System(7, TI[i], 0, X, nsteps); } else { //printf("runing else\n"); RK4_System(7, TI[i], 100, X, ( (int) ((COT[i]-COT[i-1]) / TI[i]) ) ); } } } void XP_System(int Neq, double T, double Y[], double DY[]) { int i; double mass; temperature = temperature23(Y[2]); celerity = celerity23(temperature); velocity = sqrt( (Y[3]*Y[3]) + (Y[4]*Y[4]) + (Y[5]*Y[5]) ); gravity = gravity23(Y[2]); mach = velocity / celerity; //printf("\n\n pressure is currently %lf sending y2 to pressure. y2 is %lf \n\n", pressure, Y[2]); pressure = pressure23(Y[2]); //printf("\n\n pressure is currently %lf \n\n", pressure); q = 0.7 * pressure * (mach * mach); mass = weight[stage] - flow[stage] * T; ft = thrust[stage]; fg = mass*gravity; fa = CD[stage] * q * crosssection[stage]; acceleration = (ft - fa) / (9.80655 * mass); af = fa; if (T!=0) { c[0]=Y[3]/velocity; c[1]=Y[4]/velocity; c[2]=Y[5]/velocity; } else { c[0] = 0.0; c[1] = 0.0; c[2] = 0.0; } //printf("pressure = %lf, temperature = %lf, celerity = %lf, gravity = %lf\n", pressure, temperature, celerity, gravity); PITCH(T, az, pang, vend, pend, f, c); DY[0] = Y[3]; DY[1] = Y[4]; DY[2] = Y[5]; /* DY[3] = ((thrust[stage] * f[0]) - (fa * c[0])) / Y[6]; DY[4] = ((thrust[stage] * f[1]) - (fa * c[1])) / Y[6]; DY[5] = ((thrust[stage] * f[2]) - g[2] - (fa * c[2])) / Y[6]; */ DY[3] = (ft * f[0] + fg * g[0] - fa * c[0]) / mass; DY[4] = (ft * f[1] + fg * g[1] - fa * c[1]) / mass; DY[5] = (ft * f[2] + fg * g[2] - fa * c[2]) / mass; DY[6] = -(flow[stage]); } void RK4_System(int n, double h, double T, double x[], int nsteps) { double Y[n]; double K[4][n]; int i = 0; int j = 0; //output(0, T, x); //scanf("%d",&anykey); for(j = 1; j <= nsteps; j++) { //printf("step %d \n", j); XP_System(n, T, x, K[0]); for(i = 0; i < n; i++) { Y[i] = x[i] + 0.5 * h * K[0][i]; } XP_System(n,T + 0.5 * h, Y, K[1]); for(i = 0; i < n; i++) { Y[i] = x[i] + 0.5 * h * K[1][i]; } XP_System(n, T + 0.5 * h, Y, K[2]); for(i = 0; i < n; i++) { Y[i] = x[i] + h * K[2][i]; } XP_System(n, T + h, Y, K[3]); for(i = 0; i < n; i++) { x[i] = x[i] + (1.0/6.0) * h * (K[0][i] + 2 * K[1][i] + 2 * K[2][i] + K[3][i]); } T+=h; // output(j, T, x); } } double product(double x[], double bigx, int i, int upperbound,int lowerbound) { double result = 1; int j = 0; for(j=lowerbound; j<=upperbound; j++) { if (j!=i) { result = (result) * ((bigx - x[j]) / (x[i]- x[j])); } } return result; } double summation(double x[], double y[], int numberofpairs, double bigx, int upperbound, int lowerbound) { double sum = 0; int i=lowerbound; numberofpairs=upperbound; /* printf("inside summation\n"); printf("bigx is %lf\n", bigx); printf("upperbound is is %d lowerbound is %d\n", upperbound, lowerbound); printf("npair is %d\n", numberofpairs); */ for(i=lowerbound; i<=upperbound; i++) { sum+=(y[i] * product(x,bigx,i,upperbound,lowerbound)); } return sum; } double interpolate(int numberofpairs, double x[], double y[], double bigx, int k) { int i=0,j=0,width=0; int upperbound=0,lowerbound = 0; double fx=0; /* printf("bigx is %lf\n", bigx); printf("k is %d\n", k); printf("npair is %d\n", numberofpairs); */ for (i=0;ibigx) { lowerbound=i-1; upperbound=i; break; } } width = (k/2) - 1; upperbound+=width; lowerbound-=width; if (lowerbound < 0) { upperbound = (abs(lowerbound)+upperbound); lowerbound = 0; } else { if(upperbound > numberofpairs) { lowerbound=lowerbound-(abs(upperbound-numberofpairs)); upperbound=numberofpairs; } } fx = summation(x,y,numberofpairs,bigx,upperbound,lowerbound); //printf("fx is %lf\n", fx); return fx; } double temperature23(double altitude) { double tempalt; double X[20]; double Y[20]; double temp = 0; X[0]=0.0, Y[0]=290.0; X[1]=5000.0, Y[1]=240.0; X[2]=10000.0, Y[2]=220.0; X[3]=15000.0, Y[3]=225.0; X[4]=20000.0, Y[4]=230.0; X[5]=25000.0, Y[5]=245.0; X[6]=30000.0, Y[6]=255.0; X[7]=35000.0, Y[7]=265.0; X[8]=40000.0, Y[8]=270.0; X[9]=45000.0, Y[9]=275.0; X[10]=50000.0, Y[10]=270.0; X[11]=55000.0, Y[11]=255.0; X[12]=60000.0, Y[12]=235.0; X[13]=65000.0, Y[13]=215.0; X[14]=70000.0, Y[14]=200.0; tempalt = altitude; temp= interpolate(15,X,Y,tempalt,4); if (altitude >= 65000) { temp = 180; } return temp; } double pressure23(double alt) { double press =0.0; double X[6]; //X = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) double results[6]; int i =0; double tempsum=0; alt = alt/1000; if (alt > 65) { press =0; } else { if (alt > 25) { //we got these values by running gauss.... /* X[0] = -0.000002; X[1] = 0.000521; X[2] = -0.051042; X[3] = 2.472917; X[4] = -61.125000; X[5] = 665.000000; */ X[0] = -2.0833e-06; X[1] = 5.2083e-04; X[2] = -5.1042e-02; X[3] = 2.4729; X[4] = -6.1125e+01; X[5] = 6.6500e+02; } else { /* X[0] = -0.000967; X[1] = 0.078333; X[2] = -2.379167; X[3] = 34.291670; X[4] = -251.166700; X[5] = 1000.000000; */ X[0] = -9.6667e-04; X[1] = 7.8333e-02; X[2] = -2.3792; X[3] = 3.4292e+01; X[4] = -2.5117e+02; X[5] = 1000; } results[0] = (X[0] * (pow ( alt, 5)) ); results[1] = (X[1] * (pow ( alt, 4)) ); results[2] = (X[2] * (pow ( alt, 3)) ); results[3] = (X[3] * (pow ( alt, 2)) ); results[4] = (X[4] * (pow ( alt, 1)) ); results[5] = (X[5]); /* printf("%lf * %lf ^ 5 = %lf\n", X[0], alt, results[0]); printf("%lf * %lf ^ 4 = %lf\n", X[1], alt, results[1]); printf("%lf * %lf ^ 3 = %lf\n", X[2], alt, results[2]); printf("%lf * %lf ^ 2 = %lf\n", X[3], alt, results[3]); printf("%lf * %lf ^ 1 = %lf\n", X[4], alt, results[4]); printf("%lf * %lf ^ 0 = %lf\n", X[5], alt, results[5]); */ press = results[0] + results[1] + results[2] + results[3] + results[4] + results[5]; } return press * 1000 * .010197162; } void output(int j, double T, double Y[]) { double chglongt, chglatt; double mass; temperature = temperature23(Y[2]); celerity = celerity23(temperature); velocity = sqrt( (Y[3]*Y[3]) + (Y[4]*Y[4]) + (Y[5]*Y[5]) ); gravity = gravity23(Y[2]); mach = velocity / celerity; pressure = pressure23(Y[2]); q = 0.7 * pressure * (mach * mach); mass = weight[stage] - flow[stage] * T; ft = thrust[stage]; fg = mass*gravity; fa = CD[stage] * q * crosssection[stage]; acceleration = (ft - fa) / (9.80655 * mass); chglatt = (fabs(Y[0]) /(1852.0 * 60.0)) + lattitude; chglongt = (fabs(Y[1]) /(1852.0 * 60.0)) + longitude; BLKOUT(1, control, T, Y, c, f, g, pang, vend, pend, az, -flow[stage], crosssection[stage], thrust[stage], gravity, pressure, temperature, mach, celerity, q, CD[stage], fa, chglatt, chglongt, sqrt(pow(Y[0], 2.0) + pow(Y[1], 2.0))/1852.0, velocity, acceleration, COT[stage], TI[stage]); } double gravity23(double alt) { return (3.98622e+14) / (pow(((6.378178e+06) + (alt)),2)); } double celerity23(double temperature) { if (temperature == 180) { return 1000; } else { return sqrt(((1.4)*((8.31432e+03) / (28.9644)) * temperature)); } } double max(double a, double b) { if(a > b) { return a; } else { return b; } } void Gauss(int n, double a[10][10], double b[10], double x[10]) { int I[10]; double s[10]; int i = 0; int j = 0; int k = 0; double r; double rmax = 0; double smax = 0; double xmult = 0; double temp = 0; double sum = 0; for(i=0; i < n; i++) { I[i] = i; smax = 0; for(j=0; j rmax) { rmax = r; j = i; } } temp = I[j]; I[j] = I[k]; I[k] = temp; for(i = k + 1; i=0; i--) { sum = b[I[i]]; for(j=i+1; j