所以这是我改变的一个问题:
问问题
1553 次
1 回答
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))
wherex
可以是除 之外的任何正实数给出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
于 2015-10-10T20:41:11.097 回答