Search code examples
matlabinfinite-looptaylor-series

Taylor series for (exp(x) - exp(-x))/(2*x)


I've been asked to write a function that calculates the Taylor series for (exp(x) - exp(-x))/(2*x) until the absolute error is smaller than the eps of the machine.

function k = tayser(xo)
f = @(x) (exp(x) - exp(-x))/(2*x);
abserror = 1;
sum = 1;
n=2;
while abserror > eps
    sum = sum + (xo^n)/(factorial(n+1));
    n=n+2;
    abserror = abs(sum-f(xo));
    disp(abserror);
end 
k=sum;

My issue is that the abserror never goes below the eps of the machine which results to an infinite loop.


Solution

  • The problem is expression you're using. For small numbers exp(x) and exp(-x) are approximately equal, so exp(x)-exp(-x) is close to zero and definitely below 1. Since you start with 1 and only add positive numbers, you'll never reach the function value.

    Rewriting the expression as

    f = @(x) sinh(x)/x;
    

    will work, because it's more stable for these small values.

    You can also see this by plotting both functions:

    x = -1e-14:1e-18:1e-14;
    plot(x,(exp(x) - exp(-x))./(2*x),x,sinh(x)./x)
    legend('(exp(x) - exp(-x))/(2*x)','sinh(x)/x')
    

    gives

    enter image description here