我正在编写一个脚本,它调用一个函数get_fact来计算欧拉数到小数点10位。我的职责是:
function [ nfactorial ] = get_fact( n )
%input a non-negative integer
%output is factorial of that integer
for i=0:n
nfactorial=prod(1:n);
end
end现在我想通过n个从0到无穷远的循环并取1/get_fact(i)之和来计算欧拉数。
我如何写中断,以便停止循环在小数点第10位?我不允许在我的脚本中使用欧拉号。
到目前为止,我已经:
for i = 0:inf
prod((1/ get_fact(i)))
end但这是一个无限系列。
我在考虑用
if prod((1/ get_fact(i))) > 1E-10
break
end但我不确定这是否是解决问题的正确方法。
发布于 2015-10-10 20:41:11
首先,我将重写您的函数,以便找到阶乘,使之变得更简单。
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值,您可以与之进行比较。您可以对照的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
endhttps://stackoverflow.com/questions/33058333
复制相似问题