sum of series. Vectorised (no loop)

1 回表示 (過去 30 日間)
Mohammad Ali
Mohammad Ali 2021 年 4 月 27 日
編集済み: DGM 2021 年 4 月 28 日
How can I sum n terms of
1-1/2+1/3-1/4......

採用された回答

Khalid Mahmood
Khalid Mahmood 2021 年 4 月 27 日
編集済み: Khalid Mahmood 2021 年 4 月 27 日
% To reduce 2 more lines
function s=vsum(n)
if nargin<1
s=1; return
end
if mod(n,2)==0, n=n-1;end
s=1+sum(1./[3:2:n] -1./[2:2:n])
  3 件のコメント
Mohammad Ali
Mohammad Ali 2021 年 4 月 28 日
Khalid's answer is perfect
DGM
DGM 2021 年 4 月 28 日
編集済み: DGM 2021 年 4 月 28 日
It's perfect if you want the wrong answer 50% of the time.
This is demonstrable. Just test it.
function s=vsum(n)
if nargin<1
s=1; return
end
if mod(n,2)==0, n=n-1;end
s=1+sum(1./[3:2:n] -1./[2:2:n]);
end
Test with odd argument:
s1 = vsum(5)
s2 = 1 - 1/2 + 1/3 - 1/4 + 1/5
results match
s1 =
0.7833
s2 =
0.7833
Test with even argument:
s1 = vsum(4)
s2 = 1 - 1/2 + 1/3 - 1/4
results don't match
s1 =
0.8333
s2 =
0.5833
This whole thing looks like an attempt to make the vector lengths match when they shouldn't.
s2 = sum(1./(1:2:nt))-sum(1./(2:2:nt))
is simpler and actually correct.

サインインしてコメントする。

その他の回答 (2 件)

Mohammad Ali
Mohammad Ali 2021 年 4 月 27 日
I hope you may want this.
function s=vsum(n)
if nargin<1
s=1; return
end
if mod(n,2)==0, n=n-1;end
nod=[3:2:n]
nev=[2:2:n]
s=1+sum(1./nod-1./nev)
  1 件のコメント
DGM
DGM 2021 年 4 月 27 日
This only gives the correct answer for odd inputs.

サインインしてコメントする。


DGM
DGM 2021 年 4 月 27 日
編集済み: DGM 2021 年 4 月 27 日
You can calculate the sum of a finite alternating harmonic series easy enough:
N = 1000;
n = 1:N;
s = sum((2*mod(n,2)-1)./n)
gives
s =
0.6926

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by