From 1f5c36cbdd52f737d9a1a65b9a00f77f2b454b34 Mon Sep 17 00:00:00 2001 From: pgkirsch Date: Tue, 9 Feb 2016 17:00:08 -0500 Subject: [PATCH 1/4] version 0 --- aircraft/climb.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 aircraft/climb.py diff --git a/aircraft/climb.py b/aircraft/climb.py new file mode 100644 index 00000000..10944a99 --- /dev/null +++ b/aircraft/climb.py @@ -0,0 +1,62 @@ +from gpkit import Variable, Model + +class Climb(Model): + """ + Model for climbing flight + + References + --------- + [1] Anderson, Introduction to flight + [2] https://en.wikipedia.org/wiki/Taylor_series + [3] https://en.wikipedia.org/wiki/Thrust_specific_fuel_consumption + + + Assumptions + ----------- + - Assumes you want to minimize climb time + - Assumes constant thrust + - Assumes constant velocity + - Assumes constant air density + """ + def setup(self): + + h = 30000 # final altitude + n = 1 # number of steps + + # Free variables + t = Variable('t', 's', 'Time to climb') + D = Variable('D', 'N', 'Drag') + m_f = Variable('m_f', 'kg', 'Mass of fuel burned') + + # Fixed parameters + CD = Variable('C_D', 0.02, '-', 'Drag coefficient') + dh = Variable('\\Delta h', h/n, 'ft', 'Altitude step') + h = Variable('h', h, 'ft', 'Final altitude') + rho = Variable('\\rho', 1.225, 'kg/m^3', 'Air density') + S = Variable('S', 130, 'm^2', 'Reference area') + T = Variable('T', 1E6, 'N', 'Thrust') + TSFC = Variable('TSFC', 8.7E-4, 'g/(kN*s)', # [3] + 'Thrust specific fuel consumption') + V = Variable('V', 100, 'm/s', 'Freestream velocity') + W = Variable('W', 600000, 'N', 'Aircraft weight') + + objective = t + + constraints = [# Climb time [1] + # uses Maclaurin series expansion of 1/(1-T/D) (ref [2]) + t >= (W/(V*T))*(1 + D/T + (D/T)**2 + (D/T)**3)*dh, + + # Drag + D == 0.5*rho*V**2*S*CD, + + # Fuel burn + m_f == TSFC*T*t, + ] + + return objective, constraints + + def test(self): + self.solve() + +if __name__ == "__main__": + Climb().test() From bf0a945649b6a398347aafc5b7970532970fa589 Mon Sep 17 00:00:00 2001 From: pgkirsch Date: Tue, 9 Feb 2016 17:02:11 -0500 Subject: [PATCH 2/4] fuel mass is objective --- aircraft/climb.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aircraft/climb.py b/aircraft/climb.py index 10944a99..37eb8f6a 100644 --- a/aircraft/climb.py +++ b/aircraft/climb.py @@ -10,7 +10,6 @@ class Climb(Model): [2] https://en.wikipedia.org/wiki/Taylor_series [3] https://en.wikipedia.org/wiki/Thrust_specific_fuel_consumption - Assumptions ----------- - Assumes you want to minimize climb time @@ -40,7 +39,7 @@ def setup(self): V = Variable('V', 100, 'm/s', 'Freestream velocity') W = Variable('W', 600000, 'N', 'Aircraft weight') - objective = t + objective = m_f constraints = [# Climb time [1] # uses Maclaurin series expansion of 1/(1-T/D) (ref [2]) From 7750ec01788d01d854d0743d871696056832fddb Mon Sep 17 00:00:00 2001 From: pgkirsch Date: Wed, 10 Feb 2016 01:31:47 -0500 Subject: [PATCH 3/4] starting to add VecVars --- aircraft/climb.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/aircraft/climb.py b/aircraft/climb.py index 37eb8f6a..94a23e56 100644 --- a/aircraft/climb.py +++ b/aircraft/climb.py @@ -1,4 +1,5 @@ from gpkit import Variable, Model +import numpy as np class Climb(Model): """ @@ -19,19 +20,32 @@ class Climb(Model): """ def setup(self): - h = 30000 # final altitude - n = 1 # number of steps + H = 30000 # final altitude + n = 3 # number of steps + + h = np.linspace(0, H, n) + T0 = 288.15 # [K] + L = 0.0065 # [K/m] + p0 = 101325 # [Pa] + R = 8.31 # [J/(mol*K)] + g = 9.81 # [m/s^2] + M = 0.02896 # [kg/mol] + + T = T0 - L*h # [K] + p = p0*(1 - L*h/T0)**(g*M/(R*L))# [Pa] + rho = p*M/(R*T) # [kg/m^3] # Free variables - t = Variable('t', 's', 'Time to climb') + dt = Variable('\\Delta t', 's', 'Time to climb segment') +# t = Variable('t', 's', 'Time to climb') D = Variable('D', 'N', 'Drag') - m_f = Variable('m_f', 'kg', 'Mass of fuel burned') + m_f = VectorVariable('m_f', n, 'kg', 'Mass of fuel burned') # Fixed parameters CD = Variable('C_D', 0.02, '-', 'Drag coefficient') dh = Variable('\\Delta h', h/n, 'ft', 'Altitude step') - h = Variable('h', h, 'ft', 'Final altitude') - rho = Variable('\\rho', 1.225, 'kg/m^3', 'Air density') +# h = VectorVariable('h', h, 'm', 'Final altitude') + rho = VectorVariable('\\rho', rho, 'kg/m^3', 'Air density') S = Variable('S', 130, 'm^2', 'Reference area') T = Variable('T', 1E6, 'N', 'Thrust') TSFC = Variable('TSFC', 8.7E-4, 'g/(kN*s)', # [3] @@ -39,17 +53,17 @@ def setup(self): V = Variable('V', 100, 'm/s', 'Freestream velocity') W = Variable('W', 600000, 'N', 'Aircraft weight') - objective = m_f + objective = m_f constraints = [# Climb time [1] # uses Maclaurin series expansion of 1/(1-T/D) (ref [2]) - t >= (W/(V*T))*(1 + D/T + (D/T)**2 + (D/T)**3)*dh, + dt >= (W/(V*T))*(1 + D/T + (D/T)**2 + (D/T)**3)*dh, # Drag D == 0.5*rho*V**2*S*CD, # Fuel burn - m_f == TSFC*T*t, + m_f == TSFC*T*dt, ] return objective, constraints From c57d13f8e34aecdd667a25688399e2dc72708002 Mon Sep 17 00:00:00 2001 From: pgkirsch Date: Thu, 11 Feb 2016 01:04:22 -0500 Subject: [PATCH 4/4] first working discretized climb --- aircraft/climb.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/aircraft/climb.py b/aircraft/climb.py index 94a23e56..7f4abbac 100644 --- a/aircraft/climb.py +++ b/aircraft/climb.py @@ -1,4 +1,4 @@ -from gpkit import Variable, Model +from gpkit import Variable, VectorVariable, Model import numpy as np class Climb(Model): @@ -26,7 +26,7 @@ def setup(self): h = np.linspace(0, H, n) T0 = 288.15 # [K] L = 0.0065 # [K/m] - p0 = 101325 # [Pa] + p0 = 101325 # [Pa] R = 8.31 # [J/(mol*K)] g = 9.81 # [m/s^2] M = 0.02896 # [kg/mol] @@ -36,16 +36,14 @@ def setup(self): rho = p*M/(R*T) # [kg/m^3] # Free variables - dt = Variable('\\Delta t', 's', 'Time to climb segment') -# t = Variable('t', 's', 'Time to climb') - D = Variable('D', 'N', 'Drag') - m_f = VectorVariable('m_f', n, 'kg', 'Mass of fuel burned') + dt = VectorVariable(n, '\\Delta t', 's', 'Time to climb segment') + D = VectorVariable(n, 'D', 'N', 'Drag') + m_f = VectorVariable(n, 'm_f', 'kg', 'Mass of fuel burned') # Fixed parameters CD = Variable('C_D', 0.02, '-', 'Drag coefficient') - dh = Variable('\\Delta h', h/n, 'ft', 'Altitude step') -# h = VectorVariable('h', h, 'm', 'Final altitude') - rho = VectorVariable('\\rho', rho, 'kg/m^3', 'Air density') + dh = Variable('\\Delta h', H/n, 'ft', 'Altitude step') + rho = VectorVariable(n, '\\rho', rho, 'kg/m^3', 'Air density') S = Variable('S', 130, 'm^2', 'Reference area') T = Variable('T', 1E6, 'N', 'Thrust') TSFC = Variable('TSFC', 8.7E-4, 'g/(kN*s)', # [3] @@ -53,7 +51,7 @@ def setup(self): V = Variable('V', 100, 'm/s', 'Freestream velocity') W = Variable('W', 600000, 'N', 'Aircraft weight') - objective = m_f + objective = sum(m_f) constraints = [# Climb time [1] # uses Maclaurin series expansion of 1/(1-T/D) (ref [2])