Python program to calculate harmonic series

后端 未结 11 1866
终归单人心
终归单人心 2020-12-06 19:15

Does anyone know how to write a program in Python that will calculate the addition of the harmonic series. i.e. 1 + 1/2 +1/3 +1/4...

相关标签:
11条回答
  • 2020-12-06 19:33

    Just a footnote on the other answers that used floating point; starting with the largest divisor and iterating downward (toward the reciprocals with largest value) will put off accumulated round-off error as much as possible.

    0 讨论(0)
  • 2020-12-06 19:34

    A fast, accurate, smooth, complex-valued version of the H function can be calculated using the digamma function as explained here. The Euler-Mascheroni (gamma) constant and the digamma function are available in the numpy and scipy libraries, respectively.

    from numpy import euler_gamma
    from scipy.special import digamma
    
    def digamma_H(s):
        """ If s is complex the result becomes complex. """
        return digamma(s + 1) + euler_gamma
    
    from fractions import Fraction
    
    def Kiv_H(n):
        return sum(Fraction(1, d) for d in xrange(1, n + 1))
    
    def J_F_Sebastian_H(n):
        return euler_gamma + log(n) + 0.5/n - 1./(12*n**2) + 1./(120*n**4)
    
    
    

    Here's a comparison of the three methods for speed and precision (with Kiv_H for reference):

    Kiv_H(x) J_F_Sebastian_H(x) digamma_H(x) x seconds bits seconds bits seconds bits 1 5.06e-05 exact 2.47e-06 8.8 1.16e-05 exact 10 4.45e-04 exact 3.25e-06 29.5 1.17e-05 52.6 100 7.64e-03 exact 3.65e-06 50.4 1.17e-05 exact 1000 7.62e-01 exact 5.92e-06 52.9 1.19e-05 exact

    0 讨论(0)
  • 2020-12-06 19:38

    Using the simple for loop

    def harmonicNumber(n):
    x=0
    for i in range (0,n):
        x=x+ 1/(i+1)
    return x
    
    0 讨论(0)
  • 2020-12-06 19:43

    @Kiv's answer is correct but it is slow for large n if you don't need an infinite precision. It is better to use an asymptotic formula in this case:

    asymptotic expansion for harmonic number

    #!/usr/bin/env python
    from math import log
    
    def H(n):
        """Returns an approximate value of n-th harmonic number.
    
           http://en.wikipedia.org/wiki/Harmonic_number
        """
        # Euler-Mascheroni constant
        gamma = 0.57721566490153286060651209008240243104215933593992
        return gamma + log(n) + 0.5/n - 1./(12*n**2) + 1./(120*n**4)
    

    @Kiv's answer for Python 2.6:

    from fractions import Fraction
    
    harmonic_number = lambda n: sum(Fraction(1, d) for d in xrange(1, n+1))
    

    Example:

    >>> N = 100
    >>> h_exact = harmonic_number(N)
    >>> h = H(N)
    >>> rel_err = (abs(h - h_exact) / h_exact)
    >>> print n, "%r" % h, "%.2g" % rel_err
    100 5.1873775176396242 6.8e-16
    

    At N = 100 relative error is less then 1e-15.

    0 讨论(0)
  • 2020-12-06 19:43

    This ought to do the trick.

    def calc_harmonic(n):
        return sum(1.0/d for d in range(2,n+1))
    
    0 讨论(0)
提交回复
热议问题