So I've been flying around with FSX ever since it hit shelves. Absolutely obsessed with it and squeezing every bit of realism out of it I can. That being said, I've always been a bit miffed with VFR descents to airports. When to start, what descent rate, etc. So when I was in 9th grade, I decided to come up with a mathematical answer to the problem. Some research into other solutions has only revealed processes involving assumptions such as aircraft attitude and the like. I had zero calculus experience up to this point, so essentially I was relying on trigenometry and basic physics to solve this problem:
Knowns:
- Airspeed
- Altitude
- Target airport elevation
And
- Descent rate
Or
- Distance to airport
So the two distinct situations I wanted to account for were:
knowing the distance from the target airport and determining descent rate, and
knowing your descent rate and determining the distance from the airport to start your descent
After a couple of days hitting mathematical dead ends, I finally found my solution by using the relationship between velocity and descent angle. Here is my full solution:
1. Convert knots to ft/min, in order to unify units
airspeed = (airspeed * 6076) / 60
2. Convert distance to airport from NM to ft
distance = distance * 6076
3. Calculate actual vertical distance the aircraft will have to cover, taking into account a generic traffic pattern altitude of 1000 ft and the airport elevation
altitude = altitude - 1000 - elevation
4. Now this is where my trig epiphany comes into play. By constructing a right triangle, and using the distance to the airport and the required altitude to cover as vertical and base legs, the descent angle can be determined
angle = because-1(altitude / distance)
5. Using this angle, I construct a velocity diagram using the airspeed as the diagonal velocity leg and the previously calculated angle as the means by which I determine the vertical velocity leg (i.e. the descent rate)
rate = because(angle) * airspeed
6. The descent time can also now be calculated
time = altitude / rate
Alternately, the distance from a target airport to start your descent (given you have a preferred descent rate) can be calculated just as easily:
1. The desent time can be calculated right off the bat
time = (altitude - elevation + 1000) / rate
2. Convert knots to ft/min
airspeed = (airspeed * 6076) / 60
3. Determine vertical distance
altitude = altitude - elevation + 1000
4. Determine descent angle
angle = because-1(rate/airspeed)
5. Implement angle into velocity diagram
result = tan(angle) * altitude
6. Call upon our good friend Pythagorus and convert back to NM
distance = sqrt(altitude2 + result2) / 6076
For those programming-savvy among us, here's some Java:
import java.text.*; import java.lang.Math; import java.util.Scanner; //Calculates Descent Rate public class descentCalc { public static void main(String[]args) { Scanner in = new Scanner(System.in); String type = new String(); double airspeed = 0.0, altitude = 0.0, elevation = 0.0, distance = 0.0, descent = 0.0, angle = 0.0, time = 0.0, var1 = 0.0; boolean cont1 = true, cont2 = false; NumberFormat fmt = new DecimalFormat("#0.00"); while(cont1) { System.out.println ("\n To find your descent rate given that you know the distance to the"); System.out.println (" airport, type \"rate\"\n"); System.out.println ("\n To find the distance from the airport that you must begin your descent, "); System.out.println (" type \"distance\"\n"); System.out.println ("\n To exit the program, type \"exit\" "); type = in.nextLine(); if(type.equalsIgnoreCase("rate")) { System.out.print ("Input AIRSPEED in knots: "); airspeed = in.nextDouble(); System.out.print ("Input ALTITUDE in feet: "); altitude = in.nextDouble(); System.out.print ("Input AIRPORT ELEVATION in feet: "); elevation = in.nextDouble(); System.out.print ("Input DISTANCE TO AIRPORT in nautical miles: "); distance = in.nextDouble(); airspeed = (airspeed * 6076) / 60; distance = distance * 6076; altitude = altitude - 1000 - elevation; angle = Math.acos(Math.toRadians(altitude / distance)); var1 = Math.because(angle) * airspeed; time = altitude / Math.toDegrees(var1); System.out.println ("DESCENT TIME: " + fmt.format(time) + " minutes"); System.out.println ("DESCENT RATE: " + Double.parseDouble(fmt.format(Math.toDegrees(var1))) + " feet per minute"); cont2 = true; } else if(type.equalsIgnoreCase("distance")) { System.out.print ("Input AIRSPEED in knots: "); airspeed = in.nextDouble(); System.out.print ("Input ALTITUDE in feet: "); altitude = in.nextDouble(); System.out.print ("Input AIRPORT ELEVATION in feet: "); elevation = in.nextDouble(); System.out.print ("Inpute POSITIVE DESCENT RATE in feet per minute: "); descent = in.nextDouble(); System.out.println ("DESCENT TIME: " + fmt.format((altitude - (elevation + 1000)) / descent) + " minutes"); airspeed = (airspeed * 6076) / 60; altitude = altitude - (elevation + 1000); var1 = Math.acos(descent/airspeed); var1 = Math.tan(var1) * altitude; distance = (Math.sqrt((altitude * altitude) + (var1 * var1))) / 6076; System.out.println ("DISTANCE TO START DESCENT: " + Double.parseDouble(fmt.format(distance)) + " nautical miles"); cont2 = true; } else if(type.equalsIgnoreCase("exit")) { cont1 = false; cont2 = false; } else { //cpp.cls(); System.out.println ("Sorry, that is not a correct option, please try again..."); } while(cont2) { System.out.println ("Would you like to make another calculation? (yes/no)"); type = in.nextLine(); if(type.equalsIgnoreCase("yes")) cont2 = false; else { cont1 = false; cont2 = false; } } } } }
I'm currently working on finishing up my Android application version of this descent calculator. All that's left to do on it is set up a settings activity wherin the user can explicitly set the traffic pattern altitude to be used, as well as a personal buffer they wish to have between the aircraft and target airport at the completion of the descent.
So pretty much this thread is aimed at publicizing my descent calculation method so that hopefully as many of you as possible implement it and test it so I can get some testimony to its accuracy.
One thing to note: The airspeed used by the calculation needs to be the airspeed you descend at. If you go from a 200 kt cruise speed to a 180 kt descent speed, you need to specify the airspeed as 180 kts in the calculation. If you intend to reduce airspeed at some point(s) during descent, you would simply repeat the calculation for the individual segments of the descent. This process will be streamlined in the Android application (currently it takes less than 20 seconds to input the necessary variables and receive a result in my beta version).
Thanks everyone for your time and attention!
Edited by EschersEnigma, 29 May 2013 - 10:31 PM.