def test_functions(self): y = pybamm.StateVector(slice(0, 8)) u = pybamm.StateVector(slice(0, 2), slice(4, 6)) v = pybamm.StateVector(slice(2, 4), slice(6, 8)) y0 = np.arange(1, 9) const = pybamm.Scalar(1) func = pybamm.sin(u) jacobian = np.array( [ [np.cos(1), 0, 0, 0, 0, 0, 0, 0], [0, np.cos(2), 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, np.cos(5), 0, 0, 0], [0, 0, 0, 0, 0, np.cos(6), 0, 0], ] ) dfunc_dy = func.jac(y).evaluate(y=y0) np.testing.assert_array_equal(jacobian, dfunc_dy.toarray()) func = pybamm.cos(v) jacobian = np.array( [ [0, 0, -np.sin(3), 0, 0, 0, 0, 0], [0, 0, 0, -np.sin(4), 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, -np.sin(7), 0], [0, 0, 0, 0, 0, 0, 0, -np.sin(8)], ] ) dfunc_dy = func.jac(y).evaluate(y=y0) np.testing.assert_array_equal(jacobian, dfunc_dy.toarray()) func = pybamm.sin(3 * u * v) jacobian = np.array( [ [9 * np.cos(9), 0, 3 * np.cos(9), 0, 0, 0, 0, 0], [0, 12 * np.cos(24), 0, 6 * np.cos(24), 0, 0, 0, 0], [0, 0, 0, 0, 21 * np.cos(105), 0, 15 * np.cos(105), 0], [0, 0, 0, 0, 0, 24 * np.cos(144), 0, 18 * np.cos(144)], ] ) dfunc_dy = func.jac(y).evaluate(y=y0) np.testing.assert_array_equal(jacobian, dfunc_dy.toarray()) # when child evaluates to number func = pybamm.sin(const) dfunc_dy = func.jac(y).evaluate(y=y0) np.testing.assert_array_equal(0, dfunc_dy) # several children func = pybamm.Function(test_multi_var_function, 2 * y, 3 * y) jacobian = np.diag(5 * np.ones(8)) dfunc_dy = func.jac(y).evaluate(y=y0) np.testing.assert_array_equal(jacobian, dfunc_dy.toarray())
def test_cos(self): a = pybamm.InputParameter("a") fun = pybamm.cos(a) self.assertIsInstance(fun, pybamm.Cos) self.assertEqual(fun.children[0].id, a.id) self.assertEqual(fun.evaluate(inputs={"a": 3}), np.cos(3)) h = 0.0000001 self.assertAlmostEqual( fun.diff(a).evaluate(inputs={"a": 3}), ( pybamm.cos(pybamm.Scalar(3 + h)).evaluate() - fun.evaluate(inputs={"a": 3}) ) / h, places=5, ) # test simplify y = pybamm.StateVector(slice(0, 1)) fun = pybamm.cos(y) self.assertEqual(fun.id, fun.simplify().id)
def get_error(n): # create mesh and discretisation mesh = get_mesh_for_testing(n) disc = pybamm.Discretisation(mesh, spatial_methods) combined_submesh = mesh.combine_submeshes(*whole_cell) x = combined_submesh.nodes x_edge = pybamm.standard_spatial_vars.x_edge # Define flux and bcs N = x_edge**2 * pybamm.cos(x_edge) div_eqn = pybamm.div(N) # Define exact solutions # N = x**2 * cos(x) --> dNdx = x*(2cos(x) - xsin(x)) div_exact = x * (2 * np.cos(x) - x * np.sin(x)) # Discretise and evaluate div_eqn_disc = disc.process_symbol(div_eqn) div_approx = div_eqn_disc.evaluate() # Return difference between approx and exact return div_approx[:, 0] - div_exact