脚本中的近似欧拉数
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 位。鉴于上面的 b
是 e
的非常准确的表示,我们可以与它进行比较以确定我们何时达到了准确的解决方案
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
所以这是我改的问题:
首先,我会重写你的函数来寻找更简单的阶乘
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 位。鉴于上面的 b
是 e
的非常准确的表示,我们可以与它进行比较以确定我们何时达到了准确的解决方案
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