77 lines
1.6 KiB
Python
77 lines
1.6 KiB
Python
import os
|
|
|
|
import inspect
|
|
import numpy as np
|
|
|
|
import logging
|
|
log = logging.getLogger("interp")
|
|
|
|
def rms(errors):
|
|
"""
|
|
root mean square calculation
|
|
"""
|
|
r = 0.0
|
|
for i in errors:
|
|
r += np.power(i, 2)
|
|
r = np.sqrt(r / len(errors))
|
|
return r
|
|
|
|
def baker_exact_2D(X):
|
|
"""
|
|
the exact function (2D) used from baker's article (for testing)
|
|
"""
|
|
x ,y = X
|
|
answer = np.power((np.sin(x * np.pi) * np.cos(y * np.pi)), 2)
|
|
log.debug(answer)
|
|
return answer
|
|
|
|
def friendly_exact_2D(X):
|
|
"""
|
|
A friendlier 2D func
|
|
"""
|
|
x ,y = X
|
|
answer = 1.0 + x*x + y*y
|
|
log.debug(answer)
|
|
return answer
|
|
|
|
def baker_exact_3D(X):
|
|
"""
|
|
the exact function (3D) used from baker's article (for testing)
|
|
"""
|
|
x = X[0]
|
|
y = X[1]
|
|
z = X[2]
|
|
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)
|
|
log.debug(answer)
|
|
return answer
|
|
|
|
def friendly_exact_3D(X):
|
|
x,y,z = X
|
|
return 1 + x*x + y*y + z*z
|
|
|
|
def improved_answer(answer, exact):
|
|
if not answer['error']:
|
|
# was probably just a linear interpolation
|
|
return False
|
|
|
|
log.debug('qlin: %s' % answer['qlin'])
|
|
log.debug('error: %s' % answer['error'])
|
|
log.debug('final: %s' % answer['final'])
|
|
log.debug('exact: %s' % exact)
|
|
|
|
if np.abs(answer['final'] - exact) <= np.abs(answer['qlin'] - exact):
|
|
log.debug(":) improved result")
|
|
return True
|
|
else:
|
|
log.debug(":( damaged result")
|
|
return False
|
|
|
|
def improved(qlin, err, final, exact):
|
|
if np.abs(final - exact) <= np.abs(qlin - exact):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def percent_improvement(answer, exact):
|
|
return np.abs(answer['error']) / exact
|