【问题标题】:How to compute sum of series until the sum stops changing in Matlab如何计算系列的总和,直到总和在Matlab中停止变化
【发布时间】:2016-03-28 06:55:30
【问题描述】:

我想在 Matlab 中计算以下系列的总和:

我正在使用这个 MATLAB 函数:

>> syms i;
>> S = symsum((0.5^i*sin(i))/i^2, i, 0, Inf)

问题是我想在总和停止变化时停止添加项。例如,何时停止的条件可能是步骤i 步骤的总和与步骤i+1 的总和之间的差异不大于某个用户定义的容差10^-8。如何在上述总和计算中包含此条件?

【问题讨论】:

  • 注意这个函数f(x) = 0.5^x/x^2*sin(x)不是单调的。例如f(14)>f(13)f(20)>f(19)。一种解决方案是忽略正弦项并考虑使用g(x) = 0.5^x/x^2 来检查公差。

标签: matlab sum series


【解决方案1】:

我个人不会使用符号数学工具箱,而是更喜欢使用简单的循环。具体来说,我会以数字方式和增量方式将项添加到系列中,直到满足您所说的条件。顺便说一句,你的总和从i=0 开始,但是当i=0 时,总和是未定义的(你有一个0/0 未定义的除法结果)。我假设您打算从 i=1 开始。

想到这样的事情:

s = 0;
s_before = realmax;
tol = 1e-8;
ii = 0;

while (abs(s_before - s) >= tol)
    ii = ii + 1;
    s_before = s;
    s = s + ((0.5^ii)*sin(ii))/(ii^2);        
end 

前四行代码用于设置。 s 包含最终总和,s_before 包含上一次迭代的总和。 tol 定义了一个公差(您的示例是 1e-8),它测量连续迭代之间的差异。 ii 是一个计数器变量,它是求和公式中的 i 变量。请注意,我将其初始化为 0,但在第一次迭代时,它将设置为 1。我还选择使用 ii 而不是 i,因为 i 是为复数变量保留的。

接下来,我们使用while 循环,只要连续迭代之间的差异大于容差,我们就会继续循环。我们保存上一次迭代的总和,然后计算系列中的下一项并将其累加到总和中。我们还确保增加计数器变量。当连续迭代之间的差异小于一定数量时,这将退出。

运行此代码后,我得到了总迭代次数和总和:

>> format long g;
>> s

s =

         0.475415855580831

>> ii

ii =

    18

在开头使用format long g; 可以让我们显示更多位数的精度。默认情况下,MATLAB 最多只显示 4 位小数。结果告诉我们,这需要您的总和中包含 18 个术语才能“停止变化”。

【讨论】:

  • 虽然这回答了确切的 OP 问题,但它遗漏了一些重要规则。首先,当然,您应该证明级数收敛:-)。接下来,仅仅因为下一项或下一项差异值低于某个阈值并不意味着您的答案已经达到任何特定的准确性。慢慢收敛的系列是菜鸟程序员的祸根!关于如何估计(上限/下限)和的“尾部”之和的定理。
  • @CarlWitthoft 我对 OP 表示怀疑,该系列收敛并且它共享收敛系列具有的所有属性。当我有时间时,我会更新我的答案,但鉴于 OP 如何接受我的答案,这似乎已经给了他们足够的进步。
  • 嗯,他们正在移动,但不一定向前,即朝着正确的答案:-)
  • @CarlWitthoft 哈哈!够公平的!
猜你喜欢
  • 2017-04-18
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多