def test_failures(): x = np.linspace(0, 1, 2) y = np.zeros((2, x.size)) res = solve_bvp(exp_fun, exp_bc, x, y, tol=1e-5, max_nodes=5) assert_equal(res.status, 1) assert_(not res.success) x = np.linspace(0, 1, 5) y = np.zeros((2, x.size)) res = solve_bvp(undefined_fun, undefined_bc, x, y) assert_equal(res.status, 2) assert_(not res.success)
def test_singular_term(): x = np.linspace(0, 1, 10) x_test = np.linspace(0.05, 1, 100) y = np.empty((2, 10)) y[0] = (3 / 4)**0.5 y[1] = 1e-4 S = np.array([[0, 0], [0, -2]]) for fun_jac in [None, emden_fun_jac]: for bc_jac in [None, emden_bc_jac]: sol = solve_bvp(emden_fun, emden_bc, x, y, S=S, fun_jac=fun_jac, bc_jac=bc_jac) assert_equal(sol.status, 0) assert_(sol.success) assert_equal(sol.x.size, 10) sol_test = sol.sol(x_test) assert_allclose(sol_test[0], emden_sol(x_test), atol=1e-5) f_test = emden_fun(x_test, sol_test) + S.dot(sol_test) / x_test r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res**2, axis=0)**0.5 assert_(np.all(norm_res < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_complex(): # The test is essentially the same as test_no_params, but boundary # conditions are turned into complex. x = np.linspace(0, 1, 5) x_test = np.linspace(0, 1, 100) y = np.zeros((2, x.shape[0]), dtype=complex) for fun_jac in [None, exp_fun_jac]: for bc_jac in [None, exp_bc_jac]: sol = solve_bvp(exp_fun, exp_bc_complex, x, y, fun_jac=fun_jac, bc_jac=bc_jac) assert_equal(sol.status, 0) assert_(sol.success) sol_test = sol.sol(x_test) assert_allclose(sol_test[0].real, exp_sol(x_test), atol=1e-5) assert_allclose(sol_test[0].imag, exp_sol(x_test), atol=1e-5) f_test = exp_fun(x_test, sol_test) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(np.real(rel_res * np.conj(rel_res)), axis=0)**0.5 assert_(np.all(norm_res < 1e-3)) assert_(np.all(sol.rms_residuals < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_complex(): # The test is essentially the same as test_no_params, but boundary # conditions are turned into complex. x = np.linspace(0, 1, 5) x_test = np.linspace(0, 1, 100) y = np.zeros((2, x.shape[0]), dtype=complex) for fun_jac in [None, exp_fun_jac]: for bc_jac in [None, exp_bc_jac]: sol = solve_bvp(exp_fun, exp_bc_complex, x, y, fun_jac=fun_jac, bc_jac=bc_jac) assert_equal(sol.status, 0) assert_(sol.success) sol_test = sol.sol(x_test) assert_allclose(sol_test[0].real, exp_sol(x_test), atol=1e-5) assert_allclose(sol_test[0].imag, exp_sol(x_test), atol=1e-5) f_test = exp_fun(x_test, sol_test) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(np.real(rel_res * np.conj(rel_res)), axis=0) ** 0.5 assert_(np.all(norm_res < 1e-3)) assert_(np.all(sol.rms_residuals < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_singular_term(): x = np.linspace(0, 1, 10) x_test = np.linspace(0.05, 1, 100) y = np.empty((2, 10)) y[0] = (3/4)**0.5 y[1] = 1e-4 S = np.array([[0, 0], [0, -2]]) for fun_jac in [None, emden_fun_jac]: for bc_jac in [None, emden_bc_jac]: sol = solve_bvp(emden_fun, emden_bc, x, y, S=S, fun_jac=fun_jac, bc_jac=bc_jac) assert_equal(sol.status, 0) assert_(sol.success) assert_equal(sol.x.size, 10) sol_test = sol.sol(x_test) assert_allclose(sol_test[0], emden_sol(x_test), atol=1e-5) f_test = emden_fun(x_test, sol_test) + S.dot(sol_test) / x_test r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res ** 2, axis=0) ** 0.5 assert_(np.all(norm_res < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_with_params(): x = np.linspace(0, np.pi, 5) x_test = np.linspace(0, np.pi, 100) y = np.ones((2, x.shape[0])) for fun_jac in [None, sl_fun_jac]: for bc_jac in [None, sl_bc_jac]: sol = solve_bvp(sl_fun, sl_bc, x, y, p=[0.5], fun_jac=fun_jac, bc_jac=bc_jac) assert_equal(sol.status, 0) assert_(sol.success) assert_(sol.x.size < 10) assert_allclose(sol.p, [1], rtol=1e-4) sol_test = sol.sol(x_test) assert_allclose(sol_test[0], sl_sol(x_test, [1]), rtol=1e-4, atol=1e-4) f_test = sl_fun(x_test, sol_test, [1]) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res ** 2, axis=0) ** 0.5 assert_(np.all(norm_res < 1e-3)) assert_(np.all(sol.rms_residuals < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_no_params(): x = np.linspace(0, 1, 5) x_test = np.linspace(0, 1, 100) y = np.zeros((2, x.shape[0])) for fun_jac in [None, exp_fun_jac]: for bc_jac in [None, exp_bc_jac]: sol = solve_bvp(exp_fun, exp_bc, x, y, fun_jac=fun_jac, bc_jac=bc_jac) assert_equal(sol.status, 0) assert_(sol.success) assert_equal(sol.x.size, 5) sol_test = sol.sol(x_test) assert_allclose(sol_test[0], exp_sol(x_test), atol=1e-5) f_test = exp_fun(x_test, sol_test) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res**2, axis=0)**0.5 assert_(np.all(norm_res < 1e-3)) assert_(np.all(sol.rms_residuals < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_big_problem_with_parameters(): n = 30 x = np.linspace(0, np.pi, 5) x_test = np.linspace(0, np.pi, 100) y = np.ones((2 * n, x.size)) for fun_jac in [None, big_fun_with_parameters_jac]: for bc_jac in [None, big_bc_with_parameters_jac]: sol = solve_bvp(big_fun_with_parameters, big_bc_with_parameters, x, y, p=[0.5, 0.5], fun_jac=fun_jac, bc_jac=bc_jac) assert_equal(sol.status, 0) assert_(sol.success) assert_allclose(sol.p, [1, 1], rtol=1e-4) sol_test = sol.sol(x_test) for isol in range(0, n, 4): assert_allclose(sol_test[isol], big_sol_with_parameters(x_test, [1, 1])[0], rtol=1e-4, atol=1e-4) assert_allclose(sol_test[isol + 2], big_sol_with_parameters(x_test, [1, 1])[1], rtol=1e-4, atol=1e-4) f_test = big_fun_with_parameters(x_test, sol_test, [1, 1]) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res ** 2, axis=0) ** 0.5 assert_(np.all(norm_res < 1e-3)) assert_(np.all(sol.rms_residuals < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_verbose(): # Smoke test that checks the printing does something and does not crash x = np.linspace(0, 1, 5) y = np.zeros((2, x.shape[0])) for verbose in [0, 1, 2]: old_stdout = sys.stdout sys.stdout = StringIO() try: sol = solve_bvp(exp_fun, exp_bc, x, y, verbose=verbose) text = sys.stdout.getvalue() finally: sys.stdout = old_stdout assert_(sol.success) if verbose == 0: assert_(not text, text) if verbose >= 1: assert_("Solved in" in text, text) if verbose >= 2: assert_("Max residual" in text, text)
def test_big_problem(): n = 30 x = np.linspace(0, 1, 5) y = np.zeros((2 * n, x.size)) sol = solve_bvp(big_fun, big_bc, x, y) assert_equal(sol.status, 0) assert_(sol.success) sol_test = sol.sol(x) assert_allclose(sol_test[0], big_sol(x, n)) f_test = big_fun(x, sol_test) r = sol.sol(x, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(np.real(rel_res * np.conj(rel_res)), axis=0) ** 0.5 assert_(np.all(norm_res < 1e-3)) assert_(np.all(sol.rms_residuals < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_shock_layer(): x = np.linspace(-1, 1, 5) x_test = np.linspace(-1, 1, 100) y = np.zeros((2, x.size)) sol = solve_bvp(shock_fun, shock_bc, x, y) assert_equal(sol.status, 0) assert_(sol.success) assert_(sol.x.size < 110) sol_test = sol.sol(x_test) assert_allclose(sol_test[0], shock_sol(x_test), rtol=1e-5, atol=1e-5) f_test = shock_fun(x_test, sol_test) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res**2, axis=0)**0.5 assert_(np.all(norm_res < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_big_problem(): n = 30 x = np.linspace(0, 1, 5) y = np.zeros((2 * n, x.size)) sol = solve_bvp(big_fun, big_bc, x, y) assert_equal(sol.status, 0) assert_(sol.success) sol_test = sol.sol(x) assert_allclose(sol_test[0], big_sol(x, n)) f_test = big_fun(x, sol_test) r = sol.sol(x, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(np.real(rel_res * np.conj(rel_res)), axis=0)**0.5 assert_(np.all(norm_res < 1e-3)) assert_(np.all(sol.rms_residuals < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_nonlin_bc(): x = np.linspace(0, 0.1, 5) x_test = x y = np.zeros([2, x.size]) sol = solve_bvp(nonlin_bc_fun, nonlin_bc_bc, x, y) assert_equal(sol.status, 0) assert_(sol.success) assert_(sol.x.size < 8) sol_test = sol.sol(x_test) assert_allclose(sol_test[0], nonlin_bc_sol(x_test), rtol=1e-5, atol=1e-5) f_test = nonlin_bc_fun(x_test, sol_test) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res ** 2, axis=0) ** 0.5 assert_(np.all(norm_res < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)
def test_shock_layer(): x = np.linspace(-1, 1, 5) x_test = np.linspace(-1, 1, 100) y = np.zeros((2, x.size)) sol = solve_bvp(shock_fun, shock_bc, x, y) assert_equal(sol.status, 0) assert_(sol.success) assert_(sol.x.size < 110) sol_test = sol.sol(x_test) assert_allclose(sol_test[0], shock_sol(x_test), rtol=1e-5, atol=1e-5) f_test = shock_fun(x_test, sol_test) r = sol.sol(x_test, 1) - f_test rel_res = r / (1 + np.abs(f_test)) norm_res = np.sum(rel_res ** 2, axis=0) ** 0.5 assert_(np.all(norm_res < 1e-3)) assert_allclose(sol.sol(sol.x), sol.y, rtol=1e-10, atol=1e-10) assert_allclose(sol.sol(sol.x, 1), sol.yp, rtol=1e-10, atol=1e-10)