예제 #1
0
def test_quadratic_basis_xy():
    assert bm.create_basis(pde2_xy, data_test) == [[0, 0, 0, 0, 0, 1],
                                                   [0, 0, 0, 0, 0, 1],
                                                   [0, 0, 0, 0, 0, 1]]
예제 #2
0
def test_quadratic_basis_y():
    assert bm.create_basis(pde2_y, data_test) == [[0, 0, 0, 1, 0, 0],
                                                  [0, 0, 0, 1, 4, 4],
                                                  [0, 0, 0, 1, 8, 4]]
예제 #3
0
def test_quadratic_basis_yy():
    assert bm.create_basis(pde2_yy, data_test) == [[0, 0, 0, 0, 2, 0],
                                                   [0, 0, 0, 0, 2, 0],
                                                   [0, 0, 0, 0, 2, 0]]
예제 #4
0
def test_quadratic_basis():
    assert bm.create_basis(pde2, data_test) == [[1, 0, 0, 0, 0, 0],
                                                [1, 4, 16, 2.0, 4.0, 8.0],
                                                [1, 4, 16, 4, 16, 16]]
예제 #5
0
def test_quadratic_basis_x():
    assert bm.create_basis(pde2_x, data_test) == [[0, 1, 0, 0, 0, 0],
                                                  [0, 1, 8, 0, 0, 2],
                                                  [0, 1, 8, 0, 0, 4]]
예제 #6
0
def test_linear_basis_y():
    assert bm.create_basis(pde1_y, data_test) == [[0, 0, 1], [0, 0, 1],
                                                  [0, 0, 1]]
예제 #7
0
def test_linear_basis_xy():
    assert bm.create_basis(pde1_xy, data_test) == [[0, 0, 0], [0, 0, 0],
                                                   [0, 0, 0]]
