Skip to content

07. Goddard problem with one phase

How should a rocket vary its thrust to reach the greatest altitude with a fixed amount of propellant? This classical optimal control problem was posed by R. H. Goddard.

ItemDefinition
StatesRadial height hh, upward velocity vv, mass mm
ControlThrust TT
ObjectiveMaximize final height h(tf)h(t_f)
PhasesOne phase, 50 nodes, free final time
New conceptsMass consumption, maximization, and limitations near control discontinuities

Burning propellant makes the vehicle lighter, increasing acceleration for the same thrust. Flying faster increases drag quadratically, but climbing higher reduces atmospheric density. Maximum thrust from the start wastes energy against drag; very gentle thrust prolongs gravity losses. The optimum balances both losses with a time-varying thrust.

All quantities are dimensionless, with Earth radius, surface gravity, and initial mass normalized to 1. Here hh is measured from the planet’s center; height above the surface is h−1h-1.

h˙=v,v˙=T−D(h,v)m−g(h),m˙=−Tc.\dot h=v,\qquad\dot v=\frac{T-D(h,v)}m-g(h),\qquad\dot m=-\frac Tc. D(h,v)=Dcv2exp⁡ ⁣(−Hch−h0h0),g(h)=g0(h0h)2.D(h,v)=D_cv^2\exp\!\left(-H_c\frac{h-h_0}{h_0}\right),\qquad g(h)=g_0\left(\frac{h_0}h\right)^2.

Drag scales with speed squared and decreases exponentially with altitude. Gravity decreases with squared distance from the center. Exhaust velocity cc determines propellant consumption: larger cc uses less mass for the same thrust.

h(0)=1,v(0)=0,m(0)=1,v(tf)=0,m(tf)=0.6.h(0)=1,\quad v(0)=0,\quad m(0)=1,\qquad v(t_f)=0,\quad m(t_f)=0.6.

Start at rest on the surface. Finish at the highest point, with zero velocity and all available propellant consumed.

0≤T≤3.5,h≥1,v≥0,0.6≤m≤1,J=−h(tf).0\le T\le3.5,\quad h\ge1,\quad v\ge0,\quad0.6\le m\le1,\qquad J=-h(t_f).

Minimizing negative height maximizes height. Maximum thrust is 3.5 times initial weight.

SymbolMeaningValue
h0,g0,m0h_0,g_0,m_0Initial radius, surface gravity, initial mass1
DcD_cDrag coefficient factor310
HcH_cAtmospheric decay factor500
ccExhaust velocity0.5
Tmax⁡T_{\max}Maximum thrust3.5
mfm_fDry mass0.6

Use final time 0.3, cubic height from 1 to 1.01, cubic mass from 1 to 0.6, zero velocity, and a cubic thrust decrease from maximum to zero.

Height, velocity, mass, and thrust. Dots are the 50 optimized nodes; curves are polynomial interpolants.
Height, velocity, mass, and thrust. Dots are the 50 optimized nodes; curves are polynomial interpolants.
Vertical ascent. Flame length represents thrust. The unpowered portion plays at twice the speed.
  • Final radial height: 1.0128, about 1.3% of the planet’s radius above the surface.
  • Burnout occurs around 0.079; the rocket coasts to its highest point at 0.199.
  • Thrust follows maximum → intermediate → zero.

Maximum thrust initially builds speed against gravity. As drag grows, throttling back maintains a speed that balances drag and gravity losses. This interval of thrust strictly between its bounds is a singular arc. As the atmosphere thins, the rocket consumes the remaining propellant and coasts upward.

Unlike the bang-bang control in Example 02, the intermediate thrust must be determined by the physical balance. It can be difficult to handle with indirect methods, but a direct formulation needs no special treatment.

The interpolated thrust oscillates and falls gradually near burnout, although the true optimum switches discontinuously to zero. One polynomial through 50 nodes cannot represent that jump accurately (multiple phases). Example 08 splits near burnout to reduce the oscillation.

  • Change the node count from 50 to 30 or 80 and compare oscillations and final height.
  • Reduce PARAMETERS["Dc"] and check whether the singular arc shortens and maximum-thrust operation lasts longer.
  • Lower T_max and compare the time spent at the thrust limit.
Terminal window
uv run python examples/07_goddard_0knot.py

View the Python source on GitHub.