gftool.hermpade.pader
- gftool.hermpade.pader(an, num_deg: int, den_deg: int, rcond: float = 1e-14) RatPol [source]
Robust version of Padé approximant to polynomial an.
Implements more or less [gonnet2013]. The degrees num_deg and den_deg are automatically reduced to obtain a robust solution.
- Parameters:
- an(L,) array_like
Taylor series coefficients representing polynomial of order
L-1
.- num_deg, den_degint
The order of the return approximating numerator/denominator polynomial. The sum must be at most
L
:L >= n + m + 1
. Depending on rcond the degrees can be reduced.- rcondfloat, optional
Cut-off ratio for small singular values. For the purposes of rank determination, singular values are treated as zero if they are smaller than rcond times the largest singular value (default: 1e-14). The default is appropriate for round error due to machine precision.
- Returns:
- RatPol
The rational polynomial with numerator
RatPol.numer
, and denominatorRatPol.denom
.
See also
References
[gonnet2013]1.Gonnet, P., Güttel, S. & Trefethen, L. N. Robust Padé Approximation via SVD. SIAM Rev. 55, 101–117 (2013). https://doi.org/10.1137/110853236
Examples
The robust version can avoid over fitting for high-order Padé approximants. Choosing an appropriate rcond, is however a delicate task in practice. We consider an example with random noise on the Taylor coefficients an:
>>> from scipy.special import binom >>> deg = 50 >>> an = binom(1/3, np.arange(2*deg + 1)) # Taylor of (1+x)**(1/3) >>> an += np.random.default_rng().normal(scale=1e-9, size=2*deg + 1) >>> x = np.linspace(-1, 3, num=500) >>> fx = np.emath.power(1+x, 1/3)
>>> pade = gt.hermpade.pade(an, num_deg=deg, den_deg=deg) >>> pader = gt.hermpade.pader(an, num_deg=deg, den_deg=deg, rcond=1e-8)
>>> import matplotlib.pyplot as plt >>> __ = plt.plot(x, abs(pade.eval(x) - fx), label='standard Padé') >>> __ = plt.plot(x, abs(pader.eval(x) - fx), label='robust Padé') >>> plt.yscale('log') >>> __ = plt.legend() >>> plt.show()