import java.math.BigDecimal; import java.math.BigInteger; import java.math.MathContext; import java.math.RoundingMode; import java.util.ArrayList; public class Variables { private double m, CD, CL, S, A, TimeInterval, r, alpha, omega, l, gamma; private double g, rho, b, RD, vVerticle, vTerminal, vAirflow, vTrue, t, mu, W, theta,RN, Temp,Temp_0; public Variables(double[] InitConditions){ /*v_v-vertical velocity, V- true velocity,t_v terminal velocity*/ m = InitConditions[0]; CD = InitConditions[1]; CL = InitConditions[2]; S = InitConditions[3]; A = InitConditions[4]; TimeInterval = InitConditions[5]; r = InitConditions[6]; alpha = InitConditions[7]; l = InitConditions[8]; gamma = InitConditions[9]; Temp_0 = 15; Temp = Temperature(); t = 0; g = gravity(); rho = airDensity(); W = Weight(); b = b(); vTerminal = terminalVelocity(); vTrue = trueVelocity(); RD = RD(); /*estimate vertical velocity to seed calculation*/ vVerticle = (.5 * g *1); omega = 1;/*?rotation rate?*/ theta = PitchAttitudeAngle(); mu = mu(); vAirflow = Airflow(); RN = RN(); } /*updates conditions*/ public Variables(Variables v){ m = v.m; CD = v.CD; CL = v.CL; S = v.S; Temp_0 = v.Temp_0; TimeInterval = v.TimeInterval; if(v.t==0){ t=1; A = v.A - v.vVerticle; }else{ t = v.t + TimeInterval; BigDecimal bigA = new BigDecimal(Double.toString(v.A)); BigDecimal bigg = new BigDecimal(Double.toString(v.g)); BigDecimal bigb = new BigDecimal(Double.toString(v.b)); BigDecimal bigt = new BigDecimal(Double.toString(t)); A = bigA.multiply(bigb).subtract(log10(cosh(sqrt(bigg.multiply(bigb))).multiply(bigt))).divide(bigb,1).doubleValue(); //A = (v.A*v.b-Math.log10(Math.cosh(Math.sqrt(v.g*v.b)*t)))/v.b; } Temp = Temperature(); r = v.r; alpha = v.alpha; l = v.l; gamma = v.gamma; g = gravity(); rho = airDensity(); W = Weight(); b = b(); vTerminal = terminalVelocity(); vTrue = trueVelocity(); RD = RD(); /*estimate vertical velocity to seed calculation*/ vVerticle = -(Math.sqrt(v.g)*Math.tanh(Math.sqrt(v.g)*Math.sqrt(this.b)*this.t)/Math.sqrt(this.b)); omega = 1;/*?rotation rate?*/ theta = PitchAttitudeAngle(); mu = mu(); vAirflow = Airflow(); RN = RN(); } public double mu(){ return (0.000001458 * Math.sqrt(Temp))/(1+(110.4/Temp)); } public double Temperature(){ if(A < 11){ return Temp_0 + (-6.5)*(A - 0); }else if(11 <= A && A < 20.1){ return Temp_0 + (0)*(A - 11); }else if(20.1 <= A && A < 32.2){ return Temp_0 + (1)*(A - 20.1); }else if(32.2 <= A && A < 47.3){ return Temp_0 + (2.8)*(A - 32.2); }else if(47.3 <= A && A < 52.4){ return Temp_0 + (0)*(A - 47.3); }else if(52.4 <= A && A < 61.6){ return Temp_0 + (-2)*(A - 52.4); }else if(61.6 <= A && A < 80){ return Temp_0 + (-4)*(A - 61.6); }else{ return Temp_0 + (0)*(A - 80); } } public double Airflow(){ return omega* r; } public double RN(){ return (vAirflow*rho*l)/mu; } public double PitchAttitudeAngle(){ return Math.atan(RD/(omega*r))-alpha; } public double Weight(){ return m*g; } public double trueVelocity(){ return Math.sqrt((2*W)/(rho*CL*S)); } public double terminalVelocity(){ return Math.sqrt((2*W)/(rho*CD*S)); } public double RD(){ return ((vTrue*CD)/CL); } public double b(){ return (.5*rho*CD*S); } public double gravity(){ return ((-0.000003)*A)+ 9.8064; } public double airDensity(){ return 1.4213*Math.exp((-0.0001)*A); } public double getAltitude(){ return A; } public String Headers(){ return "Altitude,Time,Terminal Velocity,Vertical Velocity,True Velocity,Pitch Attitude Angle,RN"; } public String toString(){ return A+","+t+","+vTerminal+","+vVerticle+","+vTrue+","+theta+","+RN; } //hyperbolic cos /*from: http://www.shodor.org/~jmorrell/interactivate/org/shodor/math11/FormulaMath.java*/ public static BigDecimal cosh(BigDecimal x) { return (exp(x).add(x.negate())).divide(new BigDecimal("2"), x.scale(), BigDecimal.ROUND_HALF_EVEN); } public static BigDecimal exp(BigDecimal bd) { double d = bd.doubleValue(); BigDecimal ret = new BigDecimal(Math.exp(d)); return ret.setScale(bd.scale(), BigDecimal.ROUND_HALF_EVEN); } public static BigDecimal sqrt(BigDecimal bd) { double d = bd.doubleValue(); BigDecimal ret = new BigDecimal(Math.sqrt(d)); return ret.setScale(bd.scale(), BigDecimal.ROUND_HALF_EVEN); } /** * COMMON log. (Log base 10) * @param bd * @return Common log of bd */ public static BigDecimal log10(BigDecimal x) { BigDecimal ret = log(x); BigDecimal denom = log(new BigDecimal("10")); BigDecimal result = ret.divide(denom, x.scale(), BigDecimal.ROUND_HALF_EVEN); return result; } /** * NATURAL log. (Log base e) * @param bd * @return Natural log of bd */ public static BigDecimal log(BigDecimal bd) { double d = bd.doubleValue(); double result = 0.0; result = Math.log(d); if(Double.isNaN(result) || Double.isInfinite(result)) return new BigDecimal("0"); BigDecimal ret = new BigDecimal(Math.log(d)); return ret.setScale(bd.scale(), BigDecimal.ROUND_HALF_EVEN); } }