【问题标题】:Taylor series for (exp(x) - exp(-x))/(2*x)(exp(x) - exp(-x))/(2*x) 的泰勒级数
【发布时间】:2018-09-13 21:55:41
【问题描述】:

我被要求编写一个函数来计算 (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,从而导致无限循环。

【问题讨论】:

  • 我认为条件应该是“直到绝对误差与机器的 eps 相当”。如果您设法在 eps 以下出现错误,那将是偶然的。 eps 的阈值太低。您可能应该使用类似 10*eps 作为绝对误差阈值
  • 你用什么xo?我试了几次,都没有死循环。
  • 非常感谢您的即时回复@LuisMendo。我使用机器的 eps 和 0 尝试了一些合乎逻辑的情况,最终我被问到“直到绝对错误为 0”(因为 0
  • @ViG 感谢您的即时回复。我正在尝试 ????o=10^−13, xo=10^−14,xo=10^−15,xo=10^−16 和 xo=0。

标签: matlab infinite-loop taylor-series


【解决方案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')

给了

【讨论】:

  • 哇!非常感谢!这种方式完全有效!你真棒! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2021-12-26
  • 2016-04-05
  • 2018-06-23
相关资源
最近更新 更多