试图在matlab中做一系列的总和

时间:2015-10-28 13:46:25

标签: matlab

我想在MATLAB中计算一系列的总和 作业位于最后一页问题3 on this webpage 该系列的总和应该是pi,但是当我使用MATLAB来证明它不会收敛到pi

我的代码中出错了什么?

In [102]:
df[df.TIME1.isin(df2.TIME1) & df.TIME2.isin(df2.TIME2)]

Out[102]:
ID  TIME1   TIME2   VALUE_A VALUE_B
1   201502  201502     a    1c
1   201502  201502     b    1d
2   201511  201511     b    2e
2   201511  201511     b    6a

编辑:

function f = equation(n)
for i=1:n;
    f=4*sum(((-1)^i)/(2*i+1))
    if f >= pi
        break;
    else 
        continue;
    end
end
end

它不能用于绘制(f),我做错了什么?

3 个答案:

答案 0 :(得分:2)

有些事情你做错了。首先,您没有跟踪运行总和,您只是在循环内定义每个术语。你应该有像

这样的东西
function total = equation(n)
  total = 0;
  for i = 1:n
    total = total + (-1)^i / (2 * i + 1);
    if total > pi
      break;
    end
  end
  total = 4 * total;
end

其次,你不希望那里有break语句。如果你绘制这个系列的部分和,你可以看到它在pi的任一侧振荡 -

enter image description here

如果你在超过pi后立即休息,那么你会过早地休息(事实上在第一个任期之后!)

所以你的代码应该是

function total = equation(n)
  total = 0;
  for i = 1:n
    total = total + (-1)^i / (2*i+1);
  end
  total = 4 * total;
end

此外,如果你从0开始,而不是一个 -

,这个系列只会收敛到pi
function total = equation(n)
  total = 0;
  for i = 0:n
    total = total + (-1)^i / (2*i+1);
  end
  total = 4 * total;
end

最后,您可以通过矢量化代码来显着简化 -

function total = equation(n)
  indices = 0:n;
  total = 4 * sum((-1).^indices ./ (2 * indices + 1));
end

答案 1 :(得分:1)

您的代码没有意义:为什么您sum单个元素,然后在下一个循环中丢弃结果?您的目的将更好地服务于:

function f = no_kitty_is_my_pi_you_cant_have_it(n)
        %'Sorry for the South Park reference/pun'

        k = 0:n;
        f = 4 * sum((-1).^k ./ (2*k+1));

end

并且,作为关于MATLAB编程实践的旁注:选择ij作为变量的名称并不是一个好主意,因为这两个是内置函数,可以为您提供虚构单元( -1的平方根。

答案 2 :(得分:1)

添加其余答案。此代码将计算从n=1n=100的所有pi近似值。

n=100;
f=[];
for jj=1:n
    ii=0:jj;
    f=[f 4*sum( ((-1).^ii)./(2.*ii+1)  )];
end;
hold on
plot(f)
plot(1:size(f,2),ones(size(f))*pi)

enter image description here