我已经在这里问了一个类似的问题,我会尝试这个更精细的考虑,最让我困惑的是Matlab仍然是如何处理/控制输出,如绘图/列表。
我有以下功能
function e = calcEulerSum2(n)
for i=1:n % step size still one, although left blank
e = 1;
e = e + sum(1./factorial(1:n)); % computes a vector of length n and takes
end % the factorial of its entries, then piecewise division
end
使用泰勒求和方法近似e。我现在被要求使用
计算绝对误差abserror(n):=abs(calcEulerSum2(n)-exp(1))
表示n= 10^0,10^1,...,10^16
的值。
我的想法是让上面的函数对矢量输入敏感(如果你这样称呼它,我也在这里读过矢量化)。我认为这是我能做的最好的事情,因为我显然想要为n
的几个值评估上述函数,然后可以将结果绘制在图表中以查看结果。
但是,我认为我对MATLAB的理解目前还不太成熟,无法找到解决该问题的简单方法。
附加:在本网站的帮助下,我已经设法解决了类似的问题,使用e的递归定义来获取每次成功迭代的矢量输出:
function e = calcEulerSum3(n)
for i = n % here the idea is to let n be a continuous vector
e(1)=1; % base case
e(i+1)=e(i)+1/factorial(i); % recursive definition to approx e
end
此函数现在理解向量输入,但仅当向量是我在整数行上称为连续的向量时,例如n'=[ 1 2 3 4 5 ]
等等,以通过向量工作进行递归迭代。但是这一次,我上面的矢量n
会破坏这个概念。
问题(S):
abserror(n)
?,因为我觉得我通过尝试向量化我的功能而感到非常高兴更新:正如@vish所建议的那样,以下功能为我的目的做得更好:
function e = calcEulerSum2(n) %Updated
for i=1:n % step size still one, although left blank
e = 1;
e = e + cumsum(1./factorial(1:n)); % computes a vector of length n and takes
end % the factorial of its entries, then piecewise division
end
n=3
此程序的输出将是
calcEulerSum2(3)
ans =
2.0000 2.5000 2.6667
这很棒,而且确实是我要找的,但是让我说我想现在为n的几个值绘制绝对误差,为了参数我会选择较小的值(因为我明白10 ^ 16 !输入真的很直率),但仍然很多。因此,如果我决定打印出以下n
值的绝对误差abserror(n)
n = [1 4 9 11 17 18 19 22 27 29 31 33 ]
我该怎么做?
答案 0 :(得分:2)
不确定您是在计算您认为自己在计算的内容。
完全不需要for循环,因为你在每次迭代时都会覆盖e,而你只返回最后一次。
factorial(1:3) == [1,2,6]
然后你总结倒数。
循环析因(1:1)的第一次迭代无处可去。
尝试
cumsum(1./factorial(1:7))
我认为这就是你想要的
编辑:,阶乘(10 ^ 5)太大而无意义,我认为从1到n = 16会给你足够好的结果。 (不是10 ^ 16)
第二次编辑
运行此
N=0:16;
res = exp(1) - cumsum(1./factorial(N))
看看会发生什么
您也可以在对数刻度上绘制它。
semilogy(res)