Two-Burn Orbit Raise#
This example demonstrates the use of a Trajectory to encapsulate a three-phase orbit raising maneuver with a burn-coast-burn phase sequence. This example is based on the problem provided in Enright [EC91].
The dynamics are given by
The initial conditions are
and the final conditions are
Building and running the problem#
The following code instantiates our problem, our trajectory, three phases, and links them accordingly. The spacecraft initial position, velocity, and acceleration magnitude are fixed. The objective is to minimize the delta-V needed to raise the spacecraft into a circular orbit at 3 Earth radii.
Note the call to link_phases which provides time, position, velocity, and delta-V continuity across all phases, and acceleration continuity between the first and second burn phases. Acceleration is 0 during the coast phase. Alternatively, we could have specified a different ODE for the coast phase, as in the example.
This example runs inconsistently with SLSQP but is solved handily by IPOPT and SNOPT.
Show code cell outputs
import numpy as np
import openmdao.api as om
import openmdao.utils.units as units
# Add canonical units to OpenMDAO
MU_earth = 3.986592936294783e14
R_earth = 6378137.0
period = 2 * np.pi * np.sqrt(R_earth**3 / MU_earth)
# Add canonical time and distance units for these EOM
units.add_unit('TU', '{0}*s'.format(period))
units.add_unit('DU', '{0}*m'.format(R_earth))
class FiniteBurnODE(om.ExplicitComponent):
def initialize(self):
self.options.declare('num_nodes', types=int)
def setup(self):
nn = self.options['num_nodes']
# Inputs
self.add_input('r',
val=np.ones(nn),
desc='radius from center of attraction',
units='DU')
self.add_input('theta',
val=np.zeros(nn),
desc='anomaly term',
units='rad')
self.add_input('vr',
val=np.zeros(nn),
desc='local vertical velocity component',
units='DU/TU')
self.add_input('vt',
val=np.zeros(nn),
desc='local horizontal velocity component',
units='DU/TU')
self.add_input('accel',
val=np.zeros(nn),
desc='acceleration due to thrust',
units='DU/TU**2')
self.add_input('u1',
val=np.zeros(nn),
desc='thrust angle above local horizontal',
units='rad')
self.add_input('c',
val=np.zeros(nn),
desc='exhaust velocity',
units='DU/TU')
self.add_output('r_dot',
val=np.ones(nn),
desc='rate of change of radius from center of attraction',
units='DU/TU')
self.add_output('theta_dot',
val=np.zeros(nn),
desc='rate of change of anomaly term',
units='rad/TU')
self.add_output('vr_dot',
val=np.zeros(nn),
desc='rate of change of local vertical velocity component',
units='DU/TU**2')
self.add_output('vt_dot',
val=np.zeros(nn),
desc='rate of change of local horizontal velocity component',
units='DU/TU**2')
self.add_output('at_dot',
val=np.zeros(nn),
desc='rate of change of acceleration due to thrust',
units='DU/TU**3')
self.add_output('deltav_dot',
val=np.zeros(nn),
desc='rate of change of delta-V',
units='DU/TU**2')
self.add_output('pos_x',
val=np.zeros(nn),
desc='x-component of position',
units='DU')
self.add_output('pos_y',
val=np.zeros(nn),
desc='x-component of position',
units='DU')
# Setup partials
ar = np.arange(self.options['num_nodes'])
# r dot is a linear function of vr, so provide the partial value here
self.declare_partials(of='r_dot', wrt='vr', rows=ar, cols=ar, val=1.0)
self.declare_partials(of='theta_dot', wrt='r', rows=ar, cols=ar)
self.declare_partials(of='theta_dot', wrt='vt', rows=ar, cols=ar)
self.declare_partials(of='vr_dot', wrt='r', rows=ar, cols=ar)
self.declare_partials(of='vr_dot', wrt='vt', rows=ar, cols=ar)
self.declare_partials(of='vr_dot', wrt='accel', rows=ar, cols=ar)
self.declare_partials(of='vr_dot', wrt='u1', rows=ar, cols=ar)
self.declare_partials(of='vt_dot', wrt='r', rows=ar, cols=ar)
self.declare_partials(of='vt_dot', wrt='vr', rows=ar, cols=ar)
self.declare_partials(of='vt_dot', wrt='vt', rows=ar, cols=ar)
self.declare_partials(of='vt_dot', wrt='accel', rows=ar, cols=ar)
self.declare_partials(of='vt_dot', wrt='u1', rows=ar, cols=ar)
self.declare_partials(of='at_dot', wrt='accel', rows=ar, cols=ar)
self.declare_partials(of='at_dot', wrt='c', rows=ar, cols=ar)
self.declare_partials(of='deltav_dot', wrt='accel', rows=ar, cols=ar, val=1.0)
self.declare_partials(of='pos_x', wrt='r', rows=ar, cols=ar)
self.declare_partials(of='pos_x', wrt='theta', rows=ar, cols=ar)
self.declare_partials(of='pos_y', wrt='r', rows=ar, cols=ar)
self.declare_partials(of='pos_y', wrt='theta', rows=ar, cols=ar)
def compute(self, inputs, outputs):
r = inputs['r']
theta = inputs['theta']
vr = inputs['vr']
vt = inputs['vt']
at = inputs['accel']
u1 = inputs['u1']
c = inputs['c']
outputs['r_dot'] = vr
outputs['theta_dot'] = vt / r
outputs['vr_dot'] = vt**2 / r - 1 / r**2 + at * np.sin(u1)
outputs['vt_dot'] = -vr * vt / r + at * np.cos(u1)
outputs['at_dot'] = at**2 / c
outputs['deltav_dot'] = at
outputs['pos_x'] = r * np.cos(theta)
outputs['pos_y'] = r * np.sin(theta)
def compute_partials(self, inputs, partials):
r = inputs['r']
theta = inputs['theta']
vr = inputs['vr']
vt = inputs['vt']
at = inputs['accel']
u1 = inputs['u1']
c = inputs['c']
su1 = np.sin(u1)
cu1 = np.cos(u1)
partials['theta_dot', 'r'] = -vt / r**2
partials['theta_dot', 'vt'] = 1.0 / r
partials['vr_dot', 'r'] = -vt**2 / r**2 + 2.0 / r**3
partials['vr_dot', 'vt'] = 2 * vt / r
partials['vr_dot', 'accel'] = su1
partials['vr_dot', 'u1'] = at * cu1
partials['vt_dot', 'r'] = vr * vt / r**2
partials['vt_dot', 'vr'] = -vt / r
partials['vt_dot', 'vt'] = -vr / r
partials['vt_dot', 'accel'] = cu1
partials['vt_dot', 'u1'] = -at * su1
partials['at_dot', 'accel'] = 2 * at / c
partials['at_dot', 'c'] = -at**2 / c**2
partials['pos_x', 'r'] = np.cos(theta)
partials['pos_x', 'theta'] = -r * np.sin(theta)
partials['pos_y', 'r'] = np.sin(theta)
partials['pos_y', 'theta'] = r * np.cos(theta)
import numpy as np
import openmdao.api as om
import dymos as dm
import matplotlib.pyplot as plt
from dymos.examples.finite_burn_orbit_raise.finite_burn_eom import FiniteBurnODE
p = om.Problem(model=om.Group())
p.driver = om.pyOptSparseDriver()
p.driver.options['optimizer'] = 'IPOPT'
p.driver.declare_coloring()
traj = dm.Trajectory()
traj.add_parameter('c', opt=False, val=1.5, units='DU/TU',
targets={'burn1': ['c'], 'coast': ['c'], 'burn2': ['c']})
# First Phase (burn)
burn1 = dm.Phase(ode_class=FiniteBurnODE,
transcription=dm.GaussLobatto(num_segments=5, order=3, compressed=False))
burn1 = traj.add_phase('burn1', burn1)
burn1.set_time_options(fix_initial=True, duration_bounds=(.5, 10), units='TU')
burn1.add_state('r', fix_initial=True, fix_final=False, defect_scaler=100.0,
rate_source='r_dot', units='DU')
burn1.add_state('theta', fix_initial=True, fix_final=False, defect_scaler=100.0,
rate_source='theta_dot', units='rad')
burn1.add_state('vr', fix_initial=True, fix_final=False, defect_scaler=100.0,
rate_source='vr_dot', units='DU/TU')
burn1.add_state('vt', fix_initial=True, fix_final=False, defect_scaler=100.0,
rate_source='vt_dot', units='DU/TU')
burn1.add_state('accel', fix_initial=True, fix_final=False,
rate_source='at_dot', units='DU/TU**2')
burn1.add_state('deltav', fix_initial=True, fix_final=False,
rate_source='deltav_dot', units='DU/TU')
burn1.add_control('u1', rate_continuity=True, rate2_continuity=True, units='deg',
scaler=0.01, rate_continuity_scaler=0.001, rate2_continuity_scaler=0.001,
lower=-30, upper=30)
# Second Phase (Coast)
coast = dm.Phase(ode_class=FiniteBurnODE,
transcription=dm.GaussLobatto(num_segments=5, order=3, compressed=False))
coast.set_time_options(initial_bounds=(0.5, 20), duration_bounds=(.5, 50), duration_ref=50,
units='TU')
coast.add_state('r', fix_initial=False, fix_final=False, defect_scaler=100.0,
rate_source='r_dot', targets=['r'], units='DU')
coast.add_state('theta', fix_initial=False, fix_final=False, defect_scaler=100.0,
rate_source='theta_dot', targets=['theta'], units='rad')
coast.add_state('vr', fix_initial=False, fix_final=False, defect_scaler=100.0,
rate_source='vr_dot', targets=['vr'], units='DU/TU')
coast.add_state('vt', fix_initial=False, fix_final=False, defect_scaler=100.0,
rate_source='vt_dot', targets=['vt'], units='DU/TU')
coast.add_state('accel', fix_initial=True, fix_final=True,
rate_source='at_dot', targets=['accel'], units='DU/TU**2')
coast.add_state('deltav', fix_initial=False, fix_final=False,
rate_source='deltav_dot', units='DU/TU')
coast.add_parameter('u1', opt=False, val=0.0, units='deg', targets=['u1'])
# Third Phase (burn)
burn2 = dm.Phase(ode_class=FiniteBurnODE,
transcription=dm.GaussLobatto(num_segments=5, order=3, compressed=False))
traj.add_phase('coast', coast)
traj.add_phase('burn2', burn2)
burn2.set_time_options(initial_bounds=(0.5, 50), duration_bounds=(.5, 10), initial_ref=10,
units='TU')
burn2.add_state('r', fix_initial=False, fix_final=True, defect_scaler=100.0,
rate_source='r_dot', units='DU')
burn2.add_state('theta', fix_initial=False, fix_final=False, defect_scaler=100.0,
rate_source='theta_dot', units='rad')
burn2.add_state('vr', fix_initial=False, fix_final=True, defect_scaler=1000.0,
rate_source='vr_dot', units='DU/TU')
burn2.add_state('vt', fix_initial=False, fix_final=True, defect_scaler=1000.0,
rate_source='vt_dot', units='DU/TU')
burn2.add_state('accel', fix_initial=False, fix_final=False, defect_scaler=1.0,
rate_source='at_dot', units='DU/TU**2')
burn2.add_state('deltav', fix_initial=False, fix_final=False, defect_scaler=1.0,
rate_source='deltav_dot', units='DU/TU')
burn2.add_objective('deltav', loc='final', scaler=100.0)
burn2.add_control('u1', rate_continuity=True, rate2_continuity=True, units='deg',
scaler=0.01, lower=-90, upper=90)
burn1.add_timeseries_output('pos_x')
coast.add_timeseries_output('pos_x')
burn2.add_timeseries_output('pos_x')
burn1.add_timeseries_output('pos_y')
coast.add_timeseries_output('pos_y')
burn2.add_timeseries_output('pos_y')
# Link Phases
traj.link_phases(phases=['burn1', 'coast', 'burn2'],
vars=['time', 'r', 'theta', 'vr', 'vt', 'deltav'])
traj.link_phases(phases=['burn1', 'burn2'], vars=['accel'])
p.model.add_subsystem('traj', subsys=traj)
# Finish Problem Setup
p.setup(check=True)
# Set Initial Guesses
p.set_val('traj.parameters:c', val=1.5, units='DU/TU')
burn1 = p.model.traj.phases.burn1
burn2 = p.model.traj.phases.burn2
coast = p.model.traj.phases.coast
p.set_val('traj.burn1.t_initial', val=0.0)
p.set_val('traj.burn1.t_duration', val=2.25)
p.set_val('traj.burn1.states:r', val=burn1.interp('r', [1, 1.5]))
p.set_val('traj.burn1.states:theta', val=burn1.interp('theta', [0, 1.7]))
p.set_val('traj.burn1.states:vr', val=burn1.interp('vr', [0, 0]))
p.set_val('traj.burn1.states:vt', val=burn1.interp('vt', [1, 1]))
p.set_val('traj.burn1.states:accel', val=burn1.interp('accel', [0.1, 0]))
p.set_val('traj.burn1.states:deltav', val=burn1.interp('deltav', [0, 0.1]))
p.set_val('traj.burn1.controls:u1', val=burn1.interp('u1', [-3.5, 13.0]))
p.set_val('traj.coast.t_initial', val=2.25)
p.set_val('traj.coast.t_duration', val=3.0)
p.set_val('traj.coast.states:r', val=coast.interp('r', [1.3, 1.5]))
p.set_val('traj.coast.states:theta', val=coast.interp('theta', [2.1767, 1.7]))
p.set_val('traj.coast.states:vr', val=coast.interp('vr', [0.3285, 0]))
p.set_val('traj.coast.states:vt', val=coast.interp('vt', [0.97, 1]))
p.set_val('traj.coast.states:accel', val=coast.interp('accel', [0, 0]))
p.set_val('traj.burn2.t_initial', val=5.25)
p.set_val('traj.burn2.t_duration', val=1.75)
p.set_val('traj.burn2.states:r', val=burn2.interp('r', [1, 3.]))
p.set_val('traj.burn2.states:theta', val=burn2.interp('theta', [0, 4.0]))
p.set_val('traj.burn2.states:vr', val=burn2.interp('vr', [0, 0]))
p.set_val('traj.burn2.states:vt', val=burn2.interp('vt', [1, np.sqrt(1 / 3.)]))
p.set_val('traj.burn2.states:deltav', val=burn2.interp('deltav', [0.1, 0.2]))
p.set_val('traj.burn2.states:accel', val=burn2.interp('accel', [0.1, 0]))
p.set_val('traj.burn2.controls:u1', val=burn2.interp('u1', [0, 0]))
dm.run_problem(p, simulate=True)
--- Constraint Report [traj] ---
--- burn1 ---
None
--- coast ---
None
--- burn2 ---
None
INFO: checking out_of_order
INFO:check_config:checking out_of_order
INFO: checking system
INFO:check_config:checking system
INFO: checking solvers
INFO:check_config:checking solvers
INFO: checking dup_inputs
INFO:check_config:checking dup_inputs
INFO: checking missing_recorders
INFO:check_config:checking missing_recorders
WARNING: The Problem has no recorder of any kind attached
WARNING:check_config:The Problem has no recorder of any kind attached
INFO: checking unserializable_options
INFO:check_config:checking unserializable_options
INFO: checking comp_has_no_outputs
INFO:check_config:checking comp_has_no_outputs
INFO: checking auto_ivc_warnings
INFO:check_config:checking auto_ivc_warnings
Model viewer data has already been recorded for Driver.
INFO: checking out_of_order
INFO:check_config:checking out_of_order
INFO: checking system
INFO:check_config:checking system
INFO: checking solvers
INFO:check_config:checking solvers
INFO: checking dup_inputs
INFO:check_config:checking dup_inputs
INFO: checking missing_recorders
INFO:check_config:checking missing_recorders
WARNING: The Problem has no recorder of any kind attached
WARNING:check_config:The Problem has no recorder of any kind attached
INFO: checking unserializable_options
INFO:check_config:checking unserializable_options
INFO: checking comp_has_no_outputs
INFO:check_config:checking comp_has_no_outputs
INFO: checking auto_ivc_warnings
INFO:check_config:checking auto_ivc_warnings
Full total jacobian was computed 3 times, taking 0.630243 seconds.
Total jacobian shape: (112, 204)
Jacobian shape: (112, 204) ( 3.64% nonzero)
FWD solves: 13 REV solves: 0
Total colors vs. total size: 13 vs 204 (93.6% improvement)
Sparsity computed using tolerance: 1e-25
Time to compute sparsity: 0.630243 sec.
Time to compute coloring: 0.096487 sec.
Memory to compute coloring: 0.000000 MB.
Optimization Problem -- Optimization using pyOpt_sparse
================================================================================
Objective Function: _objfunc
Solution:
--------------------------------------------------------------------------------
Total Time: 2.8257
User Objective Time : 0.1559
User Sensitivity Time : 2.2760
Interface Time : 0.2102
Opt Solver Time: 0.1835
Calls to Objective Function : 28
Calls to Sens Function : 28
Objectives
Index Name Value
0 traj.phases.burn2.indep_states.states:deltav 3.989839E+01
Variables (c - continuous, i - integer, d - discrete)
Index Name Type Lower Bound Value Upper Bound Status
0 traj.burn1.t_duration_0 c 5.000000E-01 2.228030E+00 1.000000E+01
1 traj.phases.burn1.indep_states.states:r_0 c -1.000000E+21 1.002411E+00 1.000000E+21
2 traj.phases.burn1.indep_states.states:r_1 c -1.000000E+21 1.002411E+00 1.000000E+21
3 traj.phases.burn1.indep_states.states:r_2 c -1.000000E+21 1.021674E+00 1.000000E+21
4 traj.phases.burn1.indep_states.states:r_3 c -1.000000E+21 1.021674E+00 1.000000E+21
5 traj.phases.burn1.indep_states.states:r_4 c -1.000000E+21 1.072668E+00 1.000000E+21
6 traj.phases.burn1.indep_states.states:r_5 c -1.000000E+21 1.072668E+00 1.000000E+21
7 traj.phases.burn1.indep_states.states:r_6 c -1.000000E+21 1.162426E+00 1.000000E+21
8 traj.phases.burn1.indep_states.states:r_7 c -1.000000E+21 1.162426E+00 1.000000E+21
9 traj.phases.burn1.indep_states.states:r_8 c -1.000000E+21 1.289870E+00 1.000000E+21
10 traj.phases.burn1.indep_states.states:theta_0 c -1.000000E+21 4.551154E-01 1.000000E+21
11 traj.phases.burn1.indep_states.states:theta_1 c -1.000000E+21 4.551154E-01 1.000000E+21
12 traj.phases.burn1.indep_states.states:theta_2 c -1.000000E+21 9.219251E-01 1.000000E+21
13 traj.phases.burn1.indep_states.states:theta_3 c -1.000000E+21 9.219251E-01 1.000000E+21
14 traj.phases.burn1.indep_states.states:theta_4 c -1.000000E+21 1.378635E+00 1.000000E+21
15 traj.phases.burn1.indep_states.states:theta_5 c -1.000000E+21 1.378635E+00 1.000000E+21
16 traj.phases.burn1.indep_states.states:theta_6 c -1.000000E+21 1.798766E+00 1.000000E+21
17 traj.phases.burn1.indep_states.states:theta_7 c -1.000000E+21 1.798766E+00 1.000000E+21
18 traj.phases.burn1.indep_states.states:theta_8 c -1.000000E+21 2.165052E+00 1.000000E+21
19 traj.phases.burn1.indep_states.states:vr_0 c -1.000000E+21 1.772243E-02 1.000000E+21
20 traj.phases.burn1.indep_states.states:vr_1 c -1.000000E+21 1.772243E-02 1.000000E+21
21 traj.phases.burn1.indep_states.states:vr_2 c -1.000000E+21 7.447792E-02 1.000000E+21
22 traj.phases.burn1.indep_states.states:vr_3 c -1.000000E+21 7.447792E-02 1.000000E+21
23 traj.phases.burn1.indep_states.states:vr_4 c -1.000000E+21 1.570336E-01 1.000000E+21
24 traj.phases.burn1.indep_states.states:vr_5 c -1.000000E+21 1.570336E-01 1.000000E+21
25 traj.phases.burn1.indep_states.states:vr_6 c -1.000000E+21 2.452608E-01 1.000000E+21
26 traj.phases.burn1.indep_states.states:vr_7 c -1.000000E+21 2.452608E-01 1.000000E+21
27 traj.phases.burn1.indep_states.states:vr_8 c -1.000000E+21 3.247035E-01 1.000000E+21
28 traj.phases.burn1.indep_states.states:vt_0 c -1.000000E+21 1.042686E+00 1.000000E+21
29 traj.phases.burn1.indep_states.states:vt_1 c -1.000000E+21 1.042686E+00 1.000000E+21
30 traj.phases.burn1.indep_states.states:vt_2 c -1.000000E+21 1.069132E+00 1.000000E+21
31 traj.phases.burn1.indep_states.states:vt_3 c -1.000000E+21 1.069132E+00 1.000000E+21
32 traj.phases.burn1.indep_states.states:vt_4 c -1.000000E+21 1.065074E+00 1.000000E+21
33 traj.phases.burn1.indep_states.states:vt_5 c -1.000000E+21 1.065074E+00 1.000000E+21
34 traj.phases.burn1.indep_states.states:vt_6 c -1.000000E+21 1.030094E+00 1.000000E+21
35 traj.phases.burn1.indep_states.states:vt_7 c -1.000000E+21 1.030094E+00 1.000000E+21
36 traj.phases.burn1.indep_states.states:vt_8 c -1.000000E+21 9.761629E-01 1.000000E+21
37 traj.phases.burn1.indep_states.states:accel_0 c -1.000000E+21 1.030617E-01 1.000000E+21
38 traj.phases.burn1.indep_states.states:accel_1 c -1.000000E+21 1.030617E-01 1.000000E+21
39 traj.phases.burn1.indep_states.states:accel_2 c -1.000000E+21 1.063167E-01 1.000000E+21
40 traj.phases.burn1.indep_states.states:accel_3 c -1.000000E+21 1.063167E-01 1.000000E+21
41 traj.phases.burn1.indep_states.states:accel_4 c -1.000000E+21 1.097841E-01 1.000000E+21
42 traj.phases.burn1.indep_states.states:accel_5 c -1.000000E+21 1.097841E-01 1.000000E+21
43 traj.phases.burn1.indep_states.states:accel_6 c -1.000000E+21 1.134853E-01 1.000000E+21
44 traj.phases.burn1.indep_states.states:accel_7 c -1.000000E+21 1.134853E-01 1.000000E+21
45 traj.phases.burn1.indep_states.states:accel_8 c -1.000000E+21 1.174447E-01 1.000000E+21
46 traj.phases.burn1.indep_states.states:deltav_0 c -1.000000E+21 4.523589E-02 1.000000E+21
47 traj.phases.burn1.indep_states.states:deltav_1 c -1.000000E+21 4.523589E-02 1.000000E+21
48 traj.phases.burn1.indep_states.states:deltav_2 c -1.000000E+21 9.187850E-02 1.000000E+21
49 traj.phases.burn1.indep_states.states:deltav_3 c -1.000000E+21 9.187850E-02 1.000000E+21
50 traj.phases.burn1.indep_states.states:deltav_4 c -1.000000E+21 1.400181E-01 1.000000E+21
51 traj.phases.burn1.indep_states.states:deltav_5 c -1.000000E+21 1.400181E-01 1.000000E+21
52 traj.phases.burn1.indep_states.states:deltav_6 c -1.000000E+21 1.897541E-01 1.000000E+21
53 traj.phases.burn1.indep_states.states:deltav_7 c -1.000000E+21 1.897541E-01 1.000000E+21
54 traj.phases.burn1.indep_states.states:deltav_8 c -1.000000E+21 2.411959E-01 1.000000E+21
55 traj.phases.burn1.control_group.indep_controls.controls:u1_0 c -3.000000E-01 -3.871082E-02 3.000000E-01
56 traj.phases.burn1.control_group.indep_controls.controls:u1_1 c -3.000000E-01 -2.977418E-02 3.000000E-01
57 traj.phases.burn1.control_group.indep_controls.controls:u1_2 c -3.000000E-01 -1.798095E-02 3.000000E-01
58 traj.phases.burn1.control_group.indep_controls.controls:u1_3 c -3.000000E-01 -1.798095E-02 3.000000E-01
59 traj.phases.burn1.control_group.indep_controls.controls:u1_4 c -3.000000E-01 -3.205161E-03 3.000000E-01
60 traj.phases.burn1.control_group.indep_controls.controls:u1_5 c -3.000000E-01 1.467911E-02 3.000000E-01
61 traj.phases.burn1.control_group.indep_controls.controls:u1_6 c -3.000000E-01 1.467911E-02 3.000000E-01
62 traj.phases.burn1.control_group.indep_controls.controls:u1_7 c -3.000000E-01 3.450564E-02 3.000000E-01
63 traj.phases.burn1.control_group.indep_controls.controls:u1_8 c -3.000000E-01 5.510823E-02 3.000000E-01
64 traj.phases.burn1.control_group.indep_controls.controls:u1_9 c -3.000000E-01 5.510823E-02 3.000000E-01
65 traj.phases.burn1.control_group.indep_controls.controls:u1_10 c -3.000000E-01 7.549970E-02 3.000000E-01
66 traj.phases.burn1.control_group.indep_controls.controls:u1_11 c -3.000000E-01 9.469292E-02 3.000000E-01
67 traj.phases.burn1.control_group.indep_controls.controls:u1_12 c -3.000000E-01 9.469292E-02 3.000000E-01
68 traj.phases.burn1.control_group.indep_controls.controls:u1_13 c -3.000000E-01 1.125798E-01 3.000000E-01
69 traj.phases.burn1.control_group.indep_controls.controls:u1_14 c -3.000000E-01 1.290522E-01 3.000000E-01
70 traj.burn2.t_initial_0 c 5.000000E-02 9.614472E-01 5.000000E+00
71 traj.burn2.t_duration_0 c 5.000000E-01 1.275260E+00 1.000000E+01
72 traj.phases.burn2.indep_states.states:r_0 c -1.000000E+21 2.985662E+00 1.000000E+21
73 traj.phases.burn2.indep_states.states:r_1 c -1.000000E+21 2.992648E+00 1.000000E+21
74 traj.phases.burn2.indep_states.states:r_2 c -1.000000E+21 2.992648E+00 1.000000E+21
75 traj.phases.burn2.indep_states.states:r_3 c -1.000000E+21 2.996948E+00 1.000000E+21
76 traj.phases.burn2.indep_states.states:r_4 c -1.000000E+21 2.996948E+00 1.000000E+21
77 traj.phases.burn2.indep_states.states:r_5 c -1.000000E+21 2.999153E+00 1.000000E+21
78 traj.phases.burn2.indep_states.states:r_6 c -1.000000E+21 2.999153E+00 1.000000E+21
79 traj.phases.burn2.indep_states.states:r_7 c -1.000000E+21 2.999922E+00 1.000000E+21
80 traj.phases.burn2.indep_states.states:r_8 c -1.000000E+21 2.999922E+00 1.000000E+21
81 traj.phases.burn2.indep_states.states:theta_0 c -1.000000E+21 4.156692E+00 1.000000E+21
82 traj.phases.burn2.indep_states.states:theta_1 c -1.000000E+21 4.193917E+00 1.000000E+21
83 traj.phases.burn2.indep_states.states:theta_2 c -1.000000E+21 4.193917E+00 1.000000E+21
84 traj.phases.burn2.indep_states.states:theta_3 c -1.000000E+21 4.233604E+00 1.000000E+21
85 traj.phases.burn2.indep_states.states:theta_4 c -1.000000E+21 4.233604E+00 1.000000E+21
86 traj.phases.burn2.indep_states.states:theta_5 c -1.000000E+21 4.275859E+00 1.000000E+21
87 traj.phases.burn2.indep_states.states:theta_6 c -1.000000E+21 4.275859E+00 1.000000E+21
88 traj.phases.burn2.indep_states.states:theta_7 c -1.000000E+21 4.320784E+00 1.000000E+21
89 traj.phases.burn2.indep_states.states:theta_8 c -1.000000E+21 4.320784E+00 1.000000E+21
90 traj.phases.burn2.indep_states.states:theta_9 c -1.000000E+21 4.368465E+00 1.000000E+21
91 traj.phases.burn2.indep_states.states:vr_0 c -1.000000E+21 3.335965E-02 1.000000E+21
92 traj.phases.burn2.indep_states.states:vr_1 c -1.000000E+21 2.176356E-02 1.000000E+21
93 traj.phases.burn2.indep_states.states:vr_2 c -1.000000E+21 2.176356E-02 1.000000E+21
94 traj.phases.burn2.indep_states.states:vr_3 c -1.000000E+21 1.234448E-02 1.000000E+21
95 traj.phases.burn2.indep_states.states:vr_4 c -1.000000E+21 1.234448E-02 1.000000E+21
96 traj.phases.burn2.indep_states.states:vr_5 c -1.000000E+21 5.372873E-03 1.000000E+21
97 traj.phases.burn2.indep_states.states:vr_6 c -1.000000E+21 5.372873E-03 1.000000E+21
98 traj.phases.burn2.indep_states.states:vr_7 c -1.000000E+21 1.148444E-03 1.000000E+21
99 traj.phases.burn2.indep_states.states:vr_8 c -1.000000E+21 1.148444E-03 1.000000E+21
100 traj.phases.burn2.indep_states.states:vt_0 c -1.000000E+21 4.217795E-01 1.000000E+21
101 traj.phases.burn2.indep_states.states:vt_1 c -1.000000E+21 4.510118E-01 1.000000E+21
102 traj.phases.burn2.indep_states.states:vt_2 c -1.000000E+21 4.510118E-01 1.000000E+21
103 traj.phases.burn2.indep_states.states:vt_3 c -1.000000E+21 4.812208E-01 1.000000E+21
104 traj.phases.burn2.indep_states.states:vt_4 c -1.000000E+21 4.812208E-01 1.000000E+21
105 traj.phases.burn2.indep_states.states:vt_5 c -1.000000E+21 5.123842E-01 1.000000E+21
106 traj.phases.burn2.indep_states.states:vt_6 c -1.000000E+21 5.123842E-01 1.000000E+21
107 traj.phases.burn2.indep_states.states:vt_7 c -1.000000E+21 5.444541E-01 1.000000E+21
108 traj.phases.burn2.indep_states.states:vt_8 c -1.000000E+21 5.444541E-01 1.000000E+21
109 traj.phases.burn2.indep_states.states:accel_0 c -1.000000E+21 1.174447E-01 1.000000E+21
110 traj.phases.burn2.indep_states.states:accel_1 c -1.000000E+21 1.198378E-01 1.000000E+21
111 traj.phases.burn2.indep_states.states:accel_2 c -1.000000E+21 1.198378E-01 1.000000E+21
112 traj.phases.burn2.indep_states.states:accel_3 c -1.000000E+21 1.223305E-01 1.000000E+21
113 traj.phases.burn2.indep_states.states:accel_4 c -1.000000E+21 1.223305E-01 1.000000E+21
114 traj.phases.burn2.indep_states.states:accel_5 c -1.000000E+21 1.249291E-01 1.000000E+21
115 traj.phases.burn2.indep_states.states:accel_6 c -1.000000E+21 1.249291E-01 1.000000E+21
116 traj.phases.burn2.indep_states.states:accel_7 c -1.000000E+21 1.276404E-01 1.000000E+21
117 traj.phases.burn2.indep_states.states:accel_8 c -1.000000E+21 1.276404E-01 1.000000E+21
118 traj.phases.burn2.indep_states.states:accel_9 c -1.000000E+21 1.304721E-01 1.000000E+21
119 traj.phases.burn2.indep_states.states:deltav_0 c -1.000000E+21 2.411959E-01 1.000000E+21
120 traj.phases.burn2.indep_states.states:deltav_1 c -1.000000E+21 2.714535E-01 1.000000E+21
121 traj.phases.burn2.indep_states.states:deltav_2 c -1.000000E+21 2.714535E-01 1.000000E+21
122 traj.phases.burn2.indep_states.states:deltav_3 c -1.000000E+21 3.023341E-01 1.000000E+21
123 traj.phases.burn2.indep_states.states:deltav_4 c -1.000000E+21 3.023341E-01 1.000000E+21
124 traj.phases.burn2.indep_states.states:deltav_5 c -1.000000E+21 3.338638E-01 1.000000E+21
125 traj.phases.burn2.indep_states.states:deltav_6 c -1.000000E+21 3.338638E-01 1.000000E+21
126 traj.phases.burn2.indep_states.states:deltav_7 c -1.000000E+21 3.660705E-01 1.000000E+21
127 traj.phases.burn2.indep_states.states:deltav_8 c -1.000000E+21 3.660705E-01 1.000000E+21
128 traj.phases.burn2.indep_states.states:deltav_9 c -1.000000E+21 3.989839E-01 1.000000E+21
129 traj.phases.burn2.control_group.indep_controls.controls:u1_0 c -9.000000E-01 1.545347E-02 9.000000E-01
130 traj.phases.burn2.control_group.indep_controls.controls:u1_1 c -9.000000E-01 1.315257E-02 9.000000E-01
131 traj.phases.burn2.control_group.indep_controls.controls:u1_2 c -9.000000E-01 1.113035E-02 9.000000E-01
132 traj.phases.burn2.control_group.indep_controls.controls:u1_3 c -9.000000E-01 1.113035E-02 9.000000E-01
133 traj.phases.burn2.control_group.indep_controls.controls:u1_4 c -9.000000E-01 9.453512E-03 9.000000E-01
134 traj.phases.burn2.control_group.indep_controls.controls:u1_5 c -9.000000E-01 8.188743E-03 9.000000E-01
135 traj.phases.burn2.control_group.indep_controls.controls:u1_6 c -9.000000E-01 8.188743E-03 9.000000E-01
136 traj.phases.burn2.control_group.indep_controls.controls:u1_7 c -9.000000E-01 7.310470E-03 9.000000E-01
137 traj.phases.burn2.control_group.indep_controls.controls:u1_8 c -9.000000E-01 6.793120E-03 9.000000E-01
138 traj.phases.burn2.control_group.indep_controls.controls:u1_9 c -9.000000E-01 6.793120E-03 9.000000E-01
139 traj.phases.burn2.control_group.indep_controls.controls:u1_10 c -9.000000E-01 6.670239E-03 9.000000E-01
140 traj.phases.burn2.control_group.indep_controls.controls:u1_11 c -9.000000E-01 6.975374E-03 9.000000E-01
141 traj.phases.burn2.control_group.indep_controls.controls:u1_12 c -9.000000E-01 6.975374E-03 9.000000E-01
142 traj.phases.burn2.control_group.indep_controls.controls:u1_13 c -9.000000E-01 7.640932E-03 9.000000E-01
143 traj.phases.burn2.control_group.indep_controls.controls:u1_14 c -9.000000E-01 8.599319E-03 9.000000E-01
144 traj.coast.t_initial_0 c 5.000000E-01 2.228030E+00 2.000000E+01
145 traj.coast.t_duration_0 c 1.000000E-02 1.477288E-01 1.000000E+00
146 traj.phases.coast.indep_states.states:r_0 c -1.000000E+21 1.289870E+00 1.000000E+21
147 traj.phases.coast.indep_states.states:r_1 c -1.000000E+21 1.826968E+00 1.000000E+21
148 traj.phases.coast.indep_states.states:r_2 c -1.000000E+21 1.826968E+00 1.000000E+21
149 traj.phases.coast.indep_states.states:r_3 c -1.000000E+21 2.302606E+00 1.000000E+21
150 traj.phases.coast.indep_states.states:r_4 c -1.000000E+21 2.302606E+00 1.000000E+21
151 traj.phases.coast.indep_states.states:r_5 c -1.000000E+21 2.652890E+00 1.000000E+21
152 traj.phases.coast.indep_states.states:r_6 c -1.000000E+21 2.652890E+00 1.000000E+21
153 traj.phases.coast.indep_states.states:r_7 c -1.000000E+21 2.878553E+00 1.000000E+21
154 traj.phases.coast.indep_states.states:r_8 c -1.000000E+21 2.878553E+00 1.000000E+21
155 traj.phases.coast.indep_states.states:r_9 c -1.000000E+21 2.985662E+00 1.000000E+21
156 traj.phases.coast.indep_states.states:theta_0 c -1.000000E+21 2.165052E+00 1.000000E+21
157 traj.phases.coast.indep_states.states:theta_1 c -1.000000E+21 2.959738E+00 1.000000E+21
158 traj.phases.coast.indep_states.states:theta_2 c -1.000000E+21 2.959738E+00 1.000000E+21
159 traj.phases.coast.indep_states.states:theta_3 c -1.000000E+21 3.397868E+00 1.000000E+21
160 traj.phases.coast.indep_states.states:theta_4 c -1.000000E+21 3.397868E+00 1.000000E+21
161 traj.phases.coast.indep_states.states:theta_5 c -1.000000E+21 3.699817E+00 1.000000E+21
162 traj.phases.coast.indep_states.states:theta_6 c -1.000000E+21 3.699817E+00 1.000000E+21
163 traj.phases.coast.indep_states.states:theta_7 c -1.000000E+21 3.941656E+00 1.000000E+21
164 traj.phases.coast.indep_states.states:theta_8 c -1.000000E+21 3.941656E+00 1.000000E+21
165 traj.phases.coast.indep_states.states:theta_9 c -1.000000E+21 4.156692E+00 1.000000E+21
166 traj.phases.coast.indep_states.states:vr_0 c -1.000000E+21 3.247035E-01 1.000000E+21
167 traj.phases.coast.indep_states.states:vr_1 c -1.000000E+21 3.587987E-01 1.000000E+21
168 traj.phases.coast.indep_states.states:vr_2 c -1.000000E+21 3.587987E-01 1.000000E+21
169 traj.phases.coast.indep_states.states:vr_3 c -1.000000E+21 2.804133E-01 1.000000E+21
170 traj.phases.coast.indep_states.states:vr_4 c -1.000000E+21 2.804133E-01 1.000000E+21
171 traj.phases.coast.indep_states.states:vr_5 c -1.000000E+21 1.941954E-01 1.000000E+21
172 traj.phases.coast.indep_states.states:vr_6 c -1.000000E+21 1.941954E-01 1.000000E+21
173 traj.phases.coast.indep_states.states:vr_7 c -1.000000E+21 1.120415E-01 1.000000E+21
174 traj.phases.coast.indep_states.states:vr_8 c -1.000000E+21 1.120415E-01 1.000000E+21
175 traj.phases.coast.indep_states.states:vr_9 c -1.000000E+21 3.335965E-02 1.000000E+21
176 traj.phases.coast.indep_states.states:vt_0 c -1.000000E+21 9.761629E-01 1.000000E+21
177 traj.phases.coast.indep_states.states:vt_1 c -1.000000E+21 6.893012E-01 1.000000E+21
178 traj.phases.coast.indep_states.states:vt_2 c -1.000000E+21 6.893012E-01 1.000000E+21
179 traj.phases.coast.indep_states.states:vt_3 c -1.000000E+21 5.469078E-01 1.000000E+21
180 traj.phases.coast.indep_states.states:vt_4 c -1.000000E+21 5.469078E-01 1.000000E+21
181 traj.phases.coast.indep_states.states:vt_5 c -1.000000E+21 4.746893E-01 1.000000E+21
182 traj.phases.coast.indep_states.states:vt_6 c -1.000000E+21 4.746893E-01 1.000000E+21
183 traj.phases.coast.indep_states.states:vt_7 c -1.000000E+21 4.374743E-01 1.000000E+21
184 traj.phases.coast.indep_states.states:vt_8 c -1.000000E+21 4.374743E-01 1.000000E+21
185 traj.phases.coast.indep_states.states:vt_9 c -1.000000E+21 4.217795E-01 1.000000E+21
186 traj.phases.coast.indep_states.states:accel_0 c -1.000000E+21 -4.999524E-37 1.000000E+21
187 traj.phases.coast.indep_states.states:accel_1 c -1.000000E+21 -1.986218E-36 1.000000E+21
188 traj.phases.coast.indep_states.states:accel_2 c -1.000000E+21 -2.420049E-36 1.000000E+21
189 traj.phases.coast.indep_states.states:accel_3 c -1.000000E+21 -5.575241E-36 1.000000E+21
190 traj.phases.coast.indep_states.states:accel_4 c -1.000000E+21 -4.728426E-36 1.000000E+21
191 traj.phases.coast.indep_states.states:accel_5 c -1.000000E+21 -7.247106E-36 1.000000E+21
192 traj.phases.coast.indep_states.states:accel_6 c -1.000000E+21 -2.290561E-36 1.000000E+21
193 traj.phases.coast.indep_states.states:accel_7 c -1.000000E+21 -6.915213E-38 1.000000E+21
194 traj.phases.coast.indep_states.states:deltav_0 c -1.000000E+21 2.411959E-01 1.000000E+21
195 traj.phases.coast.indep_states.states:deltav_1 c -1.000000E+21 2.411959E-01 1.000000E+21
196 traj.phases.coast.indep_states.states:deltav_2 c -1.000000E+21 2.411959E-01 1.000000E+21
197 traj.phases.coast.indep_states.states:deltav_3 c -1.000000E+21 2.411959E-01 1.000000E+21
198 traj.phases.coast.indep_states.states:deltav_4 c -1.000000E+21 2.411959E-01 1.000000E+21
199 traj.phases.coast.indep_states.states:deltav_5 c -1.000000E+21 2.411959E-01 1.000000E+21
200 traj.phases.coast.indep_states.states:deltav_6 c -1.000000E+21 2.411959E-01 1.000000E+21
201 traj.phases.coast.indep_states.states:deltav_7 c -1.000000E+21 2.411959E-01 1.000000E+21
202 traj.phases.coast.indep_states.states:deltav_8 c -1.000000E+21 2.411959E-01 1.000000E+21
203 traj.phases.coast.indep_states.states:deltav_9 c -1.000000E+21 2.411959E-01 1.000000E+21
Constraints (i - inequality, e - equality)
Index Name Type Lower Value Upper Status Lagrange Multiplier (N/A)
0 traj.linkages.burn1:time_final|coast:time_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
1 traj.linkages.burn1:r_final|coast:r_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
2 traj.linkages.burn1:theta_final|coast:theta_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
3 traj.linkages.burn1:vr_final|coast:vr_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
4 traj.linkages.burn1:vt_final|coast:vt_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
5 traj.linkages.burn1:deltav_final|coast:deltav_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
6 traj.linkages.coast:time_final|burn2:time_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
7 traj.linkages.coast:r_final|burn2:r_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
8 traj.linkages.coast:theta_final|burn2:theta_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
9 traj.linkages.coast:vr_final|burn2:vr_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
10 traj.linkages.coast:vt_final|burn2:vt_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
11 traj.linkages.coast:deltav_final|burn2:deltav_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
12 traj.linkages.burn1:accel_final|burn2:accel_initial e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
13 traj.phases.burn1.collocation_constraint.defects:r e 0.000000E+00 3.053363E-15 0.000000E+00 9.00000E+100
14 traj.phases.burn1.collocation_constraint.defects:r e 0.000000E+00 -4.638019E-16 0.000000E+00 9.00000E+100
15 traj.phases.burn1.collocation_constraint.defects:r e 0.000000E+00 -9.894441E-15 0.000000E+00 9.00000E+100
16 traj.phases.burn1.collocation_constraint.defects:r e 0.000000E+00 6.802428E-15 0.000000E+00 9.00000E+100
17 traj.phases.burn1.collocation_constraint.defects:r e 0.000000E+00 -1.236805E-15 0.000000E+00 9.00000E+100
18 traj.phases.burn1.collocation_constraint.defects:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
19 traj.phases.burn1.collocation_constraint.defects:theta e 0.000000E+00 -9.894441E-15 0.000000E+00 9.00000E+100
20 traj.phases.burn1.collocation_constraint.defects:theta e 0.000000E+00 9.894441E-15 0.000000E+00 9.00000E+100
21 traj.phases.burn1.collocation_constraint.defects:theta e 0.000000E+00 -2.720971E-14 0.000000E+00 9.00000E+100
22 traj.phases.burn1.collocation_constraint.defects:theta e 0.000000E+00 2.226249E-14 0.000000E+00 9.00000E+100
23 traj.phases.burn1.collocation_constraint.defects:vr e 0.000000E+00 8.966837E-15 0.000000E+00 9.00000E+100
24 traj.phases.burn1.collocation_constraint.defects:vr e 0.000000E+00 5.565623E-15 0.000000E+00 9.00000E+100
25 traj.phases.burn1.collocation_constraint.defects:vr e 0.000000E+00 4.947221E-15 0.000000E+00 9.00000E+100
26 traj.phases.burn1.collocation_constraint.defects:vr e 0.000000E+00 -4.328818E-15 0.000000E+00 9.00000E+100
27 traj.phases.burn1.collocation_constraint.defects:vr e 0.000000E+00 -3.092013E-15 0.000000E+00 9.00000E+100
28 traj.phases.burn1.collocation_constraint.defects:vt e 0.000000E+00 5.256422E-15 0.000000E+00 9.00000E+100
29 traj.phases.burn1.collocation_constraint.defects:vt e 0.000000E+00 -8.966837E-15 0.000000E+00 9.00000E+100
30 traj.phases.burn1.collocation_constraint.defects:vt e 0.000000E+00 4.676670E-15 0.000000E+00 9.00000E+100
31 traj.phases.burn1.collocation_constraint.defects:vt e 0.000000E+00 7.730032E-15 0.000000E+00 9.00000E+100
32 traj.phases.burn1.collocation_constraint.defects:vt e 0.000000E+00 -4.947221E-15 0.000000E+00 9.00000E+100
33 traj.phases.burn1.collocation_constraint.defects:accel e 0.000000E+00 3.865016E-19 0.000000E+00 9.00000E+100
34 traj.phases.burn1.collocation_constraint.defects:accel e 0.000000E+00 7.730032E-18 0.000000E+00 9.00000E+100
35 traj.phases.burn1.collocation_constraint.defects:accel e 0.000000E+00 -6.570527E-18 0.000000E+00 9.00000E+100
36 traj.phases.burn1.collocation_constraint.defects:accel e 0.000000E+00 1.043554E-17 0.000000E+00 9.00000E+100
37 traj.phases.burn1.collocation_constraint.defects:accel e 0.000000E+00 -2.125759E-17 0.000000E+00 9.00000E+100
38 traj.phases.burn1.collocation_constraint.defects:deltav e 0.000000E+00 3.092013E-18 0.000000E+00 9.00000E+100
39 traj.phases.burn1.collocation_constraint.defects:deltav e 0.000000E+00 -6.184026E-18 0.000000E+00 9.00000E+100
40 traj.phases.burn1.collocation_constraint.defects:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
41 traj.phases.burn1.collocation_constraint.defects:deltav e 0.000000E+00 -1.546006E-17 0.000000E+00 9.00000E+100
42 traj.phases.burn1.collocation_constraint.defects:deltav e 0.000000E+00 2.164409E-17 0.000000E+00 9.00000E+100
43 traj.phases.burn1.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
44 traj.phases.burn1.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
45 traj.phases.burn1.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
46 traj.phases.burn1.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
47 traj.phases.burn1.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
48 traj.phases.burn1.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
49 traj.phases.burn1.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
50 traj.phases.burn1.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
51 traj.phases.burn1.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
52 traj.phases.burn1.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
53 traj.phases.burn1.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
54 traj.phases.burn1.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
55 traj.phases.burn1.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
56 traj.phases.burn1.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
57 traj.phases.burn1.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
58 traj.phases.burn1.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
59 traj.phases.burn1.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
60 traj.phases.burn1.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
61 traj.phases.burn1.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
62 traj.phases.burn1.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
63 traj.phases.burn1.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
64 traj.phases.burn1.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
65 traj.phases.burn1.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
66 traj.phases.burn1.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
67 traj.phases.burn1.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
68 traj.phases.burn1.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 -1.978888E-18 0.000000E+00 9.00000E+100
69 traj.phases.burn1.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 7.915553E-18 0.000000E+00 9.00000E+100
70 traj.phases.burn1.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 1.780999E-17 0.000000E+00 9.00000E+100
71 traj.phases.burn1.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
72 traj.phases.burn1.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
73 traj.phases.burn1.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
74 traj.phases.burn1.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
75 traj.phases.burn2.collocation_constraint.defects:r e 0.000000E+00 -4.623546E-14 0.000000E+00 9.00000E+100
76 traj.phases.burn2.collocation_constraint.defects:r e 0.000000E+00 1.637045E-15 0.000000E+00 9.00000E+100
77 traj.phases.burn2.collocation_constraint.defects:r e 0.000000E+00 1.847206E-14 0.000000E+00 9.00000E+100
78 traj.phases.burn2.collocation_constraint.defects:r e 0.000000E+00 1.561830E-14 0.000000E+00 9.00000E+100
79 traj.phases.burn2.collocation_constraint.defects:r e 0.000000E+00 -2.215611E-14 0.000000E+00 9.00000E+100
80 traj.phases.burn2.collocation_constraint.defects:theta e 0.000000E+00 3.645744E-14 0.000000E+00 9.00000E+100
81 traj.phases.burn2.collocation_constraint.defects:theta e 0.000000E+00 -1.769779E-14 0.000000E+00 9.00000E+100
82 traj.phases.burn2.collocation_constraint.defects:theta e 0.000000E+00 -1.486614E-14 0.000000E+00 9.00000E+100
83 traj.phases.burn2.collocation_constraint.defects:theta e 0.000000E+00 -5.698687E-14 0.000000E+00 9.00000E+100
84 traj.phases.burn2.collocation_constraint.defects:theta e 0.000000E+00 1.663592E-14 0.000000E+00 9.00000E+100
85 traj.phases.burn2.collocation_constraint.defects:vr e 0.000000E+00 3.539557E-15 0.000000E+00 9.00000E+100
86 traj.phases.burn2.collocation_constraint.defects:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
87 traj.phases.burn2.collocation_constraint.defects:vr e 0.000000E+00 -3.539557E-15 0.000000E+00 9.00000E+100
88 traj.phases.burn2.collocation_constraint.defects:vr e 0.000000E+00 -4.866891E-15 0.000000E+00 9.00000E+100
89 traj.phases.burn2.collocation_constraint.defects:vr e 0.000000E+00 7.742781E-16 0.000000E+00 9.00000E+100
90 traj.phases.burn2.collocation_constraint.defects:vt e 0.000000E+00 3.539557E-15 0.000000E+00 9.00000E+100
91 traj.phases.burn2.collocation_constraint.defects:vt e 0.000000E+00 2.654668E-14 0.000000E+00 9.00000E+100
92 traj.phases.burn2.collocation_constraint.defects:vt e 0.000000E+00 -6.194225E-14 0.000000E+00 9.00000E+100
93 traj.phases.burn2.collocation_constraint.defects:vt e 0.000000E+00 6.371203E-14 0.000000E+00 9.00000E+100
94 traj.phases.burn2.collocation_constraint.defects:vt e 0.000000E+00 -3.185601E-14 0.000000E+00 9.00000E+100
95 traj.phases.burn2.collocation_constraint.defects:accel e 0.000000E+00 1.371578E-17 0.000000E+00 9.00000E+100
96 traj.phases.burn2.collocation_constraint.defects:accel e 0.000000E+00 -1.083989E-17 0.000000E+00 9.00000E+100
97 traj.phases.burn2.collocation_constraint.defects:accel e 0.000000E+00 1.039745E-17 0.000000E+00 9.00000E+100
98 traj.phases.burn2.collocation_constraint.defects:accel e 0.000000E+00 -1.216723E-17 0.000000E+00 9.00000E+100
99 traj.phases.burn2.collocation_constraint.defects:accel e 0.000000E+00 1.371578E-17 0.000000E+00 9.00000E+100
100 traj.phases.burn2.collocation_constraint.defects:deltav e 0.000000E+00 -7.079114E-18 0.000000E+00 9.00000E+100
101 traj.phases.burn2.collocation_constraint.defects:deltav e 0.000000E+00 1.061867E-17 0.000000E+00 9.00000E+100
102 traj.phases.burn2.collocation_constraint.defects:deltav e 0.000000E+00 -1.769779E-17 0.000000E+00 9.00000E+100
103 traj.phases.burn2.collocation_constraint.defects:deltav e 0.000000E+00 -2.123734E-17 0.000000E+00 9.00000E+100
104 traj.phases.burn2.collocation_constraint.defects:deltav e 0.000000E+00 1.769779E-17 0.000000E+00 9.00000E+100
105 traj.phases.burn2.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
106 traj.phases.burn2.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
107 traj.phases.burn2.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
108 traj.phases.burn2.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
109 traj.phases.burn2.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
110 traj.phases.burn2.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
111 traj.phases.burn2.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
112 traj.phases.burn2.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
113 traj.phases.burn2.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
114 traj.phases.burn2.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
115 traj.phases.burn2.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
116 traj.phases.burn2.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
117 traj.phases.burn2.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
118 traj.phases.burn2.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
119 traj.phases.burn2.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
120 traj.phases.burn2.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
121 traj.phases.burn2.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
122 traj.phases.burn2.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
123 traj.phases.burn2.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
124 traj.phases.burn2.continuity_comp.defect_states:accel e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
125 traj.phases.burn2.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
126 traj.phases.burn2.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
127 traj.phases.burn2.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
128 traj.phases.burn2.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
129 traj.phases.burn2.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 1.557405E-15 0.000000E+00 9.00000E+100
130 traj.phases.burn2.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 2.973228E-15 0.000000E+00 9.00000E+100
131 traj.phases.burn2.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 1.309636E-15 0.000000E+00 9.00000E+100
132 traj.phases.burn2.continuity_comp.defect_control_rates:u1_rate e 0.000000E+00 -1.097263E-15 0.000000E+00 9.00000E+100
133 traj.phases.burn2.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
134 traj.phases.burn2.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
135 traj.phases.burn2.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
136 traj.phases.burn2.continuity_comp.defect_controls:u1 e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
137 traj.phases.coast.collocation_constraint.defects:r e 0.000000E+00 -4.100299E-15 0.000000E+00 9.00000E+100
138 traj.phases.coast.collocation_constraint.defects:r e 0.000000E+00 -1.640120E-14 0.000000E+00 9.00000E+100
139 traj.phases.coast.collocation_constraint.defects:r e 0.000000E+00 2.460179E-14 0.000000E+00 9.00000E+100
140 traj.phases.coast.collocation_constraint.defects:r e 0.000000E+00 -4.715344E-14 0.000000E+00 9.00000E+100
141 traj.phases.coast.collocation_constraint.defects:r e 0.000000E+00 6.560478E-14 0.000000E+00 9.00000E+100
142 traj.phases.coast.collocation_constraint.defects:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
143 traj.phases.coast.collocation_constraint.defects:theta e 0.000000E+00 2.050150E-14 0.000000E+00 9.00000E+100
144 traj.phases.coast.collocation_constraint.defects:theta e 0.000000E+00 -3.280239E-14 0.000000E+00 9.00000E+100
145 traj.phases.coast.collocation_constraint.defects:theta e 0.000000E+00 -1.435105E-14 0.000000E+00 9.00000E+100
146 traj.phases.coast.collocation_constraint.defects:theta e 0.000000E+00 1.435105E-14 0.000000E+00 9.00000E+100
147 traj.phases.coast.collocation_constraint.defects:vr e 0.000000E+00 -8.200598E-15 0.000000E+00 9.00000E+100
148 traj.phases.coast.collocation_constraint.defects:vr e 0.000000E+00 -7.175523E-15 0.000000E+00 9.00000E+100
149 traj.phases.coast.collocation_constraint.defects:vr e 0.000000E+00 -4.100299E-15 0.000000E+00 9.00000E+100
150 traj.phases.coast.collocation_constraint.defects:vr e 0.000000E+00 5.125374E-15 0.000000E+00 9.00000E+100
151 traj.phases.coast.collocation_constraint.defects:vr e 0.000000E+00 3.075224E-15 0.000000E+00 9.00000E+100
152 traj.phases.coast.collocation_constraint.defects:vt e 0.000000E+00 -4.100299E-15 0.000000E+00 9.00000E+100
153 traj.phases.coast.collocation_constraint.defects:vt e 0.000000E+00 5.125374E-15 0.000000E+00 9.00000E+100
154 traj.phases.coast.collocation_constraint.defects:vt e 0.000000E+00 -3.075224E-15 0.000000E+00 9.00000E+100
155 traj.phases.coast.collocation_constraint.defects:vt e 0.000000E+00 -4.612836E-15 0.000000E+00 9.00000E+100
156 traj.phases.coast.collocation_constraint.defects:vt e 0.000000E+00 5.637911E-15 0.000000E+00 9.00000E+100
157 traj.phases.coast.collocation_constraint.defects:accel e 0.000000E+00 -3.749643E-37 0.000000E+00 9.00000E+100
158 traj.phases.coast.collocation_constraint.defects:accel e 0.000000E+00 -3.253732E-37 0.000000E+00 9.00000E+100
159 traj.phases.coast.collocation_constraint.defects:accel e 0.000000E+00 6.351113E-37 0.000000E+00 9.00000E+100
160 traj.phases.coast.collocation_constraint.defects:accel e 0.000000E+00 3.717409E-36 0.000000E+00 9.00000E+100
161 traj.phases.coast.collocation_constraint.defects:accel e 0.000000E+00 5.186410E-38 0.000000E+00 9.00000E+100
162 traj.phases.coast.collocation_constraint.defects:deltav e 0.000000E+00 2.769652E-37 0.000000E+00 9.00000E+100
163 traj.phases.coast.collocation_constraint.defects:deltav e 0.000000E+00 2.440998E-36 0.000000E+00 9.00000E+100
164 traj.phases.coast.collocation_constraint.defects:deltav e 0.000000E+00 5.708058E-36 0.000000E+00 9.00000E+100
165 traj.phases.coast.collocation_constraint.defects:deltav e 0.000000E+00 5.283707E-36 0.000000E+00 9.00000E+100
166 traj.phases.coast.collocation_constraint.defects:deltav e 0.000000E+00 3.830911E-38 0.000000E+00 9.00000E+100
167 traj.phases.coast.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
168 traj.phases.coast.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
169 traj.phases.coast.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
170 traj.phases.coast.continuity_comp.defect_states:r e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
171 traj.phases.coast.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
172 traj.phases.coast.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
173 traj.phases.coast.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
174 traj.phases.coast.continuity_comp.defect_states:theta e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
175 traj.phases.coast.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
176 traj.phases.coast.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
177 traj.phases.coast.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
178 traj.phases.coast.continuity_comp.defect_states:vr e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
179 traj.phases.coast.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
180 traj.phases.coast.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
181 traj.phases.coast.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
182 traj.phases.coast.continuity_comp.defect_states:vt e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
183 traj.phases.coast.continuity_comp.defect_states:accel e 0.000000E+00 -1.486266E-36 0.000000E+00 9.00000E+100
184 traj.phases.coast.continuity_comp.defect_states:accel e 0.000000E+00 -3.155192E-36 0.000000E+00 9.00000E+100
185 traj.phases.coast.continuity_comp.defect_states:accel e 0.000000E+00 -2.518680E-36 0.000000E+00 9.00000E+100
186 traj.phases.coast.continuity_comp.defect_states:accel e 0.000000E+00 2.221409E-36 0.000000E+00 9.00000E+100
187 traj.phases.coast.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
188 traj.phases.coast.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
189 traj.phases.coast.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
190 traj.phases.coast.continuity_comp.defect_states:deltav e 0.000000E+00 0.000000E+00 0.000000E+00 9.00000E+100
Exit Status
Inform Description
0 Solve Succeeded
--------------------------------------------------------------------------------
/usr/share/miniconda/envs/test/lib/python3.10/site-packages/openmdao/visualization/opt_report/opt_report.py:634: UserWarning: Attempting to set identical low and high ylims makes transformation singular; automatically expanding.
ax.set_ylim([ymin_plot, ymax_plot])
Simulating trajectory traj
Model viewer data has already been recorded for Driver.
Done simulating trajectory traj
False
Plotting the results#
The following code cell reads the resulting state, time, and control histories from the solution and simulation record files and plots them. It is collapsed by default but can be viewed by expanding it with the button to the right.
Show code cell source
sol = om.CaseReader('dymos_solution.db').get_case('final')
sim = om.CaseReader('dymos_simulation.db').get_case('final')
fig = plt.figure(figsize=(12, 6))
fig.suptitle('Two Burn Orbit Raise Solution')
ax_u1 = plt.subplot2grid((2, 2), (0, 0))
ax_deltav = plt.subplot2grid((2, 2), (1, 0))
ax_xy = plt.subplot2grid((2, 2), (0, 1), rowspan=2)
span = np.linspace(0, 2 * np.pi, 100)
ax_xy.plot(np.cos(span), np.sin(span), 'k--', lw=1)
ax_xy.plot(3 * np.cos(span), 3 * np.sin(span), 'k--', lw=1)
ax_xy.set_xlim(-4.5, 4.5)
ax_xy.set_ylim(-4.5, 4.5)
ax_xy.set_xlabel('x ($R_e$)')
ax_xy.set_ylabel('y ($R_e$)')
ax_xy.set_aspect('equal')
ax_xy.plot([0], [0], '*', color='gold')
ax_u1.set_ylabel('$u_1$ ($deg$)')
ax_u1.grid(True)
ax_deltav.set_xlabel('time ($TU$)')
ax_deltav.set_ylabel('${\Delta}v$ ($DU/TU$)')
ax_deltav.grid(True)
t_sol = dict((phs, sol.get_val(f'traj.{phs}.timeseries.time'.format(phs)))
for phs in ['burn1', 'coast', 'burn2'])
x_sol = dict((phs, sol.get_val(f'traj.{phs}.timeseries.pos_x'.format(phs)))
for phs in ['burn1', 'coast', 'burn2'])
y_sol = dict((phs, sol.get_val(f'traj.{phs}.timeseries.pos_y'.format(phs)))
for phs in ['burn1', 'coast', 'burn2'])
dv_sol = dict((phs, sol.get_val(f'traj.{phs}.timeseries.deltav'.format(phs)))
for phs in ['burn1', 'coast', 'burn2'])
u1_sol = dict((phs, sol.get_val(f'traj.{phs}.timeseries.u1'.format(phs), units='deg'))
for phs in ['burn1', 'burn2'])
t_exp = dict((phs, sim.get_val(f'traj.{phs}.timeseries.time'))
for phs in ['burn1', 'coast', 'burn2'])
x_exp = dict((phs, sim.get_val(f'traj.{phs}.timeseries.pos_x'))
for phs in ['burn1', 'coast', 'burn2'])
y_exp = dict((phs, sim.get_val(f'traj.{phs}.timeseries.pos_y'))
for phs in ['burn1', 'coast', 'burn2'])
dv_exp = dict((phs, sim.get_val(f'traj.{phs}.timeseries.deltav'))
for phs in ['burn1', 'coast', 'burn2'])
u1_exp = dict((phs, sim.get_val(f'traj.{phs}.timeseries.u1',
units='deg'))
for phs in ['burn1', 'burn2'])
for phs in ['burn1', 'coast', 'burn2']:
try:
ax_u1.plot(t_exp[phs], u1_exp[phs], '-', marker=None, color='C0')
ax_u1.plot(t_sol[phs], u1_sol[phs], 'o', mfc='C1', mec='C1', ms=3)
except KeyError:
pass
ax_deltav.plot(t_exp[phs], dv_exp[phs], '-', marker=None, color='C0')
ax_deltav.plot(t_sol[phs], dv_sol[phs], 'o', mfc='C1', mec='C1', ms=3)
exp_plt, = ax_xy.plot(x_exp[phs], y_exp[phs], '-', marker=None, color='C0', label='explicit')
imp_plt, = ax_xy.plot(x_sol[phs], y_sol[phs], 'o', mfc='C1', mec='C1', ms=3, label='implicit')
ax_xy.legend(handles=[imp_plt, exp_plt], labels=['solution', 'simulation'], loc='lower center', ncol=2)
plt.show()
References#
Paul J Enright and Brace A Conway. Optimal finite-thrust spacecraft trajectories using collocation and nonlinear programming. Journal of Guidance, Control, and Dynamics, 14(5):981–985, 1991.