예제 #8
0
def test_cubic_basis_xy():
    assert bm.create_basis(pde3_xy,
                           data_test) == [[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
                                          [0, 0, 0, 0, 1, 0, 0, 8, 4, 0],
                                          [0, 0, 0, 0, 1, 0, 0, 8, 8, 0]]
예제 #9
0
def test_linear_basis():
    assert bm.create_basis(pde1, data_test) == [[1, 0, 0], [1, 4, 2],
                                                [1, 4, 4]]
예제 #10
0
def test_cubic_basis_xx():
    assert bm.create_basis(pde3_xx,
                           data_test) == [[0, 0, 0, 2, 0, 0, 0, 0, 0, 0],
                                          [0, 0, 0, 2, 0, 0, 24, 4, 0, 0],
                                          [0, 0, 0, 2, 0, 0, 24, 8, 0, 0]]
예제 #11
0
def test_cubic_basis_yy():
    assert bm.create_basis(pde3_yy,
                           data_test) == [[0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
                                          [0, 0, 0, 0, 0, 2, 0, 0, 8, 12],
                                          [0, 0, 0, 0, 0, 2, 0, 0, 8, 24]]
예제 #12
0
def test_cubic_basis_y():
    assert bm.create_basis(pde3_y,
                           data_test) == [[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
                                          [0, 0, 1, 0, 4, 4, 0, 16, 16, 12],
                                          [0, 0, 1, 0, 4, 8, 0, 16, 32, 48]]
예제 #13
0
def test_cubic_basis_x():
    assert bm.create_basis(pde3_x,
                           data_test) == [[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
                                          [0, 1, 0, 8, 2, 0, 48, 16, 4, 0],
                                          [0, 1, 0, 8, 4, 0, 48, 32, 16, 0]]
예제 #14
0
def test_cubic_basis():
    assert bm.create_basis(
        pde3, data_test) == [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                             [1, 4, 2, 16, 8, 4, 64, 32, 16, 8],
                             [1, 4, 4, 16, 16, 16, 64, 64, 64, 64]]
예제 #15
0
import numpy as np
import weightmatrix as wm
from numpy import linalg as la
import basismatrix as bm
import basis as b
import coefficients as c
import minimumradius as mr

r_data = [[0, 1], [0.5, 1.5], [1, 2], [1.5, 2.5], [2, 3], [2.5, 3.5], [3, 4], [3.5, 4.5], [4, 5]]
contour_point = [[0, 0], [4, 4]]

radius_approximation = mr.get_radius(r_data, r_data[4], 3, contour_point)
print(radius_approximation)

base = b.pde_basis(1)[0]
P = bm.create_basis(base, r_data, r_data[4], radius_approximation)
Pt = np.transpose(P)
Peso = wm.W(r_data, r_data[4], radius_approximation)

print('P = ', P)
print('Pt = ', Pt)
print('W = ', Peso)

A = Pt @ Peso @ P

print('A = ', A)

B_matrix = Pt @ Peso

pt = bm.create_basis(base, [r_data[4]])
print('pt = ', pt)
예제 #16
0
def coefficients(data, point, basis_order, derivative=None):
    basis = b.pde_basis(basis_order)[0]
    m = len(basis)
    r = mr.get_radius(data, point, m)

    while True:
        P = bm.create_basis(basis, data, point, r)  # Basis matrix
        Pt = np.transpose(P)
        weight_ = wm.W(data, point, r)
        pt = bm.create_basis(basis, [point])
        B = Pt @ weight_
        A = B @ P
        _, det = la.slogdet(A)
        determinante = det
        if det < np.log(1e-6) and m < len(data) - 1:
            r *= 1.05
            continue
        else:
            pass

        if not derivative:
            return pt @ la.inv(A) @ B

        else:

            # For dx or dy

            dptd_ = bm.create_basis(derivative['base1'], [point])
            dWd_ = wm.W(data, point, r, {'order': 1, 'var': derivative['var']})
            dAd_ = Pt @ dWd_ @ P
            dBd_ = Pt @ dWd_
            invA = la.inv(A)  # A inverse

            # For dx² or dy²

            dptd_2 = bm.create_basis(derivative['base2'], [point])
            d2Wd_ = wm.W(data, point, r, {
                'order': 2,
                'var': derivative['var']
            })
            d2Bd_2 = Pt @ d2Wd_
            d2Ad_2 = d2Bd_2 @ P

            # For dxy and dyx:
            dptd_x = bm.create_basis(b.pde_basis(basis_order)[1], [point])
            dptd_y = bm.create_basis(b.pde_basis(basis_order)[2], [point])

            dxyWd_ = wm.W(data, point, r, {
                'order': 2,
                'var': derivative['var']
            })
            dxWd_ = wm.W(data, point, r, {'order': 1, 'var': 'x'})
            dyWd_ = wm.W(data, point, r, {'order': 1, 'var': 'y'})

            dxyBd = Pt @ dxyWd_
            dxBd = Pt @ dxWd_
            dyBd = Pt @ dyWd_
            dxyAd = dxyBd @ P
            dxAd = dxBd @ P
            dyAd = dyBd @ P

            # First derivative:

            d1 = dptd_ @ invA @ B - pt @ invA @ dAd_ @ invA @ B + pt @ invA @ dBd_

            # Second derivative:

            d2 = dptd_2 @ invA @ B + np.array(
                [[2]]
            ) @ pt @ invA @ dAd_ @ invA @ dAd_ @ invA @ B - pt @ invA @ d2Ad_2 @ invA @ B + pt @ invA @ d2Bd_2 - np.array(
                [[2]]) @ dptd_ @ invA @ dAd_ @ invA @ B + np.array(
                    [[2]]) @ dptd_ @ invA @ dBd_ - np.array(
                        [[2]]) @ pt @ invA @ dAd_ @ invA @ dBd_

            # Derivative for xy:

            dxy = dptd_2 @ invA @ B - dptd_y @ invA @ dxAd @ invA @ B + dptd_y @ invA @ dxBd - dptd_x @ invA @ dyAd @ invA @ B + pt @ invA @ dxAd @ invA @ dyAd @ invA @ B - pt @ invA @ dxyAd @ invA @ B + pt @ invA @ dyAd @ invA @ dxAd @ invA @ B - pt @ invA @ dyAd @ invA @ dxBd + dptd_x @ invA @ dyBd - pt @ invA @ dxAd @ invA @ dyBd + pt @ invA @ dxyBd

            if derivative['order'] == 1:
                return d1
            elif derivative['order'] == 2 and derivative['var'] != 'xy':
                return d2
            elif derivative['order'] == 2 and derivative['var'] == 'xy':
                return dxy
        break