Пример #1
0
    def case_3():
        '''Find roots of concave down quadratic function.'''
        def f(x):
            return -((x + 3)**2) + 2

        x_lims = -8, 2
        y_lims = -6, 6
        f_string = 'f(x) = -(x+3)^2 + 2'

        # Test non-Var input
        x0 = 1
        solution, x_path, y_path = rf.NewtonRoot(f, x0)
        rf.plot_results(f,
                        x_path,
                        y_path,
                        f_string,
                        x_lims,
                        y_lims,
                        animate=True,
                        hide=True)

        root_1 = [-3 + np.sqrt(2)]
        root_2 = [-3 - np.sqrt(2)]
        assert (np.allclose(solution.val, root_1)
                or np.allclose(solution.val, root_2))

        plt.close('all')
Пример #2
0
    def case_7():
        '''Find the roots of a more complicated function from R^3 to R^1.'''
        def f(variables):
            x, y, z = variables
            return (x + y + z)**2 - 3

        f_string = 'f(x, y, z) = (x + y + z)^2 - 3'

        for x_val, y_val, z_val in [[1, -2, 5], [20, 15, -5]]:
            init_vars = [x_val, y_val, z_val]
            solution, xyz_path, f_path = rf.NewtonRoot(f, init_vars)
            m = len(solution.val)
            xn, yn, zn = solution.val
            rf.plot_results(f,
                            xyz_path,
                            f_path,
                            f_string,
                            fourdim=True,
                            hide=True)

            # root: z = -y -z +- sqrt(3)
            root_1 = -yn - zn - np.sqrt(3)
            root_2 = -yn - zn + np.sqrt(3)
            assert (np.allclose(xn, root_1) or np.allclose(xn, root_2))

            # dfdx = 2(x + y + z)
            # dfdy = 2(x + y + z)
            # dfdz = 2(x + y + z)
            value = 2 * (xn + yn + zn)
            der = [value, value, value]
            assert np.allclose(solution.der, der)

        plt.close('all')
Пример #3
0
    def case_2():
        '''Find root of concave up quadratic function.'''
        def f(x):
            return (x - 1)**2 - 1

        x_lims = -4, 6
        y_lims = -2, 8
        f_string = 'f(x) = (x - 1)^2 - 1'

        x0 = [da.Var(3)]
        solution, x_path, y_path = rf.NewtonRoot(f, x0)

        rf.plot_results(f,
                        x_path,
                        y_path,
                        f_string,
                        x_lims,
                        y_lims,
                        animate=True,
                        hide=True)

        root_1, der_1 = [0], [-2]
        root_2, der_2 = [2], [2]
        assert ((np.allclose(solution.val, root_1)
                 and np.allclose(solution.der, der_1))
                or (np.allclose(solution.val, root_2)
                    and np.allclose(solution.der, der_2)))

        plt.close('all')
Пример #4
0
    def case_5():
        def f(variables):
            x, y = variables
            return (x - 1)**2 + (y + 1)**2

        f_string = 'f(x, y) = (x - 1)^2 + (y + 1)^2'

        for x_val, y_val in [[2, 10], [-5, -4]]:
            x0 = da.Var(x_val, [1, 0])
            y0 = da.Var(y_val, [0, 1])
            init_vars = [x0, y0]
            solution, xy_path, f_path = rf.NewtonRoot(f, init_vars)
            xn, yn = solution.val
            rf.plot_results(f,
                            xy_path,
                            f_path,
                            f_string,
                            threedim=True,
                            hide=True)

            # root: x = 1 +- sqrt(-(y + 1)^2)
            inner = -(yn + 1)**2
            inner = 0 if abs(inner) < 1e-6 else inner
            value = np.sqrt(inner)
            root_1 = 1 + value
            root_2 = 1 - value
            assert (np.allclose(xn, root_1) or np.allclose(xn, root_2))

            # dfdx = 2(x - 1)
            # dfdy = 2(y + 1)
            der = [2 * (xn - 1), 2 * (yn + 1)]
            assert np.allclose(solution.der, der)

        plt.close('all')
