def interp(X, Y, o, v): i = SeqServices.index(X, v) if (o == 1): return SeqServices.interpLin(X[i], Y[i], X[i + 1], Y[i + 1], v) else: return SeqServices.interpQuad(X[i], Y[i], X[i + 1], Y[i + 1], X[i + 2], Y[i + 2], v)
def eval(x, z): if (not SeqServices.isInBounds(Data.Z, z)): raise Exceptions.OutOfDomain("Z value is out of domain") j = SeqServices.index(Data.Z, z) return SeqServices.interpLin(Data.Z[j], Data.S[j].eval(x), Data.Z[j + 1], Data.S[j + 1].eval(x), z)
def interp(X, Y, o, v): i = SeqServices.index(X, v) if o == 1: return SeqServices.interpLin(X[i], Y[i], X[i + 1], Y[i + 1], v) elif o == 2: return SeqServices.interpQuad(X[i - 1], Y[i - 1], X[i], Y[i], X[i + 1], Y[i + 1], v)
def eval(x, z): if (not (isInBounds(Data.Z, z))): raise OutOfDomain("The input variable is out of the domain") j = SeqServices.index(Data.Z, z) x1, y1, x2, y2 = Data.Z[j], (Data.S[j]).eval(x), Data.Z[j + 1], ( Data.S[j + 1]).eval(x) return SeqServices.interpLin(x1, y1, x2, y2, x)
def __init__(self, X, Y, i): print(X) if (len(X) != len(Y)): raise SeqSizeMismatch("length of X and Y not equal") if not SeqServices.isAscending(X): raise IndepVarNotAscending("X values not ascending") if i < 1 or i > MAX_ORDER: raise InvalidInterpOrder("Order not 1 or 2") self.__o = i self.__minx = X[0] self.__maxx = X[len(X) - 1] self.__f = lambda v: interp(X, Y, i, v)
def __init__(self, X, Y, i): if SeqServices.isAscending(X) == False: raise Exceptions.IndepVarNotAscending( "Independant variable x is not ascending") elif len(X) != len(Y): raise Exceptions.SizeSeqMismatch("Sequence sizes do not match") elif i not in range(1, CurveT.MAX_ORDER + 1): raise Exceptions.InvalidInterpOrder( "Interpolation order is illegal") self.minx = X[0] self.maxx = X[len(X) - 1] self.o = i self.f = lambda v: CurveT.interp( X, Y, self.o, v) #creates an anonymous function and returns it
def test_index(self): assert SeqServices.index(self.X, 1) == 0 assert SeqServices.index(self.X, 4.9) == 3
def test_interpQuad(self): assert SeqServices.interpQuad(3.5, 7.2, 6, 8.3, 9.9, 60, 2) == pytest.approx(6132.308, rel=1e-3)
def test_interpLin(self): assert SeqServices.interpLin(3.5, 7.2, 6, 8.3, 2) == pytest.approx(6.54, rel=1e-3)
def test_inBounds(self): assert SeqServices.isInBounds(self.X, 3.3) == True
def test_isAscending(self): assert SeqServices.isAscending(self.X) == True assert not (SeqServices.isAscending(self.Y) == True) assert SeqServices.isAscending(self.Z) == True