In [1]:
import numpy as np
from scipy.integrate import trapz 
from matplotlib import pyplot as plt 
import sys 
sys.path.append("./Utils")
sys.path.append("./EntryGuidance")
sys.path.append("./EntryGuidance/SDC")


from EntryEquations import Entry
from InitialState import InitialState
from RK4 import RK4
from TSDRE import TSDRE 

import adaptive
adaptive.notebook_extension()



In [36]:
def ring(xy, wait=False):
    import numpy as np
    from time import sleep
    from random import random
    if wait:
        sleep(random()/10)
    x, y = xy
    a = 0.2
    return x + np.exp(-(x**2 + y**2 - 0.75**2)**2/a**4)

def plot(learner):
    plot = learner.plot(tri_alpha=0.2)
    return (plot.Image + plot.EdgePaths.I + plot).cols(2)

In [37]:
learner = adaptive.Learner2D(ring, bounds=[(-1, 1), (-1, 1)])

In [38]:
runner = adaptive.Runner(learner, goal=lambda l: l.loss() < 0.01)

In [39]:
runner.live_info()
runner.live_plot(plotter=plot, update_interval=0.1)


Out[39]:

In [19]:
from SDC.Entry import Range 
def test_range(Inputs):
    a,b = Inputs
    final_range, final_altitude = 720e3 + a*100e3, 6e3 + 2e3*b
    x0 = InitialState()
    model = Entry(Scale=False)
    x0 = model.scale(x0)

    idx = [0, 3, 4]  # grabs the longitudinal states in the correct order 
    x0_sdc = x0[idx]
    x0_sdc[0] = model.altitude(x0_sdc[0]*model.dist_scale)/model.dist_scale


    sdc_model = Range(model, x0[-1])   
    controller = TSDRE()
    def altitude_constraint(h):
        def constraint(x):
            return x[0]-h, np.array([1, 0, 0])
        return constraint 

    problem = {'tf': final_range, 'Q': lambda y: np.diag([0, 0, 0.001])*0, 'R': lambda x: [[1]], 'constraint': altitude_constraint(final_altitude)}

    X = [x0_sdc]
    U = []
    problem['Q'](X[0])
    N = 100
    S = np.linspace(0, problem['tf'], N)

    for i in range(N-1):
#         u = controller(S[i], X[-1], sdc_model, problem)
        u = [0.85]
        if 1:
            u = np.clip(u, 0, 1)  # Optional saturation effects
        xi = RK4(sdc_model.dynamics(u), X[-1], np.linspace(S[i], S[i+1], 3))  # _ steps per control update 
        X.append(xi[-1])
        U.append(u)

    hf = X[-1][0].squeeze()
#     err = (hf - final_altitude)**2/1e6 # km^2 altitude error
    err = np.abs(hf-final_altitude)
    tol = 100 # meters 
    return max(err, tol)/1000 # km

In [20]:
learner = adaptive.Learner2D(test_range, bounds=[(0, 1), (0, 1)]) # (720e3, 810e3), (6e3, 10e3)

In [21]:
runner = adaptive.Runner(learner, goal=lambda l: l.loss() < 0.01)

In [23]:
runner.live_info()
runner.live_plot(plotter=plot, update_interval=2)


Out[23]:

In [ ]: