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)
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)