我想在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),我做错了什么?
答案 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的任一侧振荡 -
如果你在超过pi后立即休息,那么你会过早地休息(事实上在第一个任期之后!)
所以你的代码应该是
function total = equation(n)
total = 0;
for i = 1:n
total = total + (-1)^i / (2*i+1);
end
total = 4 * total;
end
此外,如果你从0开始,而不是一个 -
,这个系列只会收敛到pifunction 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编程实践的旁注:选择i
和j
作为变量的名称并不是一个好主意,因为这两个是内置函数,可以为您提供虚构单元( -1的平方根。
答案 2 :(得分:1)