def test_heat(): k, L, T = 0.3, 2, 3 heat = lambda u, x, t: diff(u, t) - k * diff(u, x, order=2) ibvp = IBVP1D(x_min=0, x_min_val=lambda t: 0, x_max=L, x_max_val=lambda t: 0, t_min=0, t_min_val=lambda x: torch.sin(np.pi * x / L)) net = FCNN(n_input_units=2, hidden_units=(32, 32)) def mse(u, x, y): true_u = torch.sin(np.pi * y) * torch.sinh(np.pi * (1 - x)) / np.sinh(np.pi) return torch.mean((u - true_u)**2) solution_neural_net_heat, _ = solve2D(pde=heat, condition=ibvp, xy_min=(0, 0), xy_max=(L, T), net=net, max_epochs=300, train_generator=Generator2D( (32, 32), (0, 0), (L, T), method='equally-spaced-noisy'), batch_size=64, metrics={'mse': mse}) solution_analytical_heat = lambda x, t: np.sin(np.pi * x / L) * np.exp( -k * np.pi**2 * t / L**2) xs = np.linspace(0, L, 101) ts = np.linspace(0, T, 101) xx, tt = np.meshgrid(xs, ts) make_animation(solution_neural_net_heat, xs, ts) # test animation sol_ana = solution_analytical_heat(xx, tt) sol_net = solution_neural_net_heat(xx, tt, as_type='np') assert isclose(sol_net, sol_ana, atol=0.01).all() print('Heat test passed.')
def test_neumann_boundaries_2(): k, L, T = 0.3, 2, 3 heat = lambda u, x, t: diff(u, t) - k * diff(u, x, order=2) solution_analytical_heat = lambda x, t: np.sin(np.pi * x / L) * np.exp( -k * np.pi**2 * t / L**2) # Neumann on the left Dirichlet on the right ibvp = IBVP1D( x_min=0, x_min_prime=lambda t: np.pi / L * torch.exp(-k * np.pi**2 * t / L**2), x_max=L, x_max_val=lambda t: 0, t_min=0, t_min_val=lambda x: torch.sin(np.pi * x / L)) net = FCNN(n_input_units=2, hidden_units=(32, 32)) solution_neural_net_heat, _ = solve2D(pde=heat, condition=ibvp, xy_min=(0, 0), xy_max=(L, T), net=net, max_epochs=300, train_generator=Generator2D( (32, 32), (0, 0), (L, T), method='equally-spaced-noisy'), batch_size=64) xs = np.linspace(0, L, 101) ts = np.linspace(0, T, 101) xx, tt = np.meshgrid(xs, ts) make_animation(solution_neural_net_heat, xs, ts) # test animation sol_ana = solution_analytical_heat(xx, tt) sol_net = solution_neural_net_heat(xx, tt, as_type='np') assert isclose(sol_net, sol_ana, atol=0.1).all() print('Neumann on the left Dirichlet on the right test passed.')