예제 #1
0
def exercise8():
    file_name = 'q8_3.npz'
    f = open(file_name, 'rb')
    npzfile = np.load(f)

    a = npzfile['a']
    b = npzfile['b']
    d = npzfile['d']
    xc = npzfile['xc']
    b_measured = npzfile['F']

    # Create source points
    n = xc.shape[0]
    xs = chebyshev(a, b, n)  # Source points
    lambda_select = 10**(-4)

    print(a)
    print(b)
    print(d)
    print(xc.shape[0])

    # Calculate A-matrix from Legendre-Gauss quadrature
    xq, w = legendre(a, b, 2 * n**2)
    a_matrix = fredholm_lhs(d, xc, xs, xq, w, kernel)

    identity_matrix = np.identity(a_matrix.shape[0])
    a_matrix_transposed = np.transpose(a_matrix)

    left_side = np.matmul(a_matrix_transposed,
                          a_matrix) + (lambda_select * identity_matrix)
    right_side = np.matmul(a_matrix_transposed, b_measured)

    rho_solution = np.linalg.solve(left_side, right_side)

    plt.figure("measurement-8-3")
    plt.title("Solution to measurement 3")
    plt.plot(xc, rho_solution, label="Numeric, $\lambda = 10^{-4}$")
    plt.xlabel('xc')
    plt.ylabel('Rho(x)')
    plt.legend()
    plt.grid(True)
    plt.show()
예제 #2
0
def exercise7():
    # Orders
    Nc = 30  # Number of collocation points
    Ns = 30
    Nq = Nc**2  # Number of panels

    # Limits
    a = 0
    b = 1

    # Constants
    omega = 3 * np.pi
    gamma = -2

    # Depths
    d2 = 0.25
    d3 = 2.5

    # Create chebyshev points
    xc = chebyshev(a, b, Nc)  # Collocation points
    xs = chebyshev(a, b, Nc)  # Source points

    rho_analytic = rho(omega, gamma, xs)

    # Analytic disturbed b-vector
    b_analytic_disturbed2 = fredholm_rhs(a, b, omega, gamma, d2,
                                         xc) * (1 + epsilon(xc))
    b_analytic_disturbed3 = fredholm_rhs(a, b, omega, gamma, d3,
                                         xc) * (1 + epsilon(xc))

    xq, w = legendre(a, b, Nq)
    lambda_vector = lambda_list(16)
    identity_matrix = np.identity(Nc)
    rho_vector2 = np.zeros(lambda_vector.shape[0])
    rho_vector3 = np.zeros(lambda_vector.shape[0])

    # Calculate A-matrix from Legendre-Gauss quadrature
    a_matrix2 = fredholm_lhs(d2, xc, xs, xq, w, kernel)
    a_matrix_transposed2 = np.transpose(a_matrix2)
    a_matrix3 = fredholm_lhs(d3, xc, xs, xq, w, kernel)
    a_matrix_transposed3 = np.transpose(a_matrix3)

    for j in range(lambda_vector.shape[0]):

        # Calculate 2
        left_side = np.matmul(a_matrix_transposed2,
                              a_matrix2) + (lambda_vector[j] * identity_matrix)
        right_side = np.matmul(a_matrix_transposed2, b_analytic_disturbed2)
        rho_vector2[j] = np.amax(
            np.absolute(
                np.subtract(np.linalg.solve(left_side, right_side),
                            rho_analytic)))

        # Calculate 3
        left_side = np.matmul(a_matrix_transposed3,
                              a_matrix3) + (lambda_vector[j] * identity_matrix)
        right_side = np.matmul(a_matrix_transposed3, b_analytic_disturbed3)
        rho_vector3[j] = np.amax(
            np.absolute(
                np.subtract(np.linalg.solve(left_side, right_side),
                            rho_analytic)))

    plt.figure("tikhonov")
    plt.title("Rho error")
    plt.loglog(lambda_vector, rho_vector2, label="Numeric, $d = 0.25$")
    plt.loglog(lambda_vector, rho_vector3, label="Numeric, $d = 2.5$")
    plt.xlabel('Lambda')
    plt.ylabel('Rho(x) error')
    plt.legend()
    plt.grid(True)
    plt.show()
