脚本中的近似欧拉数

时间:2015-10-10 19:53:16

标签: matlab approximation eulers-number

所以这是我改变的问题:

1 个答案:

答案 0 :(得分:2)

首先,我会重写你的函数,找到更简单的阶乘

function n = factorial(n)
    n = prod(1:n);
end

你的问题中的循环是不必要的,因为你从不使用循环变量i。我不会对我的解决方案使用此函数,因为它可能非常慢,因为您必须在每次循环迭代时计算冗余信息。

如果您仍想使用for循环,则需要将其重写为

function f = factorial(n)
    f = 1; % 0 factorial
    for i = 1:n
        f = f * i;
    end
end

您可以使用自然对数和log s的规则来确定可以与之比较的e的非常准确的值。您可以检查e的值由x^(1 / log(x))给出,其中x可以是1以外的任何正实数,例如2。我们可以在

中看到这一点

Rules of logs

现在我们如何检查我们是否计算了e到10位小数精度的值。鉴于上面的be的非常准确的表示,我们可以与之进行比较,以确定我们何时达到了准确的解决方案

x = 2; % Any positive number other than 1
c = x^(1 / log(x));
...
if (abs(e - c) < 1e-10)
    break;
end

在我的解决方案e中,我用无限和计算了近似值。 注意:当e - c为负数时,采用绝对值来防止误报。

现在,一种计算无限和的有效方法。我们可以利用如何计算阶乘以在每次迭代期间不必计算它,从而大大提高效率。首先,在我的情况下,我们需要一个和变量e来跟踪我们的近似解。然后我们需要另一个变量来跟踪我的情况中的阶乘f。由于0是一个有趣的案例,我们将从它开始

e = 0;
f = 1; % 0 factorial

e = e + 1 / f;

现在我们拥有无限和的第一个元素。接下来,我们可以使用无限和来计算更准确的e近似值。可以在每次迭代期间更新阶乘,f = f * n;导致

for n = 1:inf
    f = f * n; % Compute new factorial
    e = e + 1 / f; % Infinite sum
    ...
end

现在把它完全放在

x = 2; % Any positive number other than 1
c = x^(1 / log(x));

e = 0;
f = 1; % 0 factorial

e = e + 1 / f;

for n = 1:inf
    f = f * n; % Compute new factorial
    e = e + 1 / f; % Infinite sum
    if (abs(e - c) < 1e-10)
        break;
    end
end