smbinterp/interp/tools.py

86 lines
1.7 KiB
Python

import numpy as np
def rms(errors):
"""
root mean square calculation
"""
# slow pure python way for reference:
# r = 0.0
# for i in errors:
# r += np.power(i, 2)
# r = np.sqrt(r / len(errors))
# return r
return np.sqrt((errors ** 2).mean())
def baker_exact_2D(X):
"""
the exact function (2D) used from baker's article (for testing,
slightly modified)
"""
x, y = X
answer = np.power((np.sin(x * np.pi) * np.cos(y * np.pi)), 2)
return answer
def friendly_exact_2D(X):
"""
A friendlier 2D func
"""
x, y = X
answer = 1.0 + x * x + y * y
return answer
def baker_exact_3D(X):
"""
the exact function (3D) used from baker's article (for testing)
"""
x, y, z = X
answer = np.power((np.sin(x * np.pi / 2.0) * np.sin(y * np.pi / 2.0) *
np.sin(z * np.pi / 2.0)), 2)
return answer
def exact_me(points, f):
a = np.array([f(i) for i in points])
return a
def friendly_exact_3D(X):
x, y, z = X
return 1 + x * x + y * y + z * z
def scipy_exact_2D(X):
x, y = X
return x * (1 - x) * np.cos(4 * np.pi * x) *\
np.sin(4 * np.pi * y ** 2) ** 2
def improved_answer(answer, exact):
if not answer.error:
# was probably just a linear interpolation
return False
if np.abs(answer.final - exact) <= np.abs(answer.qlin - exact):
return True
else:
return False
def identical_points(a, b):
return all(set(j[i] for j in a) \
== set(j[i] for j in b) for i in xrange(len(a[0])))
def improved(qlin, err, final, exact):
if np.abs(final - exact) <= np.abs(qlin - exact):
return True
else:
return False