def memoryFunctionZ(self): poles = self.poles() cpoles = [p.conjugate() for p in poles] coeff0 = conjugate(self.coeff[0]) beta = self.order * [0] sum = 0. for i in range(self.order): pole = poles[i] prod = N.Complex(self.variance, 0.) for j in range(i): prod *= (pole - poles[j]) for j in range(i + 1, self.order): prod *= (pole - poles[j]) for j in range(self.order): prod *= (pole - N.Complex(1., 0.) / cpoles[j]) beta[i] = -((pole**(self.order - 1)) * self.sigsq / coeff0) / prod sum += beta[i] for i in range(self.order): beta[i] /= sum sum = 0. for i in range(self.order): sum += RationalFunction([beta[i]], [-poles[i], 1.]) mz = (1. / sum + Polynomial([1., -1.])) / self.delta_t**2 if not isComplex(self.coeff[0]): mz.numerator.coeff = [c.real for c in mz.numerator.coeff] mz.denominator.coeff = [c.real for c in mz.denominator.coeff] return mz
def __init__(self, model, precision=0): self.precision = precision self.order = model.order self.delta_t = model.delta_t if model.coeff.typecode() == N.Complex64: self.coeff = [ N.Complex(mpf(x.real, precision), mpf(x.imag, precision)) for x in model.coeff ] else: self.coeff = [mpf(x, precision) for x in model.coeff] self.sigsq = mpf(model.sigsq, precision) self.sigma = mpf(model.sigma, precision) self.variance = mpf(model.variance, precision) self._poles = None