Какой язык программирования или библиотека могут обрабатывать Infinite Series? - PullRequest
26 голосов
/ 31 марта 2010

Какой язык программирования или библиотека способны обрабатывать бесконечные серии (например, геометрические или гармонические)? Возможно, он должен иметь базу данных известных рядов и автоматически давать правильные значения в случае сходимости, а может генерировать исключение в случае расхождения.

Например, в Python это может выглядеть так:

sum  = 0
sign = -1.0
for i in range(1,Infinity,2):
     sign = -sign
     sum += sign / i

тогда сумма должна быть math.pi / 4 без каких-либо вычислений в цикле (потому что это известная сумма).

Ответы [ 13 ]

18 голосов
/ 31 марта 2010

Большинство функциональных языков, которые лениво оценивают, могут моделировать обработку бесконечных рядов. Конечно, на конечном компьютере невозможно обрабатывать бесконечные серии, как я уверен, вы знаете. Наверху, я думаю, Mathematica может сделать большинство того, что вы можете, я подозреваю, что Клен тоже может, может быть Sage и другие алгебраических систем, и я был бы удивлен, если бы вы не смогли найти подходящую вам реализацию на Haskell.

РЕДАКТИРОВАТЬ, чтобы уточнить для ОП: Я не предлагаю генерировать бесконечные циклы. Ленивая оценка позволяет вам писать программы (или функции), которые моделируют бесконечные ряды, программы, которые сами по себе конечны во времени и пространстве. С такими языками вы можете определить многие свойства, такие как сходимость, моделируемых бесконечных рядов со значительной точностью и некоторой степенью достоверности. Попробуйте Mathematica или, если у вас нет к нему доступа, попробуйте Wolfram Alpha , чтобы узнать, что одна система может сделать для вас.

15 голосов
/ 31 марта 2010

Одним из мест для поиска может быть категория Википедии Системы компьютерной алгебры .

13 голосов
/ 31 марта 2010

Для этого в Haskell есть два инструмента, помимо поддержки бесконечных списков.

Во-первых, есть модуль, который поддерживает поиск последовательностей в OEIS.Это может быть применено к первым нескольким терминам вашей серии и может помочь вам определить серию, для которой вы не знаете закрытую форму и т. Д. Другой является библиотека вычисляемых реалов CReal.Если у вас есть возможность генерировать постоянно улучшающуюся границу для вашего значения (т. Е. Суммируя по префиксу, вы можете объявить это как вычисляемое действительное число, которое допускает частичное упорядочение и т. Д. Во многих случаях это дает вам значение, которое вы можетеиспользуйте, как указано выше.

Однако в общих вычислениях равенство двух потоков требует оракула для решения проблемы остановки, поэтому ни один язык не будет делать то, что вы хотите в полной общности, хотя некоторые системы компьютерной алгебры, такие как Mathematica, могут попробовать.

12 голосов
/ 31 марта 2010

Максима может вычислить некоторые бесконечные суммы, но в данном конкретном случае, похоже, не находит ответа: -s

(%i1) sum((-1)^k/(2*k), k, 1, inf), simpsum;
                                 inf
                                 ====       k
                                 \     (- 1)
                                  >    ------
                                 /       k
                                 ====
                                 k = 1
(%o1)                            ------------
                                      2

, но, например, эти работы:

(%i2) sum(1/(k^2), k, 1, inf), simpsum;
                                        2
                                     %pi
(%o2)                                ----
                                      6

(%i3) sum((1/2^k), k, 1, inf), simpsum;
(%o3)                                  1
8 голосов
/ 18 августа 2010

Вы можете решить проблему серии в Sage (бесплатная математическая система на основе Python) следующим образом:

sage: k = var('k'); sum((-1)^k/(2*k+1), k, 1, infinity)
1/4*pi - 1

За кулисами действительно используется Maxima (компонент Sage).

7 голосов
/ 31 марта 2010

Для Python посмотрите SymPy - клон Mathematica и Matlab.

Существует также более тяжелый математический инструмент на основе Python, называемый Sage .

4 голосов
/ 18 апреля 2010

Вам нужно что-то, что может сделать символическое вычисление, например Mathematica . Вы также можете рассмотреть вопрос: wolframaplha: sum ((- 1) ^ i * 1 / i, i, 1, inf)

3 голосов
/ 05 мая 2010

Библиотека C ++ iRRAM выполняет реальную арифметику точно . Помимо прочего, он может вычислять лимиты точно, используя функцию limit. Домашняя страница для iRRAM здесь . Ознакомьтесь с функцией предела в документации. Обратите внимание, что я не говорю о произвольной точности арифметики. Это точная арифметика, для разумного определения точного. Вот их код для точного вычисления e, взятый из примера на их веб-сайте:

//---------------------------------------------------------------------
// Compute an approximation to e=2.71.. up to an error of 2^p
 REAL e_approx (int p)
{
  if ( p >= 2 ) return 0;

  REAL y=1,z=2;
  int i=2;
  while ( !bound(y,p-1) ) {
    y=y/i;
    z=z+y;
    i+=1;
  }
  return z;
};

//---------------------------------------------------------------------
// Compute the exact value of  e=2.71.. 
REAL e()
{
  return limit(e_approx);
};
3 голосов
/ 19 апреля 2010

Существует библиотека mpmath (python), модуль sympy, которая обеспечивает поддержку серии для sympy (я полагаю, она также поддерживает sage).
Более конкретно, все материалы серии можно найти здесь: Документация серии

2 голосов
/ 31 марта 2010

Clojure и Haskell с макушки головы.

Извините, я не смог найти лучшую ссылку на последовательности haskell, если у кого-то еще есть, пожалуйста, дайте мне знать, и я обновлю.

...