def test_arenstorf():
    """
    https://en.wikipedia.org/wiki/Richard_Arenstorf#The_Arenstorf_Orbit
    https://commons.wikimedia.org/wiki/File:Arenstorf_Orbit.gif
    Q: какие участки траектории наиболее быстрые?
    """
    ode = Arenstorf()
    t0, t1 = 0, 1 * ode.t_period
    y0 = ode.y0

    atol = 1e-6
    rtol = 1e-3

    tss = []
    yss = []

    methods = (
        # (ExplicitEulerMethod(),                         AdaptType.RUNGE),
        (RungeKuttaMethod(coeffs.rk4_coeffs),           AdaptType.RUNGE),
        (EmbeddedRungeKuttaMethod(coeffs.dopri_coeffs), AdaptType.EMBEDDED),
    )

    fig1, ax1 = plt.subplots(num='traj')
    fig1.suptitle('Arenstorf orbit: trajectory')
    ax1.set_xlabel('x1'), ax1.set_ylabel('x2')

    fig2, ax2 = plt.subplots(num='dt(t)')
    fig2.suptitle('Arenstorf orbit: step sizes')
    ax2.set_xlabel('t'), ax2.set_ylabel('dt')

    fig3, ax3 = plt.subplots(num='|f|')
    fig3.suptitle('Arenstorf orbit: RHS analysis')
    ax3.set_xlabel('t')

    for method, adapt_type in methods:
        ts, ys = adaptive_step_integration(method=method,
                                           ode=ode,
                                           y_start=y0,
                                           t_span=(t0, t1),
                                           adapt_type=adapt_type,
                                           atol=atol, rtol=rtol)
        tss.append(np.array(ts))
        yss.append(ys)

    for (m, _), ts, ys in zip(methods, tss, yss):
        ax1.plot([y[0] for y in ys],
                 [y[1] for y in ys],
                 ':', label=m.name)
        ax2.plot(ts[:-1], ts[1:] - ts[:-1], '.-', label=m.name)

    #derivatives = [np.linalg.norm(ode(t, y)) for t, y in zip(ts, ys)]
    derivatives = [1/(np.linalg.norm(ode(t, y))) for t, y in zip(ts, ys)]

    ax1.plot(0, 0, 'bo', label='Earth')
    ax1.plot(1, 0, '.', color='grey', label='Moon')
    ax3.plot(ts, derivatives, label='|f(t, y)|')
    ax1.legend()
    ax2.legend()
    plt.show()
示例#2
0
def test_arenstorf():
    """
    https://en.wikipedia.org/wiki/Richard_Arenstorf#The_Arenstorf_Orbit
    https://commons.wikimedia.org/wiki/File:Arenstorf_Orbit.gif
    Q: which parts of the orbit are fastest?
    """
    problem = Arenstorf()
    t0, t1 = 0, 1 * problem.t_period
    y0 = problem.y0

    atol = 1e-6
    rtol = 1e-3

    tss = []
    yss = []

    methods = (
        # (ExplicitEulerMethod(),                                     AdaptType.RUNGE),
        (RungeKuttaMethod(coeffs=collection.rk4_coeffs), AdaptType.RUNGE),
        (EmbeddedRungeKuttaMethod(coeffs=collection.dopri_coeffs),
         AdaptType.EMBEDDED),
    )

    plt.figure('traj'), plt.suptitle(
        'Arenstorf orbit: trajectory'), plt.xlabel('x1'), plt.ylabel('x2')
    plt.figure('dt(t)'), plt.suptitle(
        'Arenstorf orbit: step sizes'), plt.xlabel('t'), plt.ylabel('dt')

    for method, adapt_type in methods:
        ts, ys = adaptive_step_integration(method=method,
                                           func=problem,
                                           y_start=y0,
                                           t_span=(t0, t1),
                                           adapt_type=adapt_type,
                                           atol=atol,
                                           rtol=rtol)
        tss.append(np.array(ts))
        yss.append(ys)

    for (m, _), ts, ys in zip(methods, tss, yss):
        plt.figure('traj'), plt.plot([y[0] for y in ys], [y[1] for y in ys],
                                     ':',
                                     label=m.name)
        plt.figure('dt(t)'), plt.plot(ts[:-1],
                                      ts[1:] - ts[:-1],
                                      '.-',
                                      label=m.name)

    plt.figure('traj')
    plt.plot(0, 0, 'bo', label='Earth')
    plt.plot(1, 0, '.', color='grey', label='Moon')
    plt.legend()
    plt.figure('dt(t)'), plt.legend()
    plt.show()