【问题标题】:Matlab, on the quest to find a simple way to control the output of a functionMatlab,寻求一种简单的方法来控制函数的输出
【发布时间】: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


【解决方案1】:

不确定你正在计算你认为你正在计算的东西。

完全不需要 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)

【讨论】:

  • 如果您费心格式化一些代码,并将句子中的第一个字母大写 ++,您可能只会得到 +1 =)
  • @vish,非常感谢您的回答。我很感激。你是对的,cumsum 看起来很有前途,我已经读过它,但我应该考虑使用它来解决这个问题。但是,如果我将向量定义为 n=1:16 并将其用作输入,则此输入似乎对输入不敏感。在我的作业中,虽然我承认它似乎没用,但我应该为 n 输入 17 个值,我应该手动输入它们吗?我将如何绘制它?
  • @vish,我找到了一种利用您的建议的方法,而不是作为一个情节,而是作为一个完全可以解决我的问题的列表。非常感谢您的帮助!
  • @RobertP。 - 你明白了。
  • @Spaced。再次,循环是多余的,试试我的最后一点代码。看到结果。 1:17 也可以,或者 1:2:33
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多