sum-series

Compute the sum of an infinite series.

Usage

var sumSeries = require( '@stdlib/math/base/tools/sum-series' );

sumSeries( generator[, options ] )

Computes the sum of the series given by the supplied generator argument. generator can be either an ES6 Generator object or a function which returns successive elements of the series at each invocation.

Using an ES6 Generator object:

var gen = geometricSeriesGenerator( 0.9 );
var out = sumSeries( gen );
// returns 10

function* geometricSeriesGenerator( x ) {
    var exponent = 0;
    while ( true ) {
        yield Math.pow( x, exponent );
        exponent += 1;
    }
}

Alternatively, one can use a closure to achieve the same goal:

var gen = geometricSeriesClosure( 0.9 );
var out = sumSeries( gen );
// returns 10

function geometricSeriesClosure( x ) {
    var exponent = -1;
    return gen;

    function gen() {
        exponent += 1;
        return Math.pow( x, exponent );
    }
}

The function accepts the following options:

  • maxTerms: integer denoting the maximum number of terms to be summed. Default: 1000000.
  • tolerance: number primitive specifying the tolerance used to assess convergence. Default: 2.22e-16.
  • initialValue: number primitive specifying the initial value of the returned sum. Default: 0.

By default, the initial value of the sum is 0. To choose a different one, use the initialValue option.

var out = sumSeries( geometricSeriesGenerator( 0.5 ), {
    'initialValue': 1
});
// returns 3

To change the maximum number of terms to be summed, set the maxTerms option.

var out = sumSeries( geometricSeriesGenerator( 0.5 ), {
    'maxTerms': 10
});
// returns ~1.998 (infinite sum is 2)

The default tolerance of 2.22e-16 used to assess convergence can be changed via the tolerance option.

var out = sumSeries( geometricSeriesGenerator( 0.5 ), {
    'tolerance': 1e-3
});
// returns ~1.998

Examples

var log1p = require( '@stdlib/math/base/special/log1p' );
var sumSeries = require( '@stdlib/math/base/tools/sum-series' );

function* log1pSeries( x ) {
    var k = 0;
    var mMult = -x;
    var mProd = -1;
    while ( true ) {
        mProd *= mMult;
        k += 1;
        yield ( mProd / k );
    }
}

console.log( 'log1p(0.5) evaluated via math-log1p module: %d', log1p( 0.5 ) );
console.log( 'log1p(0.5) evaluated via infinite series expansion: %d', sumSeries( log1pSeries( 0.5 ) ) );