def plot_taylor_disturbance(r0, v0, m0, thrust, disturbance, tof, mu, veff, N=60, units=1, color='b', legend=False, axes=None): """ ax = plot_taylor_disturbance(r, v, m, thrust, disturbance, t, mu, veff, N=60, units=1, color='b', legend=False, axes=None): - axes: 3D axis object created using fig.gca(projection='3d') - r0: initial position (cartesian coordinates) - v0: initial velocity (cartesian coordinates) - m0: initial mass - thrust: cartesian components for the constant thrust - disturbance: cartesian components for a constant disturbance (will not affect mass) - tof: propagation time - mu: gravitational parameter - veff: the product Isp * g0 - N: number of points to be plotted along one arc - units: the length unit to be used in the plot - color: matplotlib color to use to plot the line - legend: when True it plots also the legend Plots the result of a taylor propagation of constant thrust """ from pykep import propagate_taylor_disturbance import matplotlib.pyplot as plt if axes is None: fig = plt.figure() ax = fig.gca(projection='3d') else: ax = axes # We define the integration time ... dt = tof / (N - 1) # ... and calcuate the cartesian components for r x = [0.0] * N y = [0.0] * N z = [0.0] * N # Replace r0, v0 and m0 r = r0 v = v0 m = m0 # We calculate the spacecraft position at each dt for i in range(N): x[i] = r[0] / units y[i] = r[1] / units z[i] = r[2] / units r, v, m = propagate_taylor_disturbance( r, v, m, thrust, disturbance, dt, mu, veff, -10, -10) # And we plot if legend: label = 'constant thrust arc' else: label = None ax.plot(x, y, z, c=color, label=label) return ax
def _propagate(self, x): # 1 - We decode the chromosome t0 = x[0] T = x[1] m_f = x[2] # We extract the number of segments for forward and backward # propagation n_seg = self.__n_seg fwd_seg = self.__fwd_seg bwd_seg = self.__bwd_seg # We extract information on the spacecraft m_i = self.__sc.mass max_thrust = self.__sc.thrust isp = self.__sc.isp veff = isp * pk.G0 # And on the leg throttles = [x[3 + 3 * i: 6 + 3 * i] for i in range(n_seg)] # Return lists n_points_fwd = fwd_seg + 1 n_points_bwd = bwd_seg + 1 rfwd = [[0.0] * 3] * (n_points_fwd) vfwd = [[0.0] * 3] * (n_points_fwd) mfwd = [0.0] * (n_points_fwd) ufwd = [[0.0] * 3] * (fwd_seg) dfwd = [[0.0] * 3] * (fwd_seg) # distances E/S rbwd = [[0.0] * 3] * (n_points_bwd) vbwd = [[0.0] * 3] * (n_points_bwd) mbwd = [0.0] * (n_points_bwd) ubwd = [[0.0] * 3] * (bwd_seg) dbwd = [[0.0] * 3] * (bwd_seg) # 2 - We compute the initial and final epochs and ephemerides t_i = pk.epoch(t0) r_i, v_i = self.__earth.eph(t_i) if self.__start == 'l1': r_i = [r * 0.99 for r in r_i] v_i = [v * 0.99 for v in v_i] elif self.__start == 'l2': r_i = [r * 1.01 for r in r_i] v_i = [v * 1.01 for v in v_i] t_f = pk.epoch(t0 + T) r_f, v_f = self.target.eph(t_f) # 3 - Forward propagation fwd_grid = t0 + T * self.__fwd_grid # days fwd_dt = T * self.__fwd_dt # seconds # Initial conditions rfwd[0] = r_i vfwd[0] = v_i mfwd[0] = m_i # Propagate for i, t in enumerate(throttles[:fwd_seg]): if self.__sep: r = math.sqrt(rfwd[i][0]**2 + rfwd[i][1] ** 2 + rfwd[i][2]**2) / pk.AU max_thrust, isp = self._sep_model(r) veff = isp * pk.G0 ufwd[i] = [max_thrust * thr for thr in t] if self.__earth_gravity: r_E, v_E = self.__earth.eph(pk.epoch(fwd_grid[i])) dfwd[i] = [a - b for a, b in zip(r_E, rfwd[i])] r3 = sum([r**2 for r in dfwd[i]])**(3 / 2) disturbance = [mfwd[i] * pk.MU_EARTH / r3 * ri for ri in dfwd[i]] rfwd[i + 1], vfwd[i + 1], mfwd[i + 1] = pk.propagate_taylor_disturbance( rfwd[i], vfwd[i], mfwd[i], ufwd[i], disturbance, fwd_dt[i], pk.MU_SUN, veff, -10, -10) else: rfwd[i + 1], vfwd[i + 1], mfwd[i + 1] = pk.propagate_taylor( rfwd[i], vfwd[i], mfwd[i], ufwd[i], fwd_dt[i], pk.MU_SUN, veff, -10, -10) # 4 - Backward propagation bwd_grid = t0 + T * self.__bwd_grid # days bwd_dt = T * self.__bwd_dt # seconds # Final conditions rbwd[-1] = r_f vbwd[-1] = v_f mbwd[-1] = m_f # Propagate for i, t in enumerate(throttles[-1:-bwd_seg - 1:-1]): if self.__sep: r = math.sqrt(rbwd[-i - 1][0]**2 + rbwd[-i - 1] [1]**2 + rbwd[-i - 1][2]**2) / pk.AU max_thrust, isp = self._sep_model(r) veff = isp * pk.G0 ubwd[-i - 1] = [max_thrust * thr for thr in t] if self.__earth_gravity: r_E, v_E = self.__earth.eph(pk.epoch(bwd_grid[-i - 1])) dbwd[-i - 1] = [a - b for a, b in zip(r_E, rbwd[-i - 1])] r3 = sum([r**2 for r in dbwd[-i - 1]])**(3 / 2) disturbance = [mfwd[i] * pk.MU_EARTH / r3 * ri for ri in dbwd[-i - 1]] rbwd[-i - 2], vbwd[-i - 2], mbwd[-i - 2] = pk.propagate_taylor_disturbance( rbwd[-i - 1], vbwd[-i - 1], mbwd[-i - 1], ubwd[-i - 1], disturbance, -bwd_dt[-i - 1], pk.MU_SUN, veff, -10, -10) else: rbwd[-i - 2], vbwd[-i - 2], mbwd[-i - 2] = pk.propagate_taylor( rbwd[-i - 1], vbwd[-i - 1], mbwd[-i - 1], ubwd[-i - 1], -bwd_dt[-i - 1], pk.MU_SUN, veff, -10, -10) return rfwd, rbwd, vfwd, vbwd, mfwd, mbwd, ufwd, ubwd, fwd_dt, bwd_dt, dfwd, dbwd
def _propagate(self, x): # 1 - We decode the chromosome t0 = x[0] T = x[1] m_f = x[2] # We extract the number of segments for forward and backward # propagation n_seg = self.__n_seg fwd_seg = self.__fwd_seg bwd_seg = self.__bwd_seg # We extract information on the spacecraft m_i = self.__sc.mass max_thrust = self.__sc.thrust isp = self.__sc.isp veff = isp * pk.G0 # And on the leg throttles = [x[3 + 3 * i:6 + 3 * i] for i in range(n_seg)] # Return lists n_points_fwd = fwd_seg + 1 n_points_bwd = bwd_seg + 1 rfwd = [[0.0] * 3] * (n_points_fwd) vfwd = [[0.0] * 3] * (n_points_fwd) mfwd = [0.0] * (n_points_fwd) ufwd = [[0.0] * 3] * (fwd_seg) dfwd = [[0.0] * 3] * (fwd_seg) # distances E/S rbwd = [[0.0] * 3] * (n_points_bwd) vbwd = [[0.0] * 3] * (n_points_bwd) mbwd = [0.0] * (n_points_bwd) ubwd = [[0.0] * 3] * (bwd_seg) dbwd = [[0.0] * 3] * (bwd_seg) # 2 - We compute the initial and final epochs and ephemerides t_i = pk.epoch(t0) r_i, v_i = self.__earth.eph(t_i) if self.__start == 'l1': r_i = [r * 0.99 for r in r_i] v_i = [v * 0.99 for v in v_i] elif self.__start == 'l2': r_i = [r * 1.01 for r in r_i] v_i = [v * 1.01 for v in v_i] t_f = pk.epoch(t0 + T) r_f, v_f = self.target.eph(t_f) # 3 - Forward propagation fwd_grid = t0 + T * self.__fwd_grid # days fwd_dt = T * self.__fwd_dt # seconds # Initial conditions rfwd[0] = r_i vfwd[0] = v_i mfwd[0] = m_i # Propagate for i, t in enumerate(throttles[:fwd_seg]): if self.__sep: r = math.sqrt(rfwd[i][0]**2 + rfwd[i][1]**2 + rfwd[i][2]**2) / pk.AU max_thrust, isp = self._sep_model(r) veff = isp * pk.G0 ufwd[i] = [max_thrust * thr for thr in t] if self.__earth_gravity: r_E, v_E = self.__earth.eph(pk.epoch(fwd_grid[i])) dfwd[i] = [a - b for a, b in zip(r_E, rfwd[i])] r3 = sum([r**2 for r in dfwd[i]])**(3 / 2) disturbance = [ mfwd[i] * pk.MU_EARTH / r3 * ri for ri in dfwd[i] ] rfwd[i + 1], vfwd[i + 1], mfwd[i + 1] = pk.propagate_taylor_disturbance( rfwd[i], vfwd[i], mfwd[i], ufwd[i], disturbance, fwd_dt[i], pk.MU_SUN, veff, -10, -10) else: rfwd[i + 1], vfwd[i + 1], mfwd[i + 1] = pk.propagate_taylor( rfwd[i], vfwd[i], mfwd[i], ufwd[i], fwd_dt[i], pk.MU_SUN, veff, -10, -10) # 4 - Backward propagation bwd_grid = t0 + T * self.__bwd_grid # days bwd_dt = T * self.__bwd_dt # seconds # Final conditions rbwd[-1] = r_f vbwd[-1] = v_f mbwd[-1] = m_f # Propagate for i, t in enumerate(throttles[-1:-bwd_seg - 1:-1]): if self.__sep: r = math.sqrt(rbwd[-i - 1][0]**2 + rbwd[-i - 1][1]**2 + rbwd[-i - 1][2]**2) / pk.AU max_thrust, isp = self._sep_model(r) veff = isp * pk.G0 ubwd[-i - 1] = [max_thrust * thr for thr in t] if self.__earth_gravity: r_E, v_E = self.__earth.eph(pk.epoch(bwd_grid[-i - 1])) dbwd[-i - 1] = [a - b for a, b in zip(r_E, rbwd[-i - 1])] r3 = sum([r**2 for r in dbwd[-i - 1]])**(3 / 2) disturbance = [ mfwd[i] * pk.MU_EARTH / r3 * ri for ri in dbwd[-i - 1] ] rbwd[-i - 2], vbwd[-i - 2], mbwd[-i - 2] = pk.propagate_taylor_disturbance( rbwd[-i - 1], vbwd[-i - 1], mbwd[-i - 1], ubwd[-i - 1], disturbance, -bwd_dt[-i - 1], pk.MU_SUN, veff, -10, -10) else: rbwd[-i - 2], vbwd[-i - 2], mbwd[-i - 2] = pk.propagate_taylor( rbwd[-i - 1], vbwd[-i - 1], mbwd[-i - 1], ubwd[-i - 1], -bwd_dt[-i - 1], pk.MU_SUN, veff, -10, -10) return rfwd, rbwd, vfwd, vbwd, mfwd, mbwd, ufwd, ubwd, fwd_dt, bwd_dt, dfwd, dbwd