【发布时间】:2014-02-20 19:25:32
【问题描述】:
我已经在这里问过一个类似的问题,考虑到 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 会破坏这个概念。
问题:
- 是否有简单的方法来处理上述输出
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 ]
我该怎么做?
【问题讨论】:
-
你真的要在这里取
1e16的阶乘吗? -
@RobertP,好电话,这是我为数值方法课程分配的作业,我从论文中复制了数字。如果我在 matlab 中手动计算上述函数(递归定义的函数),我可以在 5 步之后看到这个数字似乎接近我们所说的 e。
标签: matlab