泰勒级数(exp(x) - exp(-x))/(2 * x)

时间:2018-04-04 10:59:26

标签: matlab infinite-loop taylor-series

我被要求编写一个函数来计算(exp(x) - exp(-x))/(2 * x)的泰勒级数,直到绝对误差小于机器的eps。

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;

我的问题是,abserror永远不会低于机器的eps,导致无限循环。

1 个答案:

答案 0 :(得分:1)

问题在于您正在使用的表达方式。对于小数字exp(x)exp(-x)大致相等,所以exp(x)-exp(-x)接近零并且肯定低于1.因为从1开始并且只添加正数,您将永远不会到达功能价值。

将表达式重写为

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

会起作用,因为它对这些小值更稳定。

您还可以通过绘制两个函数来看到这一点:

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')

给出

enter image description here