我被要求编写一个函数来计算(exp(x) - exp(-x))/(2*x)的Taylor级数,直到绝对误差小于机器的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;我的问题是,反差永远不会低于机器的eps,这会导致无限循环。
发布于 2018-04-04 13:15:05
问题是你用的是表达式。对于小数,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')给出

https://stackoverflow.com/questions/49649281
复制相似问题