Example #1
0
    def parabolic_equation_solver_test(self, NS, NT):
        """
        u_t = \Delta u + w*u

        w = 1
        u(x, 0) = 1

        周期边界条件
        """
        from fealpy.timeintegratoralg.timeline_new import UniformTimeLine

        box = np.array([
            [2*np.pi, 0],
            [0, 2*np.pi]])
        space = FourierSpace(box, NS)
        timeline = UniformTimeLine(0, 1, NT)
        NL = timeline.number_of_time_levels()
        q = space.function(dim=NL)
        w = space.function()
        w[:] = 1
        q[0] = 1
        k, k2 = space.reciprocal_lattice(return_square=True)
        dt = timeline.current_time_step_length()
        E0 = np.exp(-dt/2*w)
        E1 = np.exp(-dt*k2)
        for i in range(1, NL):
            q0 = q[i-1]
            q1 = np.fft.fftn(E0*q0)
            q1 *= E1
            q[i] = np.fft.ifftn(q1).real
            q[i] *= E0

        print(q)
Example #2
0
	def parabolic_equation_solver_uu_test(self, NS, NT):
		"""
		u_t = \Delta u + u^2

		w = 1
		u(x, 0) = 1

		周期边界条件
		Semi-implicit method
		The discrete scheme: (time step size is dt)
		\hat{u}^{n+1} = ( \hat{u}^{n} + dt \hat{(u^{n})^{2}} ) / ( I + dt k^2 )
		"""
		from fealpy.timeintegratoralg.timeline import UniformTimeLine

		box = np.array([
		[2*np.pi, 0],
		[0, 2*np.pi]])
		space = FourierSpace(box, NS)
		timeline = UniformTimeLine(0, 1, NT)
		NL = timeline.number_of_time_levels()
		u = space.function(dim=NL)
		u[0] = 1
		k, k2 = space.reciprocal_lattice(return_square=True)
		dt = timeline.current_time_step_length()
		A = 1./(1 + dt*k2)
		for i in range(1, NL):
			u0 = u[i-1]
			u1 = np.fft.fftn(u0)
			uf = np.fft.fftn(u0*u0)
			u2 = A * (u1 + dt*uf)
			u[i] = np.fft.ifftn(u2).real

		print(u)