def approximate_taylor_polynomial(f,x,degree,scale,order=None):
if order is None:<EOL><INDENT>order = degree<EOL><DEDENT>n = order+<NUM_LIT:1><EOL>xs = scale*np.cos(np.linspace(<NUM_LIT:0>,np.pi,n,endpoint=n % <NUM_LIT:1>)) + x<EOL>P = KroghInterpolator(xs, f(xs))<EOL>d = P.derivatives(x,der=degree+<NUM_LIT:1>)<EOL>return np.poly1d((d/factorial(np.arange(degree+<NUM_LIT:1>)))[::-<NUM_LIT:1>])<EOL>
Estimate the Taylor polynomial of f at x by polynomial fitting.

Parameters
----------
f : callable
    The function whose Taylor polynomial is sought. Should accept
    a vector of `x` values.
x : scalar
    The point at which the polynomial is to be evaluated.
degree : int
    The degree of the Taylor polynomial
scale : scalar
    The width of the interval to use to evaluate the Taylor polynomial.
    Function values spread over a range this wide are used to fit the
    polynomial. Must be chosen carefully.
order : int or None, optional
    The order of the polynomial to be used in the fitting; `f` will be
    evaluated ``order+1`` times. If None, use `degree`.

Returns
-------
p : poly1d instance
    The Taylor polynomial (translated to the origin, so that
    for example p(0)=f(x)).

Notes
-----
The appropriate choice of "scale" is a trade-off; too large and the
function differs from its Taylor polynomial too much to get a good
answer, too small and round-off errors overwhelm the higher-order terms.
The algorithm used becomes numerically unstable around order 30 even
under ideal circumstances.

Choosing order somewhat larger than degree may improve the higher-order
terms.