Подтвердить что ты не робот

Научная математика с функциональными языками?

Существуют ли какие-либо серьезные научные математические библиотеки, созданные с использованием языков программирования? По самой природе функциональных языков можно было бы подумать, что они особенно подходят для математики, но все же известные алгоритмы кажутся процедурными.

Например, классическая серия Numerical Recipes написана в значительной степени процедурно. LAPACK практически де-факто стандарт во многих областях, но он в Фортране и, следовательно, процедурный или, возможно, OO, но определенно не работает.

Кто-нибудь смог перенести эти известные процедурные алгоритмы в функциональный стиль?

Обновить: кажется, что функциональные языки используются в символических вычислениях, например. в Математике. Но есть ли что-то по своей сути несовместимое с числовыми вычислениями и функциональными алгоритмами? Или это просто так, потому что, поскольку императивные алгоритмы были изобретены сначала, никто не удосужился придумать функциональные эквиваленты?

4b9b3361

Ответ 1

Там есть библиотека Haskell для численного материала в hackageDB: hmatrix. Он опирается на LAPACK, BLAS и GSL (Научная библиотека GNU).

Но вы должны иметь в виду, что императивные алгоритмы могут быть легко перенесены в чисто функциональные языки с использованием монад (точнее, государственных трансформаторов). Фактически любая эффективная реализация на месте должна, как правило, использовать такой механизм для предоставления изменяемых переменных в чисто функциональных языках.

Что касается функционального стиля, во многих случаях это невозможно. Для многих проблем нет известных (эффективных) функциональных подходов. Конечно, вы можете заставить такие алгоритмы работать в Haskell, например, но они не будут сильно отличаться, чем если бы они были написаны в Matlab, Fortran или C.

EDIT:

Это и кажущаяся несовместимость, а также проблема, которая была первой:

  • Эффективные численные алгоритмы обычно требуют изменчивых данных. Хотя это возможно в чисто функциональной обстановке, это не так просто, как в императивных языках. Но две вычислительные модели совершенно эквивалентны.
  • Основная машина (например, набор команд) всегда была и остается обязательной, за очень небольшим исключением (!). Императивно кодированные алгоритмы легче анализировать и оптимизировать, учитывая то, как моделируется реальная машина.
  • В то время как лежащая в основе математика позволяет относительно легко выводить функциональные решения, вы не получите эффективный алгоритм (как и в случае получения императивных решений непосредственно из математики). Поскольку большинство усилий было и остается направлено на императивные решения, функциональные аналоги просто неизвестны. По функциональным аналогам я имею в виду код, который правильно выражает функциональные намерения и стиль.
  • Существует довольно много императивного кода, который можно использовать повторно. Большая часть его может быть транскрибирована на функциональный язык с использованием трансформаторов состояния, хотя это все равно будет по-настоящему обязательным.

Я действительно считаю, что чисто функциональный язык, такой как Haskell, может быть полезен для алгоритмов кодирования: можно объединить математическое описание, сам алгоритм и какое-то тип-ориентированное доказательство (т.е. используя изоморфизм Карри-Говарда) в том же фрагмент кода.

Ответ 2

Я бы использовал LAPACK как черный ящик из функционального языка, а не пытался его переписать. В течение десятилетий LAPACK была проверена, доработана, оптимизирована и т.д. Некоторыми чрезвычайно умными людьми. Я бы не трогал его.

Ответ 3

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

Краеугольным камнем книги является пакет scmutils, который включает в себя функциональный подход ко многим вычислительным задачам, таким как интеграция и минимизация.

Ответ 4

Отличный вопрос!

Я уже несколько лет являюсь одним из немногих пионеров в этой области, и мы только недавно достигли точки, в которой можно получить производительность, подобную Fortran, и краткость Python в одно и то же время для широкого спектра проблемы. Изучив все доступные функциональные языки и их реализации очень подробно, я решил сосредоточить свои усилия на статически типизированных нечистых функциональных языках: open source Программирование OCaml язык и язык программирования Microsoft F # для .NET.

Моя книга OCaml для ученых охватывает научные вычисления с помощью языка программирования OCaml с использованием Linux или Mac OS X. Моя книга F # для ученых охватывает научные вычисления с язык программирования Microsoft F # с использованием Windows и Visual Studio. Моя компания также продает F # для Numerics и библиотеки F # для визуализации которые полностью написаны в F # и широко используют функциональное программирование как внутри, так и для улучшения краткости, ясности и ремонтопригодности, а также для облегчения использования библиотеки. Например, первоклассные функции позволяют легко строить графики, например. построение функции синуса:

Plot([Function sin], (-5., 5.))

F # для визуализации будет даже пытаться визуализировать любое значение любого типа, поэтому вы можете дать ему матрицу рациональных значений произвольной точности и отобразит результат как набираемая математика.

У нас был большой успех для написания кода для научных вычислений в функциональном стиле на языках OCaml и F #. В частности, F # упрощает создание высокопроизводительного параллельного кода, который является общим без каких-либо ограничений производительности для абстракции. Таким образом, вы можете реализовать QR-декомпозицию, которая работает для матриц любого типа (одинарная точность, двойная точность, сложная или даже символическая!) И даже бьют производительность настроенных вендоров библиотеки, такие как Intel MKL!

Наконец, я должен отметить, что Mathematica каким-то образом пропустила эту тропу задолго до того, как я это сделал. Однако их решение состояло в том, чтобы объединить огромную стандартную библиотеку числовых и символических функций, написанных на языке C с условным императивным стилем, и обеспечить довольно рудиментарный функциональный язык программирования для вызова этих функций. Основным недостатком их подхода является то, что общий код, написанный в Mathematica (т.е. Где время не проводится в основном в их стандартной библиотеке), примерно в 1000 раз медленнее C.

Ответ 5

Несколько систем компьютерной алгебры (например, Maxima) используют внутренние языки LISP для представления символических вычислений/деревьев синтаксиса.

Примеры математических, функциональных языков:

http://en.wikipedia.org/wiki/J_(programming_language)

http://en.wikipedia.org/wiki/K_(programming_language)

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

Ответ 6

Я считаю, что математика использует свой собственный функциональный язык.

Ответ 7

Определите "серьезный". Помните, что функциональные языки (кроме LISP) довольно новы - оригинальные документы Backes были только в конце 70-х годов, а функциональные языки разработки были совершенно новыми. Известные и хорошо принятые числовые пакеты основаны на алгоритмах и кодах, начиная с конца 60 и начале 70 - BLAS был впервые опубликован в 1979 году. Поскольку для использования в производстве люди склонны тяготеть к хорошо известным и доверенным пакетам, там есть большой диск для старых кодов FORTRAN.

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