(exp(x) - exp(-x))/(2*x) 的泰勒级数
Taylor series for (exp(x) - exp(-x))/(2*x)
我被要求编写一个函数来计算 (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,这会导致无限循环。
问题出在您使用的表达方式上。对于小数 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')
给出
我被要求编写一个函数来计算 (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,这会导致无限循环。
问题出在您使用的表达方式上。对于小数 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')
给出