0

所以这是我改变的一个问题:

4

1 回答 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

您可以使用自然对数和logs 的规则来确定e可以与之比较的非常准确的值。您可以检查的值ex^(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 回答