sum of series. Vectorised (no loop)

4 views (last 30 days)
Mohammad Ali
Mohammad Ali on 27 Apr 2021
Edited: DGM on 28 Apr 2021
How can I sum n terms of
1-1/2+1/3-1/4......

Accepted Answer

Khalid Mahmood
Khalid Mahmood on 27 Apr 2021
Edited: Khalid Mahmood on 27 Apr 2021
% 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 Comments
Mohammad Ali
Mohammad Ali on 28 Apr 2021
Khalid's answer is perfect
DGM
DGM on 28 Apr 2021
Edited: DGM on 28 Apr 2021
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.

Sign in to comment.

More Answers (2)

Mohammad Ali
Mohammad Ali on 27 Apr 2021
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 Comment
DGM
DGM on 27 Apr 2021
This only gives the correct answer for odd inputs.

Sign in to comment.


DGM
DGM on 27 Apr 2021
Edited: DGM on 27 Apr 2021
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

Community Treasure Hunt

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

Start Hunting!