예제 #3
0
def exercise5():

    # Orders
    Nc = 30  # Number of collocation points
    Nq = Nc**2  # Number of panels

    # Limits
    a = 0
    b = 1

    # Constants
    omega = 3 * np.pi
    gamma = -2

    # Depths
    d1 = 0.025
    d2 = 0.25
    d3 = 2.5

    # Error
    error1 = np.zeros(Nc - 5)
    error2 = np.zeros(Nc - 5)
    error3 = np.zeros(Nc - 5)
    axis = np.arange(5, Nc, 1)

    for i in range(5, Nc, 1):
        # Print each iteration
        print(i)

        # Create points
        xc = chebyshev(a, b, i)  # Collocation points
        xs = chebyshev(a, b, i)  # Source points

        # Calculate true rho
        rho_analytic = rho(omega, gamma, xs)

        # Calculate A-matrix from Legendre-Gauss quadrature
        xq, w = legendre(a, b, Nq)
        a_matrix_legendre1 = fredholm_lhs(d1, xc, xs, xq, w, kernel)
        a_matrix_legendre2 = fredholm_lhs(d2, xc, xs, xq, w, kernel)
        a_matrix_legendre3 = fredholm_lhs(d3, xc, xs, xq, w, kernel)

        # Find rho by linear algebra
        rho_numeric1 = np.linalg.solve(
            a_matrix_legendre1, fredholm_rhs(a, b, omega, gamma, d1, xc))
        rho_numeric2 = np.linalg.solve(
            a_matrix_legendre2, fredholm_rhs(a, b, omega, gamma, d2, xc))
        rho_numeric3 = np.linalg.solve(
            a_matrix_legendre3, fredholm_rhs(a, b, omega, gamma, d3, xc))

        error1[i - 5] = np.amax(
            np.absolute(np.subtract(rho_numeric1, rho_analytic)))
        error2[i - 5] = np.amax(
            np.absolute(np.subtract(rho_numeric2, rho_analytic)))
        error3[i - 5] = np.amax(
            np.absolute(np.subtract(rho_numeric3, rho_analytic)))

    plt.figure("inverse-error")
    plt.title("Numerical solution for Rho")
    plt.semilogy(axis, error1, label="$d = 0.025$")
    plt.semilogy(axis, error2, label="$d = 0.25$")
    plt.semilogy(axis, error3, label="$d = 2.5$")
    plt.xlabel('Nc')
    plt.ylabel('Error')
    plt.legend()
    plt.grid(True)
    plt.show()
예제 #4
0
def exercise6():

    # Orders
    Nc = 30  # Number of collocation points
    Nq = Nc**2  # Number of panels

    # Limits
    a = 0
    b = 1

    # Constants
    omega = 3 * np.pi
    gamma = -2

    # Depths
    d1 = 0.025
    d2 = 0.25
    d3 = 2.5

    # Create chebyshev points
    xc = chebyshev(a, b, Nc)  # Collocation points
    xs = chebyshev(a, b, Nc)  # Source points
    """
    # Plot 1 (d = 0.025)
    b_analytic1 = fredholm_rhs(a, b, omega, gamma, d1, xc)
    b_analytic_disturbed1 = fredholm_rhs(a, b, omega, gamma, d1, xc) * (1 + epsilon(xc))
    
    plt.figure("inverse-error")
    plt.title("Analytic with and without random noise")
    plt.plot(xc, b_analytic1, label="Analytic, $d = 0.025$")
    plt.plot(xc, b_analytic_disturbed1, label="Analytic disturbed, $d = 0.025$")
    plt.xlabel('x')
    plt.ylabel('F(x)')
    plt.legend()
    plt.grid(True)
    plt.show()

    # Plot 2 (d = 0.25)
    b_analytic2 = fredholm_rhs(a, b, omega, gamma, d2, xc)
    b_analytic_disturbed2 = fredholm_rhs(a, b, omega, gamma, d2, xc) * (1 + epsilon(xc))

    plt.figure("inverse-error")
    plt.title("Analytic with and without random noise")
    plt.plot(xc, b_analytic2, label="Analytic, $d = 0.25$")
    plt.plot(xc, b_analytic_disturbed2, label="Analytic disturbed, $d = 0.25$")
    plt.xlabel('x')
    plt.ylabel('F(x)')
    plt.legend()
    plt.grid(True)
    plt.show()

    # Plot 3 (d = 2.5)
    b_analytic3 = fredholm_rhs(a, b, omega, gamma, d3, xc)
    b_analytic_disturbed3 = fredholm_rhs(a, b, omega, gamma, d3, xc) * (1 + epsilon(xc))

    plt.figure("inverse-error")
    plt.title("Analytic with and without random noise")
    plt.plot(xc, b_analytic3, label="Analytic, $d = 2.5$")
    plt.plot(xc, b_analytic_disturbed3, label="Analytic disturbed, $d = 2.5$")
    plt.xlabel('x')
    plt.ylabel('F(x)')
    plt.legend()
    plt.grid(True)
    plt.show()
    """
    # Rho analytic
    rho_analytic = rho(omega, gamma, xs)
    xq, w = legendre(a, b, Nq)

    # Plot 4
    a_matrix_legendre1 = fredholm_lhs(d1, xc, xs, xq, w, kernel)
    rho_numeric1 = np.linalg.solve(a_matrix_legendre1,
                                   fredholm_rhs(a, b, omega, gamma, d1, xc))
    rho_numeric_disturbed1 = np.linalg.solve(
        a_matrix_legendre1,
        fredholm_rhs(a, b, omega, gamma, d1, xc) * (1 + epsilon(xc)))

    plt.figure("inverse-error")
    plt.title("Rho")
    plt.plot(xc, rho_analytic, label="Analytic, $d = 0.025$")
    plt.plot(xc, rho_numeric1, label="Numeric, $d = 0.025$")
    plt.plot(xc,
             rho_numeric_disturbed1,
             label="Numeric disturbed, $d = 0.025$")
    plt.xlabel('x')
    plt.ylabel('Rho(x)')
    plt.legend()
    plt.grid(True)
    plt.show()

    # Plot 5
    a_matrix_legendre2 = fredholm_lhs(d2, xc, xs, xq, w, kernel)
    rho_numeric2 = np.linalg.solve(a_matrix_legendre2,
                                   fredholm_rhs(a, b, omega, gamma, d2, xc))
    rho_numeric_disturbed2 = np.linalg.solve(
        a_matrix_legendre2,
        fredholm_rhs(a, b, omega, gamma, d2, xc) * (1 + epsilon(xc)))

    plt.figure("inverse-error")
    plt.title("Rho")
    plt.plot(xc, rho_analytic, label="Analytic, $d = 0.25$")
    plt.plot(xc, rho_numeric2, label="Numeric, $d = 0.25$")
    plt.plot(xc, rho_numeric_disturbed2, label="Numeric disturbed, $d = 0.25$")
    plt.yscale('symlog')
    plt.xlabel('x')
    plt.ylabel('Rho(x)')
    plt.legend()
    plt.grid(True)
    plt.show()

    # Plot 6
    a_matrix_legendre3 = fredholm_lhs(d3, xc, xs, xq, w, kernel)
    rho_numeric3 = np.linalg.solve(a_matrix_legendre3,
                                   fredholm_rhs(a, b, omega, gamma, d3, xc))
    rho_numeric_disturbed3 = np.linalg.solve(
        a_matrix_legendre3,
        fredholm_rhs(a, b, omega, gamma, d3, xc) * (1 + epsilon(xc)))

    plt.figure("inverse-error")
    plt.title("Rho")
    plt.plot(xc, rho_analytic, label="Analytic, $d = 2.5$")
    plt.plot(xc, rho_numeric3, label="Numeric, $d = 2.5$")
    plt.plot(xc, rho_numeric_disturbed3, label="Numeric disturbed, $d = 2.5$")
    plt.yscale('symlog')
    plt.xlabel('x')
    plt.ylabel('Rho(x)')
    plt.legend()
    plt.grid(True)
    plt.show()
