def test_initial_value_problem_without_exact_solution(): diff_eq = PopulationGrowthEquation() cp = ConstrainedProblem(diff_eq) ic = ContinuousInitialCondition(cp, lambda _: np.array([0.])) ivp = InitialValueProblem(cp, (0., 2.), ic) assert not ivp.has_exact_solution with pytest.raises(RuntimeError): ivp.exact_y(2.)
def test_pidon_operator_on_ode_with_analytic_solution(): set_random_seed(0) r = 4. y_0 = 1. diff_eq = PopulationGrowthEquation(r) cp = ConstrainedProblem(diff_eq) t_interval = (0., .25) ic = ContinuousInitialCondition(cp, lambda _: np.array([y_0])) sampler = UniformRandomCollocationPointSampler() pidon = PIDONOperator(sampler, .001, True) training_loss_history, test_loss_history = pidon.train( cp, t_interval, training_data_args=DataArgs( y_0_functions=[ic.y_0], n_domain_points=25, n_batches=5, n_ic_repeats=5 ), model_args=ModelArgs( latent_output_size=1, trunk_hidden_layer_sizes=[50, 50, 50], ), optimization_args=OptimizationArgs( optimizer=optimizers.SGD(), epochs=100, verbose=False ), secondary_optimization_args=SecondaryOptimizationArgs( max_iterations=100, verbose=False ) ) assert len(training_loss_history) == 101 assert len(test_loss_history) == 0 assert training_loss_history[-1].weighted_total_loss.numpy() < 5e-5 ivp = InitialValueProblem( cp, t_interval, ic, lambda _ivp, t, x: np.array([y_0 * np.e ** (r * t)]) ) solution = pidon.solve(ivp) assert solution.d_t == .001 assert solution.discrete_y().shape == (250, 1) analytic_y = np.array([ivp.exact_y(t) for t in solution.t_coordinates]) assert np.mean(np.abs(analytic_y - solution.discrete_y())) < 1e-3 assert np.max(np.abs(analytic_y - solution.discrete_y())) < 2.5e-3
def test_initial_value_problem(): y_0 = 100 r = .5 diff_eq = PopulationGrowthEquation(r) cp = ConstrainedProblem(diff_eq) ic = ContinuousInitialCondition(cp, lambda _: np.array([y_0])) ivp = InitialValueProblem( cp, (0., 2.), ic, lambda _ivp, t, x: np.array([y_0 * np.e**(r * t)])) assert ivp.has_exact_solution assert ivp.constrained_problem == cp assert ivp.t_interval == (0., 2.) assert ivp.initial_condition == ic assert np.allclose(ivp.exact_y(0.), [y_0])
def test_ode_operator_on_ode_with_analytic_solution(): r = .02 y_0 = 100. diff_eq = PopulationGrowthEquation(r) cp = ConstrainedProblem(diff_eq) ic = ContinuousInitialCondition(cp, lambda _: np.array([y_0])) ivp = InitialValueProblem( cp, (0., 10.), ic, lambda _ivp, t, x: np.array([y_0 * np.e**(r * t)])) op = ODEOperator('DOP853', 1e-4) solution = op.solve(ivp) assert solution.d_t == 1e-4 assert solution.discrete_y().shape == (1e5, 1) analytic_y = np.array([ivp.exact_y(t) for t in solution.t_coordinates]) assert np.allclose(analytic_y, solution.discrete_y())