Private function to calculate the upper bound on the NTU1 value in the
    P-NTU method. This value is calculated via a pade approximation obtained
    on the result of a global minimizer which calculated the maximum P1
    at a given R1 from ~1E-7 to approximately 100. This should suffice for 
    engineering applications. This value is needed to bound the solver.

def _NTU_max_for_P_solver(data, R1):
    '''Private function to calculate the upper bound on the NTU1 value in the
    P-NTU method. This value is calculated via a pade approximation obtained
    on the result of a global minimizer which calculated the maximum P1
    at a given R1 from ~1E-7 to approximately 100. This should suffice for 
    engineering applications. This value is needed to bound the solver.
    '''
    offset_max = data['offset'][-1]
    for offset, p, q in zip(data['offset'], data['p'], data['q']):
        if R1 < offset or offset == offset_max:
            x = R1 - offset
            return _horner(p, x)/_horner(q, x)