# g = lambda r, q :

# initial distribution
r0 = 1.
dr0 = 0
# Q0 = np.random.normal(loc=0.9, scale=1., size=(n,))

# generate grid
loc = 2.5
scale = 0.3
qgrid_size = 1000
qgrid = np.linspace(0, 15, qgrid_size)
rho0 = n * norm.pdf(qgrid, loc=loc, scale=scale)
t_end = 24  #60

pms.init_equations(T_r, U_r, T_q, U_q, g)
pms.init_meso(r0, dr0, rho0, qgrid, t_end, n_eval=400)
pms.simulate_meso(method="RK45", atol=1.e-8, rtol=1.e-8, use_upwind=True)

#pms.simulate_meso_own()

pms.name = "onion"
#save_plots( plt, pms, "meso")

pms.plot_g(levels=100)
plt.show()

pms.plot_veff_img(detail=500)
plt.show()

pms.plot_particle_paths_meso_time()
Exemple #2
0
def analyse_variance(example_name):

    dpms = DiscretePMS()
    dpms.name = example_name

    n_particles = 2**np.arange(2, 7)
    mean_vec = []
    var_vec = []

    n_mc = 50
    for n in n_particles:

        if dpms.name == "linear":

            # masses
            m_r = 2.
            m_q = 10. / n

            # stiffness
            kappa_r = 1.
            kappa_q = 1 / n

            # forces
            U_r = lambda r, dr: 0.5 * kappa_r * r**2
            T_r = lambda r, dr: 0.5 * m_r * dr**2

            U_q = lambda q, dq: 0.5 * kappa_q * q**2
            T_q = lambda q, dq: 0.5 * m_q * dq**2

            # constraint
            g = lambda r, q: q - r

            t_end = 23
            r0 = 1.
            dr0 = 0.

            mean = 2.0
            scale = 1.0

        if dpms.name == "onion":
            # masses
            m_r = 2.
            m_q = 1. / n

            # stiffness
            kappa_r = 1.
            kappa_q = 0.0 / n

            # forces
            U_r = lambda r, dr: 0.5 * kappa_r * r**2
            T_r = lambda r, dr: 0.5 * m_r * dr**2

            U_q = lambda q, dq: 0.5 * kappa_q * q**2
            T_q = lambda q, dq: 0.5 * m_q * dq**2

            # constraint
            factor = 1.
            # g = lambda r, q : factor*q/(1+r**2) - q**3
            g = lambda r, q: -factor * sp.sin(0.1 * q) / (1 + r**2) + 0.1 * q

            t_end = 20
            r0 = 1.
            dr0 = 0.

            mean = 0.9
            scale = 1.0

        r_end = np.zeros(shape=(n_mc, ))

        dpms.init_equations(T_r, U_r, T_q, U_q, g)

        # colors in plots
        col_min = np.array([0., 0.6, 0.9])
        col_max = np.array([0.6, 0., 0.9])

        for i in range(0, n_mc):

            # initial distribution

            Q0 = np.random.normal(loc=mean, scale=scale, size=(n, ))

            dpms.init_state(r0, dr0, Q0, t_end)
            dpms.simulate()

            r_end[i] = dpms.r[-1]
            p = i / (n_mc - 1)

            plt.plot(dpms.sol.t,
                     dpms.r,
                     color=p * col_min + (1. - p) * col_max,
                     lw=0.3)

        # calucate mean and variance at t_end

        cur_mean = 1 / n_mc * np.sum(r_end)
        cur_var = 1 / (n_mc - 1) * np.sum((r_end - cur_mean)**2)

        mean_vec.append(cur_mean)
        var_vec.append(cur_var)

        plt.xlabel(r"$t$")
        plt.ylabel(r"$r(t)$")
        plt.title("heavy system (%d samples, %d particles)" % (n_mc, n))
        plt.savefig(
            gen_name(dpms, "disc") + ("_mc%d_n%d" % (n_mc, n)) + ".pdf")
        plt.show()

    plt.loglog(n_particles,
               var_vec,
               label=r"$\mathrm{Var}[ r(t_\text{end} ) ]$")
    plt.loglog(n_particles, 1. / n_particles, label=r"$n^{-1}$")
    plt.xlabel(r"$\log(n)$")
    plt.title("variance of the heavy system")
    #plt.ylabel(r"$\log$")
    plt.legend()
    plt.savefig(gen_name(dpms, "disc") + ("_variance_mc%d" % (n_mc)) + ".pdf")
    plt.show()