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