A simple model for the envelope of an airship treats it as the volume of revolution obtained from a pair of quarter-ellipses joined at their (equal) semi-minor axes. The semi-major axis of the aft ellipse is taken to be longer than that representing the bow, by a factor $\alpha=6$. Equations describing the cross section (in the vertical plane) of the airship envelope may be written \begin{align*} y = \begin{array}{ll} \frac{b}{a}\sqrt{x(2a-x)} & (x \le a),\\ \frac{b}{a}\sqrt{a^2 - \frac{(x-a)^2}{\alpha^2}} & (a < x \le \alpha(a+1)). \end{array} \end{align*}
The drag on the envelope is given by the formula $$ D = \textstyle \frac{1}{2}\rho_\mathrm{air}v^2V^{2/3}C_\mathrm{DV}, $$ where $\rho_\mathrm{air}$ is the air density, $v$ the speed of the airship, $V$ the envelope volume and the drag coefficient, $C_\mathrm{DV}$ is estimated using the following empirical formula [1]: $$ C_\mathrm{DV} = \mathrm{Re}^{-1/6}[0.172(l/d)^{1/3} + 0.252(d/l)^{1.2} + 1.032(d/l)^{2.7}]. $$ Here, $\mathrm{Re} = \rho_\mathrm{air}vl/\mu$ is the Reynold's number and $\mu$ the dynamic viscosity of the air. $l$ and $d$ are the airship length and maximum diameter ($=2b$) respectively.
Suppose we wish to minimize the drag with respect to the parameters $a$ and $b$ but fix the total volume of the airship envelope, $V = \frac{2}{3}\pi a b^2(1+\alpha)$. The following program does this using the slsqp
algorithm, for a volume of $200000\;\mathrm{m^3}$, that of the Hindenburg.
import numpy as np
from scipy.optimize import minimize
# air density (kg.m-3) and dynamic viscosity (Pa.s) at cruise altitude
rho, mu = 1.1, 1.5e-5
# air speed (m.s-1) at cruise altitude
v = 30
def CDV(l, d):
""" Calculate the drag coefficient. """
Re = rho * v * l / mu # Reynold's number
r = l / d # "Fineness" ratio
return (0.172 * r**(1/3) + 0.252 / r**1.2 + 1.032 / r**2.7) / Re**(1/6)
def D(X):
""" Return the total drag on the airship envelope. """
a, b = X
l = a * (1+alpha)
return 0.5 * rho * v**2 * V(X)**(2/3) * CDV(l, 2*b)
# Fixed total volume of the airship envelope (m3)
V0 = 2.e5
# Parameter describing the tapering of the stern of the envelope
alpha = 6
def V(X):
""" Return the volume of the envelope. """
a, b = X
return 2 * np.pi * a * b**2 * (1+alpha) / 3
# Minimize the drag, constraining the volume to be equal to V0
a0, b0 = 70, 45 # initial guesses for a, b
con = {'type': 'eq', 'fun': lambda X: V(X)-V0}
res = minimize(D, (a0, b0), method='slsqp', constraints=con)
if res['success']:
a, b = res['x']
l, d = a * (1+alpha), 2*b # length, greatest diameter
print('Optimum parameters: a = {:g} m, b = {:g} m'.format(a, b))
print('V = {:g} m3'.format(V(res['x'])))
print('Drag, D = {:g} N'.format(res['fun']))
print('Total length, l = {:g} m'.format(l))
print('Greatest diameter, d = {:g} m'.format(d))
print('Fineness ratio, l/d = {:g}'.format(l/d))
else:
# We failed to converge: output the results dictionary
print('Failed to minimize D!', res, sep='\n')
This example is a little contrived, since for fixed $\alpha$ the requirement that $V$ be constant means that $a$ and $b$ are not independent, but a solution is found readily enough:
Optimum parameters: a = 32.9301 m, b = 20.3536 m
V = 200000 m3
Drag, D = 20837.6 N
Total length, l = 230.51 m
Greatest diameter, d = 40.7071 m
Fineness ratio, l/d = 5.66266
The actual dimensions of the Hindenburg were $l=245\;\mathrm{m}, d=41\;\mathrm{m}$ giving a the ratio $l/d = 5.98$, so we didn't do too badly.