Пример #1
0
    def __init__(self, setup):
        self.setup = setup

        sigma2 = pow(setup.sigma, 2)
        dx_opt = abs(setup.C_opt / (.5 * sigma2 - setup.r) * setup.l2_opt * sigma2)
        dt_opt = pow(dx_opt, 2) / sigma2 / setup.l2_opt
    
        # adjusting dt so that nt is integer
        self.dt = setup.T
        self.nt = 0
        while self.dt > dt_opt:
            self.nt += 1
            self.dt = setup.T / self.nt
    
        # adjusting dx to match requested l^2
        dx = np.sqrt(setup.l2_opt * self.dt) * setup.sigma

        # calculating actual u number and lambda
        self.C = - (.5 * sigma2 - setup.r) * (-self.dt) / dx
        self.l2 = dx * dx / sigma2 / self.dt
    
        # adjusting nx and setting S_beg, S_end
        S_beg = setup.S_match
        self.nx = 1
        while S_beg > setup.S_min:
            self.nx += 1
            S_beg = np.exp(np.log(setup.S_match) - self.nx * dx)

        self.ix_match = self.nx
    
        S_end = setup.S_match
        while S_end < setup.S_max:
            self.nx += 1
            S_end = np.exp(np.log(S_beg) + (self.nx-1) * dx)

        # asset price
        self.S = np.exp(np.log(S_beg) + np.arange(self.nx) * dx)

        self.mu_coeff = (0.5 / self.l2,)
        self.solvers = {}
        self.solvers[1] = Factories.advection_diffusion_1d(
            advectee=setup.payoff(self.S),
            advector=self.C,
            options=Options(n_iters=1, non_zero_mu_coeff=True),
            boundary_conditions=(ExtrapolatedBoundaryCondition(),)
        )
        self.solvers[2] = Factories.advection_diffusion_1d(
            advectee=setup.payoff(self.S),
            advector=self.C,
            options=Options(**OPTIONS),
            boundary_conditions=(ExtrapolatedBoundaryCondition(),)
        )
Пример #2
0
 def __init__(self, setup: Setup, options: Options):
     x, y, z = from_pdf_2d(setup.pdf,
                           xrange=setup.xrange,
                           yrange=setup.yrange,
                           gridsize=setup.grid)
     self.mpdata = Factories.stream_function_2d_basic(
         setup.grid, setup.size, setup.dt, setup.stream_function, z,
         options)
     self.nt = setup.nt
Пример #3
0
    def __init__(self, setup, grid_layout, psi_coord, opts, GC_max):
        self.setup = setup
        self.psi_coord = psi_coord

        # units of calculation
        self.__t_unit = self.setup.si.seconds
        self.__r_unit = self.setup.si.micrometre
        self.__n_unit = self.setup.si.centimetres**-3 / self.setup.si.micrometre

        self.solver, self.__r, self.__rh, self.dx, dt = Factories.condensational_growth(
            self.setup.nr, self.__mgn(self.setup.r_min, self.__r_unit),
            self.__mgn(self.setup.r_max, self.__r_unit), GC_max,
            grid_layout, psi_coord, lambda r: self.__mgn(
                self.setup.pdf(r * self.__r_unit), self.__n_unit),
            lambda r: self.__mgn(self.setup.drdt(r * self.__r_unit), self.
                                 __r_unit / self.__t_unit), opts)

        self.out_steps = Simulation.find_out_steps(setup=self.setup, dt=dt)
        self.dt = dt * self.__t_unit