예제 #5
0
def exercise4():

    # Orders
    Nc = 40  # Number of collocation points
    Ns = Nc  # Number of source points
    Nq = 400  # Number of panels

    # Limits
    a = 0
    b = 1

    # Constants
    omega = 3 * np.pi
    gamma = -2

    # Depths
    d = 0.025

    # Create points
    xc = chebyshev(a, b, Nc)  # Collocation points
    xs = chebyshev(a, b, Ns)  # Source points

    # Calculate rho vector
    rho_vector = rho(omega, gamma, xs)

    # Calculate A-matrix from Legendre-Gauss quadrature
    xq, w = legendre(a, b, Nq)

    a_matrix_legendre = fredholm_lhs(d, xc, xs, xq, w, kernel)

    # Calculate numerical B-vector
    b_numeric_legendre = np.dot(a_matrix_legendre, rho_vector)

    # Calculate analytic B-vector
    b_analytic = fredholm_rhs(a, b, omega, gamma, d, xc)

    # Plot integration
    plt.figure("integration-plot")
    plt.title("Analytic and numerical integration")
    plt.plot(xc, b_analytic, label="Analytic")
    plt.plot(xc, b_numeric_legendre, label="Legendre")
    plt.xlabel('x')
    plt.ylabel('F(x)')
    plt.legend()
    plt.grid(True)

    # Get error by # of panels
    error_legendre = np.zeros(Nq - 2)
    error_axis = np.arange(1, Nq - 1, 1)

    for i in range(1, Nq - 1, 1):
        # Print each iteration
        print(i)

        # Calculate A-matrix from Legendre-Gauss quadrature
        xq, w = legendre(a, b, i)
        a_matrix_legendre = fredholm_lhs(d, xc, xs, xq, w, kernel)

        # Calculate numerical B-vector
        b_numeric_legendre = np.dot(a_matrix_legendre, rho_vector)

        # Calculate error
        error_legendre[i - 1] = np.amax(
            np.absolute(np.subtract(b_analytic, b_numeric_legendre)))

    plt.figure("error-plot")
    plt.title("Legendre-Gauss integration error")
    plt.semilogy(error_axis, error_legendre, label="Legendre error")
    plt.xlabel('Nq')
    plt.ylabel('Max integration error')
    plt.legend()
    plt.grid(True)
    plt.show()