forked from denizdonmez/numethods
43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
import math
|
|
from numethods import *
|
|
|
|
def approx_equal(a, b, tol=1e-8):
|
|
return abs(a-b) <= tol*(1+abs(b))
|
|
|
|
def test_lu_gauss_seidel():
|
|
A = Matrix([[10, -1, 2, 0],
|
|
[-1, 11, -1, 3],
|
|
[2, -1, 10, -1],
|
|
[0, 3, -1, 8]])
|
|
b = Vector([6, 25, -11, 15])
|
|
x_lu = LUDecomposition(A).solve(b)
|
|
x_gs = GaussSeidel(A, b, tol=1e-12).solve()
|
|
for i in range(4):
|
|
assert approx_equal(x_lu[i], x_gs[i])
|
|
|
|
def test_cholesky():
|
|
A = Matrix([[4, 1, 1],
|
|
[1, 3, 0],
|
|
[1, 0, 2]])
|
|
b = Vector([1, 2, 3])
|
|
x = Cholesky(A).solve(b)
|
|
Ax = [sum(A.data[i][j]*x[j] for j in range(3)) for i in range(3)]
|
|
for i in range(3):
|
|
assert approx_equal(Ax[i], b[i])
|
|
|
|
def test_roots():
|
|
f = lambda x: x**3 - 2
|
|
df = lambda x: 3*x**2
|
|
r = NewtonRoot(f, df, 1.0).solve()
|
|
assert approx_equal(r, 2**(1/3))
|
|
b = Bisection(f, 0, 2).solve()
|
|
assert approx_equal(b, 2**(1/3))
|
|
|
|
def test_interp():
|
|
x = [0,1,2]
|
|
y = [1,3,2]
|
|
n = NewtonInterpolation(x,y)
|
|
l = LagrangeInterpolation(x,y)
|
|
for t in [0,0.5,1.7,2.0]:
|
|
assert approx_equal(n.evaluate(t), l.evaluate(t), tol=1e-9)
|