脚本中的近似欧拉数

Approximate Euler's Number in script

所以这是我改的问题:

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

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 的规则来确定一个非常准确的 e 值,您可以与之进行比较。您可以检查的 e 的值由 x^(1 / log(x)) 给出,其中 x 可以是除 1 之外的任何正实数,例如 2。我们可以在

中看到这一点

现在我们如何检查我们计算的 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