2009-06-08 3 views
26

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

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

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

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

+3

http://www.phys.uu.nl/ DU/num_recipes/lisp.1ed/senac/readme.htm –

+0

@jeffamaphone: Ссылка умерла. К счастью, в WayBack Machine есть копия: [Численные рецепты в Common Lisp] (http://web.archive.org/web/20100525234709/http://www.phys.uu.nl/DU/num_recipes/lisp.1ed /senac/readme.htm). – Rufflewind

+0

@Joonas_Pulakka: Я бы сказал, что причина, по которой функциональные языки более популярны для символических вычислений, состоит в том, что эти вычисления имеют высокую степень * сложности *, в отличие от традиционной линейной алгебры, которые действительно являются основными операциями, но связаны с большими объемами данных. Функциональные языки хорошо разбираются в сложных алгоритмах, тогда как императивные алгоритмы быстро становятся немыслимыми по мере того, как они становятся сложными. – Rufflewind

ответ

24

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

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

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

EDIT:

Это одновременно очевидно несовместимость, а также вопрос, который пришел первым:

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

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

+0

+1 hmatrix отлично звучит очень хорошо :) – ralphtheninja

+0

Спасибо, интересно! Является ли это чем-то неотъемлемым элементом функционального подхода, что невозможно решить математические проблемы с ними, или это только то, что первые хорошие решения оказались императивными, и тогда никто не потрудился придумать функциональные? –

+0

Я отредактировал мое сообщение, чтобы ответить на ваш комментарий. –

3

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

+2

использовать ... это как «использовать»? – dss539

+0

lol, да, это понедельник, и я не спал прошлой ночью. –

+1

. Вы должны посмотреть на разговор Гая Стила «Рождение языка». Помимо того, что вы веселый и проницательный разговор, вы будете смотреть на свое использование языка в совершенно другом свете. ;) – Svante

4

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

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

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

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

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

+0

Сито Эратосфена не так уж плохо в Хаскелле, хотя оно не так эффективно, как могло бы быть 'sieve (n: ns) = (n :). sieve $ filter ((/ = 0). flip rem n) ns', 'primes = sieve [2 ..]' – gallabytes

3

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

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

+0

Mathematica также более ориентирована на математиков, в то время как fortran, и, например, matlab, на инженеров (аналитический vs числовое). Конечно, есть контрпримеры, но это можно применить в качестве грубого правила. – Rook

+0

Ну, я использовал «серьезный» как синоним широко известных/распространенных/и т. Д. Во всяком случае, тот факт, что наиболее известные алгоритмы необходимы, по крайней мере частично объясняется историей - первые полезные алгоритмы были необходимы, и все были довольны ими, так зачем беспокоиться о повторной разработке функциональных коллег? Мне было интересно, есть ли что-то, что присуще функциональным языкам, что делает их менее полезными с математическими алгоритмами. –

+0

Я подозреваю, что историческая причина является доминирующей. Понятие о том, что функциональные языки присущи неэффективности, которые делают их непригодными для численных проблем, - это городская легенда, так же, как понятие о том, что C не подходит для числовых программ по сравнению с FORTRAN, было 20 лет назад.Однако, вероятно, кандидат или два только делают перевод и демонстрируют его. –

5

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

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

7

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

+1

Я тоже. Мне было любопытно, почему все основные библиотеки кажутся императивными. Это просто из-за исторических причин или существует какая-то присущая «несовместимость с математикой» на функциональных языках? –

+1

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

5

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

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

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

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

F # для визуализации будет даже пытаться визуализировать любое значение любого типа так you can give it a matrix of arbitrary-precision rationals and it will display the result as typeset mathematics.

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

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

+1

Как все изменилось за 5 лет и живет в эпоху «больших данных»? –

Смежные вопросы