Diamonq
Diamonq

Reputation: 3

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.

Upvotes: 0

Views: 333

Answers (1)

ViG
ViG

Reputation: 1868

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

Upvotes: 1

Related Questions