Программа Python для вычисления гармонического ряда

Что это начало происходить, когда я понизил jdk-11.0.2 до jdk1.8.0_191.

blockquote>

Это + java.lang.NoSuchMethodException на самом деле довольно подозрительно. Класс ModuleReferenceImpl является расширенным классом ModuleReference, , который был доступен с Java 9 .

6
задан Zero Piraeus 11 May 2013 в 02:14
поделиться

7 ответов

Ответ @Kiv корректен, но это медленно для большого n, если Вам не нужна бесконечная точность. Лучше использовать асимптотическую формулу в этом случае:

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 для Python 2.6:

from fractions import Fraction

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

Пример:

>>> 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

В N = 100 относительная погрешность меньше затем 1e-15.

21
ответ дан 8 December 2019 в 02:08
поделиться

Решение @recursive правильно для приближения с плавающей точкой. Если Вы предпочитаете, можно получить точный ответ в Python 3.0 с помощью модуля частей:

>>> from fractions import Fraction
>>> def calc_harmonic(n):
...   return sum(Fraction(1, d) for d in range(1, n + 1))
...
>>> calc_harmonic(20) # sum of the first 20 terms
Fraction(55835135, 15519504)

Обратите внимание, что количество цифр растет быстро, таким образом, это потребует большой памяти для большого n. Вы могли также использовать генератор для рассмотрения серии частичных сумм, если бы Вы хотели стать действительно необычными.

12
ответ дан 8 December 2019 в 02:08
поделиться

Просто сноска на других ответах, которые использовали плавающую точку; запуск с самого большого делителя и итерация вниз (к обратным величинам с самым большим значением) отложат накопленную ошибку округления как можно больше.

5
ответ дан 8 December 2019 в 02:08
поделиться

Это должно добиться цели.

def calc_harmonic(n):
    return sum(1.0/d for d in range(2,n+1))
2
ответ дан 8 December 2019 в 02:08
поделиться

Гармонический ряд отличается, т.е. его сумма является бесконечностью..

править: Если Вы не хотите частичные суммы, но Вы действительно не согласились с этим.

4
ответ дан 8 December 2019 в 02:08
поделиться

Как насчет этого:

partialsum = 0
for i in xrange(1,1000000):
    partialsum += 1.0 / i
print partialsum

где 1000000 верхняя граница.

0
ответ дан 8 December 2019 в 02:08
поделиться

Домашняя работа?

Это - расходящиеся ряды, таким образом, невозможно суммировать его для всех условий.

Я не знаю Python, но я знаю, как записать это в Java.

public class Harmonic
{
    private static final int DEFAULT_NUM_TERMS = 10;

    public static void main(String[] args)
    {
        int numTerms = ((args.length > 0) ? Integer.parseInt(args[0]) : DEFAULT_NUM_TERMS);

        System.out.println("sum of " + numTerms + " terms=" + sum(numTerms));
     }

     public static double sum(int numTerms)
     {
         double sum = 0.0;

         if (numTerms > 0)
         {
             for (int k = 1; k <= numTerms; ++k)
             {
                 sum += 1.0/k;
             }
         }

         return sum;
     }
 }
0
ответ дан 8 December 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: