sum of series. Vectorised (no loop)

 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

This is the same as a prior post. It only gives the correct answer for odd inputs.
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)

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

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

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Asked:

on 27 Apr 2021

Edited:

DGM
on 28 Apr 2021

Community Treasure Hunt

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

Start Hunting!