Пример #5
0
    def case_6():
        '''Find the roots of a function from R^3 to R^1.'''
        def f(variables):
            x, y, z = variables
            return x**2 + y**2 + z**2

        f_string = 'f(x, y, z) = x^2 + y^2 + z^2'

        for x_val, y_val, z_val in [[1, -2, 5], [20, 15, -5]]:
            init_vars = [x_val, y_val, z_val]
            solution, xyz_path, f_path = rf.NewtonRoot(f, init_vars)
            m = len(solution.val)
            xn, yn, zn = solution.val
            rf.plot_results(f,
                            xyz_path,
                            f_path,
                            f_string,
                            fourdim=True,
                            animate=True,
                            hide=True)

            root = [0, 0, 0]
            assert np.allclose(solution.val, root)

            # dfdx = 2x
            # dfdy = 2y
            # dfdz = 2z
            der = [2 * xn, 2 * yn, 2 * zn]
            assert np.allclose(solution.der, der)

        plt.close('all')
Пример #6
0
    def case_3():
        '''Find global mininum and root at (0, 0) for f(x, y) = x^2 + y^2.'''
        def f(variables):
            x, y = variables
            return x**2 + y**2

        f_string = 'f(x, y) = x^2 + y^2'

        for x_val, y_val in [[2, 5], [-1, 3]]:
            x0 = da.Var(x_val, [1, 0])
            y0 = da.Var(y_val, [0, 1])
            init_vars = [x0, y0]
            solution, xy_path, f_path = rf.NewtonRoot(f, init_vars, iters=4000)
            xn, yn = solution.val
            rf.plot_results(f,
                            xy_path,
                            f_path,
                            f_string,
                            x_lims=(-10, 10),
                            y_lims=(-10, 10),
                            threedim=True,
                            animate=True,
                            hide=True)

            # root: x = y = 0
            der = [0, 0]
            assert (np.allclose(xn, 0) and np.allclose(xn, 0))
            assert np.allclose(solution.der, der)

        plt.close('all')
Пример #7
0
    def case_4():
        '''Complicated function.'''
        def f(variables):
            x, y = variables
            return x**2 + 4 * y**2 - 2 * (x**2) * y + 4

        f_string = 'f(x, y) = x^2 + 4y^2 -2x^2y + 4'

        for x_val, y_val in [[-8, -5], [2, 12], [-5, -4]]:
            # Test initial guess without using da.Var type
            init_vars = [x_val, y_val]
            solution, xy_path, f_path = rf.NewtonRoot(f, init_vars)
            xn, yn = solution.val
            rf.plot_results(f,
                            xy_path,
                            f_path,
                            f_string,
                            threedim=True,
                            speed=25,
                            hide=True)

            # root: x = +- 2(sqrt(y^2 + 1))/sqrt(2y - 1)
            value = 2 * np.sqrt(yn**2 + 1) / (np.sqrt(2 * yn - 1))
            assert (np.allclose(xn, value) or np.allclose(xn, -value))

            # dfdx = x(2 - 4y)
            # dfdy = 8y - 2x^2
            der_x = xn * (2 - 4 * yn)
            der_y = 8 * yn - (2 * (xn**2))
            assert np.allclose(solution.der, [der_x, der_y])

        plt.close('all')
Пример #8
0
    def case_2():
        '''Find a root of z(x, y) = x^2 - y^2, i.e. x = +-y.'''
        def f(variables):
            x, y = variables
            return x**2 - y**2

        f_string = 'f(x, y) = x^2 - y^2'

        for x_val, y_val in [[-4, 2], [12, -1]]:
            x0 = da.Var(x_val, [1, 0])
            y0 = da.Var(y_val, [0, 1])
            init_vars = [x0, y0]
            solution, xy_path, f_path = rf.NewtonRoot(f, init_vars)
            xn, yn = solution.val
            rf.plot_results(f,
                            xy_path,
                            f_path,
                            f_string,
                            threedim=True,
                            animate=True,
                            hide=True)

            # root: x = +-y
            der = [2 * xn, -2 * yn]
            assert (np.allclose(xn, yn) or np.allclose(xn, -yn))
            assert np.allclose(solution.der, der)

        plt.close('all')
