Exponencial function
In this tutoial we show a few Padé approximants of \(e^{x}\,\) using infinite and finite precision.
[119]:
import sympy as sp
from padepy import baker_algorithm as ba
from padepy import direct_algorithm as da
[123]:
var = sp.Symbol("x")
func = sp.exp(var)
p = 3
q = 3
func
[123]:
$\displaystyle e^{x}$
[124]:
pade, path = ba.pade(p, q, var, func, 0, False)
pade
Pade [3,3](x) stored at matrix index 6.
[124]:
$\displaystyle \frac{\frac{x^{3}}{120} + \frac{x^{2}}{10} + \frac{x}{2} + 1}{- \frac{x^{3}}{120} + \frac{x^{2}}{10} - \frac{x}{2} + 1}$
[125]:
path
[125]:
$\displaystyle \left[\begin{matrix}\frac{x^{6}}{720} + \frac{x^{5}}{120} + \frac{x^{4}}{24} + \frac{x^{3}}{6} + \frac{x^{2}}{2} + x + 1\\\frac{x^{5}}{120} + \frac{x^{4}}{24} + \frac{x^{3}}{6} + \frac{x^{2}}{2} + x + 1\\\frac{\frac{x^{5}}{720} + \frac{x^{4}}{72} + \frac{x^{3}}{12} + \frac{x^{2}}{3} + \frac{5 x}{6} + 1}{1 - \frac{x}{6}}\\\frac{\frac{x^{4}}{120} + \frac{x^{3}}{15} + \frac{3 x^{2}}{10} + \frac{4 x}{5} + 1}{1 - \frac{x}{5}}\\\frac{\frac{x^{4}}{360} + \frac{x^{3}}{30} + \frac{x^{2}}{5} + \frac{2 x}{3} + 1}{\frac{x^{2}}{30} - \frac{x}{3} + 1}\\\frac{\frac{x^{3}}{60} + \frac{3 x^{2}}{20} + \frac{3 x}{5} + 1}{\frac{x^{2}}{20} - \frac{2 x}{5} + 1}\\\frac{\frac{x^{3}}{120} + \frac{x^{2}}{10} + \frac{x}{2} + 1}{- \frac{x^{3}}{120} + \frac{x^{2}}{10} - \frac{x}{2} + 1}\\\frac{\frac{x^{2}}{20} + \frac{2 x}{5} + 1}{- \frac{x^{3}}{60} + \frac{3 x^{2}}{20} - \frac{3 x}{5} + 1}\\\frac{\frac{x^{2}}{30} + \frac{x}{3} + 1}{\frac{x^{4}}{360} - \frac{x^{3}}{30} + \frac{x^{2}}{5} - \frac{2 x}{3} + 1}\\\frac{\frac{x}{5} + 1}{\frac{x^{4}}{120} - \frac{x^{3}}{15} + \frac{3 x^{2}}{10} - \frac{4 x}{5} + 1}\\\frac{\frac{x}{6} + 1}{- \frac{x^{5}}{720} + \frac{x^{4}}{72} - \frac{x^{3}}{12} + \frac{x^{2}}{3} - \frac{5 x}{6} + 1}\\\frac{1}{- \frac{x^{5}}{120} + \frac{x^{4}}{24} - \frac{x^{3}}{6} + \frac{x^{2}}{2} - x + 1}\\\frac{1}{\frac{x^{6}}{720} - \frac{x^{5}}{120} + \frac{x^{4}}{24} - \frac{x^{3}}{6} + \frac{x^{2}}{2} - x + 1}\end{matrix}\right]$
It is possible to input a list with coefficients.
[126]:
from padepy import maclaurin as ma
[127]:
n = p + q + 1
coeffs_list = ma.coefficients(n, var, func)
coeffs_list
[127]:
[1, 1, 1/2, 1/6, 1/24, 1/120, 1/720, 1/5040]
[128]:
pade, path = ba.pade(p, q, var, coeffs_list, 0, False)
pade
Pade [3,3](x) stored at matrix index 6.
[128]:
$\displaystyle \frac{\frac{x^{3}}{120} + \frac{x^{2}}{10} + \frac{x}{2} + 1}{- \frac{x^{3}}{120} + \frac{x^{2}}{10} - \frac{x}{2} + 1}$
If we set \(x=1\) we get an approximation of the value \(e = 2.7182818284590452353602874713526624977572470936999595749669676277...\)
[129]:
e = 2.7182818284590452353602874713526624977572470936999595749669676277
e_approx = pade.subs(var, 1.0)
e_approx
[129]:
$\displaystyle 2.71830985915493$
[130]:
error = e_approx - e
error
[130]:
$\displaystyle 2.80306958844179 \cdot 10^{-5}$
We can also replace in path variable.
[131]:
e_approx_path = path.subs(var, 1.0)
e_approx_path
[131]:
$\displaystyle \left[\begin{matrix}2.71805555555556\\2.71666666666667\\2.71833333333333\\2.71875\\2.71825396825397\\2.71794871794872\\2.71830985915493\\2.71875\\2.7182320441989\\2.71698113207547\\2.71844660194175\\2.72727272727273\\2.71698113207547\end{matrix}\right]$
It is possible to work with floating precision.
[132]:
precision = 16
pade, path = ba.pade(p, q, var, coeffs_list, precision)
pade
Pade [3,3](x) stored at matrix index 6.
[132]:
$\displaystyle \frac{0.00833333333333333 x^{3} + 0.09999999999999997 x^{2} + 0.4999999999999999 x + 1.0}{- 0.008333333333333339 x^{3} + 0.1 x^{2} - 0.5000000000000001 x + 1.0}$
[133]:
path
[133]:
$\displaystyle \left[\begin{matrix}0.001388888888888889 x^{6} + 0.008333333333333333 x^{5} + 0.04166666666666667 x^{4} + 0.1666666666666667 x^{3} + 0.5 x^{2} + 1.0 x + 1.0\\0.008333333333333333 x^{5} + 0.04166666666666667 x^{4} + 0.1666666666666667 x^{3} + 0.5 x^{2} + 1.0 x + 1.0\\\frac{0.001388888888888889 x^{5} + 0.01388888888888889 x^{4} + 0.08333333333333333 x^{3} + 0.3333333333333333 x^{2} + 0.8333333333333333 x + 1.0}{1.0 - 0.1666666666666667 x}\\\frac{0.008333333333333334 x^{4} + 0.06666666666666667 x^{3} + 0.3 x^{2} + 0.8 x + 1.0}{1.0 - 0.2 x}\\\frac{0.00277777777777778 x^{4} + 0.03333333333333335 x^{3} + 0.2 x^{2} + 0.6666666666666667 x + 1.0}{0.03333333333333332 x^{2} - 0.3333333333333333 x + 1.0}\\\frac{0.01666666666666667 x^{3} + 0.15 x^{2} + 0.6 x + 1.0}{0.05 x^{2} - 0.4 x + 1.0}\\\frac{0.00833333333333333 x^{3} + 0.09999999999999997 x^{2} + 0.4999999999999999 x + 1.0}{- 0.008333333333333339 x^{3} + 0.1 x^{2} - 0.5000000000000001 x + 1.0}\end{matrix}\right]$
[134]:
e_approx = pade.subs(var, 1.0)
e_approx
[134]:
$\displaystyle 2.71830985915493$
[135]:
e_approx_path = path.subs(var, 1.0)
e_approx_path
[135]:
$\displaystyle \left[\begin{matrix}2.718055555555556\\2.716666666666667\\2.718333333333333\\2.71875\\2.718253968253968\\2.717948717948718\\2.71830985915493\end{matrix}\right]$
We will use bokeh library to plot. Use: pip install bokeh
[136]:
from bokeh.io import push_notebook, show, output_notebook
from bokeh.plotting import figure
output_notebook()
[137]:
exp = sp.exp(var)
exp
[137]:
$\displaystyle e^{x}$
[139]:
maclaurin_pol = ma.polynomial(p, q, var, exp)
maclaurin_pol
[139]:
$\displaystyle \frac{x^{6}}{720} + \frac{x^{5}}{120} + \frac{x^{4}}{24} + \frac{x^{3}}{6} + \frac{x^{2}}{2} + x + 1$
[140]:
pade_33 = da.pade(p, q, var, coeffs_list)
pade_33
[140]:
$\displaystyle \frac{\frac{x^{3}}{120} + \frac{x^{2}}{10} + \frac{x}{2} + 1}{- \frac{x^{3}}{120} + \frac{x^{2}}{10} - \frac{x}{2} + 1}$
[142]:
import numpy as np
[149]:
x_set = np.linspace(-3,3,100)
exp_y = [float(exp.subs(var, i)) for i in x_set]
maclaurin_pol_y = [ float(maclaurin_pol.subs(var, i)) for i in x_set]
pade_33_y = [float(pade_33.subs(var, i)) for i in x_set]
[156]:
p = figure(plot_width = 600, plot_height = 500)
p.line(x_set, exp_y, color = 'black', legend_label= 'exp(x)')
p.line(x_set, maclaurin_pol_y, color = 'red', legend_label= 'maclaurin(x)')
p.line(x_set, pade_33_y, color = 'green', legend_label='[3/3](x)')
show(p)