Files
cantera/interfaces/python/Cantera/interp.py
Ray Speth 6cb4bd93ce Cleaned up whitespace in all Python files using reindent.py
4 spaces per indentation level, no tabs, no trailing whitespace,
and a single newline at end of each file.
2012-02-27 18:13:05 +00:00

65 lines
1.7 KiB
Python
Executable File

def interp(z0, z, f):
"""
Linear interpolation.
Sequences z and f must be of the same length,
and the entries in z must be monotonically increasing.
Example:
>>> z = [0.0, 0.2, 0.5, 1.2, 2.1]
>>> f = [3.0, 2.0, 1.0, 0.0, -1.0]
>>>print interp(-2, z, f), interp(0.5, z, f), interp(6, z, f)
3.0 7.0 -9.0
"""
n = len(z)
# if z0 is outside the range of z, then return the endpoint value,
# instead of extrapolating.
if z0 <= z[0]:
return f[0]
elif z0 > z[-1]:
return f[-1]
for i in range(1,n):
if z0 <= z[i]:
return f[i-1] + (f[i] - f[i-1])*(z0 - z[i-1])/(z[i] - z[i-1])
# if this statement is reached, then there is an error.
raise 'interpolation error!'
def quadInterp(z0, z, f):
n = len(z)
# if z0 is outside the range of z, then return the endpoint value,
# instead of extrapolating.
if z0 <= z[0]:
return f[0]
elif z0 > z[-1]:
return f[-1]
for i in range(1,n):
if z0 <= z[i]:
j = max(2,i)
dx21 = z[j-1] - z[j-2]
dx32 = z[j] - z[j-1]
dx31 = dx21 + dx32
dy32 = f[j] - f[j-1]
dy21 = f[j-1] - f[j-2]
a = (dx21*dy32 - dy21*dx32)/(dx21*dx31*dx32)
return a*(z0 - z[j-2])*(z0 - z[j-1]) + (
(dy21/dx21)*(z0 - z[j-1]) + f[j-1])
# if this statement is reached, then there is an error.
raise 'interpolation error!'
## if __name__ == '__main__':
## z = [0.0, 0.2, 0.5, 1.2, 2.1]
## f = [3.0, 5.0, 11.0, 0.0, -9.0]
## print interp(-2, z, f), interp(0.3, z, f), interp(6, z, f)
## print quadInterp(-2, z, f), quadInterp(0.3, z, f), quadInterp(6, z, f)