Пример #9
0
    def case_1():
        '''Find a root of f(x, y) = x + y, i.e x = -y'''
        def f(variables):
            x, y = variables
            return x + y

        f_string = 'f(x, y) = x + y'

        for x_val, y_val in [[-4, 3], [8, 1]]:
            x0 = da.Var(x_val, [1, 0])
            y0 = da.Var(y_val, [0, 1])
            init_vars = [x0, y0]
            solution, xy_path, f_path = rf.NewtonRoot(f, init_vars)
            xn, yn = solution.val
            rf.plot_results(f,
                            xy_path,
                            f_path,
                            f_string,
                            threedim=True,
                            hide=True)
            # fig.show()

            # root: x = -y
            der = [1, 1]
            np.testing.assert_array_almost_equal(xn, -yn)
            np.testing.assert_array_almost_equal(solution.der, der)

        plt.close('all')
Пример #10
0
    def case_4():
        '''Find roots of cubic function.'''
        def f(x):
            return (x - 4)**3 - 3

        x_lims = 0, 8
        y_lims = -12, 12
        f_string = 'f(x) = (x - 4)^3 - 3'

        x0 = 2.5
        solution, x_path, y_path = rf.NewtonRoot(f, x0)
        rf.plot_results(f, x_path, y_path, f_string, x_lims, y_lims, hide=True)

        root = [4 + np.cbrt(3)]
        np.testing.assert_array_almost_equal(solution.val, root)

        plt.close('all')
Пример #11
0
    def case_1():
        '''Find root of quadratic function that is also a global minimum.'''
        def f(x):
            return x**2

        x_lims = -4, 4
        y_lims = -4, 4
        f_string = 'f(x) = x^2'

        x0 = [da.Var(-2)]
        solution, x_path, y_path = rf.NewtonRoot(f, x0)
        rf.plot_results(f, x_path, y_path, f_string, x_lims, y_lims, hide=True)

        root = [0]
        der = [0]
        np.testing.assert_array_almost_equal(solution.val, root, decimal=4)
        np.testing.assert_array_almost_equal(solution.der, der, decimal=4)

        plt.close('all')
Пример #12
0
    def case_6():
        '''Find roots of complicated scalar function.'''
        x_var = da.Var(0.1)

        def f(x):
            return x - np.exp(-2.0 * np.sin(4.0 * x) * np.sin(4.0 * x)) + 0.3

        x_lims = -2, 2
        y_lims = -2, 2
        f_string = 'f(x) = x - e^{-2 * sin(4x) * sin(4x)} + 0.3'

        x0 = 0.0
        solution, x_path, y_path = rf.NewtonRoot(f, x0)
        rf.plot_results(f, x_path, y_path, f_string, x_lims, y_lims, hide=True)

        root = [0.166402]
        der = [4.62465]
        np.testing.assert_array_almost_equal(solution.val, root, decimal=4)
        np.testing.assert_array_almost_equal(solution.der, der, decimal=4)

        plt.close('all')
Пример #13
0
    def case_5():
        '''Find roots of sinusoidal wave.'''
        def f(x):
            return np.sin(x)

        x_lims = -2 * np.pi, 3 * np.pi
        y_lims = -2, 2
        f_string = 'f(x) = sin(x)'

        x0 = da.Var(2 * np.pi - 0.25)
        solution, x_path, y_path = rf.NewtonRoot(f, x0)
        rf.plot_results(f,
                        x_path,
                        y_path,
                        f_string,
                        x_lims,
                        y_lims,
                        animate=True,
                        hide=True)

        root_multiple_of_pi = (solution.val / np.pi) % 1
        np.testing.assert_array_almost_equal(root_multiple_of_pi, [0.])

        plt.close('all')