Lisp, OCaml или что за Рунге Кутта?

Какой язык вы бы предложили для решения системы с:

  • дифференциальные уравнения первого порядка
  • комплексные переменные
  • N-размеры

с использованием Рунге Кутта 4-го порядка или подобного.

Скорость имеет много значение, но ею можно пожертвовать ради:

  • Элегантный (чистый и короткий) код
  • Гибкость + масштабируемость

Я в основном между Lisp и OCaml, но любые другие предложения приветствуются.

Спасибо!


person Eelvex    schedule 25.05.2010    source источник


Ответы (7)


Вот реализация RK в Common Lisp:

http://github.com/bld/bld-ode/blob/master/rk.lisp

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

SBCL имеет отличный компилятор собственного кода.

person Leslie P. Polzer    schedule 26.05.2010
comment
Мне также нравятся встроенные в CL функции bignum. - person Paul Nathan; 03.06.2010
comment
Разве CL не соответствует стандарту IEEE 754? - person J D; 21.12.2010

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

person Stephen Canon    schedule 25.05.2010
comment
На самом деле, я уже все реализовал на C, но теперь я хочу расширить проект, поэтому я взвешиваю свои варианты... - person Eelvex; 26.05.2010

Я не знаком с Рунге Кутта, но OCaml может обеспечить хорошую скорость и читабельность в целом, по крайней мере, если вы будете немного осторожны. Тогда у вас будет преимущество надежной статической системы типов для остальной части вашего приложения.

person Michael Ekstrand    schedule 28.05.2010
comment
Я не знаком с OCaml;), но Рунге-Кутта (en.wikipedia.org/wiki/Runge_kutta) относится к классу алгоритмов для численного решения систем дифференциальных уравнений. Алгоритм Рунге-Кутта 1-го порядка (RK1) также известен как метод Эйлера (en.wikipedia.org/wiki/Euler_method), но имеет тенденцию быстро терять точность. Для многих приложений алгоритм Рунге-Кутты 4-го порядка (RK4) обеспечивает хорошую точность и быстродействие. - person andand; 28.05.2010

помимо всего прочего, вы можете написать привязки ocaml к вашему существующему решателю C runge-kutta.

person Martin DeMello    schedule 31.05.2010

Трудно сказать, какой язык будет проще всего, есть lisp, C++, C# и т. д. библиотеки для достижения этой цели, так что многое, если это связано с личными предпочтениями. Я бы предположил, что Matlab является наиболее адаптированным и элегантным решением специально для таких типов задач, и в нем есть много встроенная поддержка ODE... Лисп может быть медленным... и я не могу говорить за OCaml.

person tbischel    schedule 25.05.2010
comment
* Спасибо за предложение GSLL! * К сожалению, Matlab был бы слишком медленным для моих целей - person Eelvex; 26.05.2010

Я бы предложил использовать python + numpy + scipy, общая математическая и числовая поддержка (превосходные многомерные массивы) превосходна. В любом случае это зависит от конкретных потребностей.

person pygabriel    schedule 03.06.2010
comment
Вы правы, python тоже очень хорош для этого, но, к сожалению, он слишком медленный. - person Eelvex; 03.06.2010
comment
Изучение PyDSTool может быть полезным. Хотя это более общий инструмент, он на лету генерирует решатели C из более математической спецификации ОДУ. Добавлен бонус: разделы Пуанкаре (События ;) ). - person mbudisic; 21.04.2011

Fortran или C, возможно, стоит изучить подпрограммы NAG. C был бы более гибким и простым для понимания, но Fortran обычно считается лучшим для числовых вычислений.

person James    schedule 25.05.2010
comment
Числовая модель C, особенно с C99, на самом деле лучше, чем у Fortran. Fortran используется для таких вещей, потому что его легко писать и люди знакомы с ним, а не потому, что он обеспечивает лучшую среду для числовых вычислений. - person Stephen Canon; 26.05.2010
comment
@ Стивен - пожалуйста, не высказывайте таких мнений о начале флеймовой войны, не предоставляя веских доказательств, подтверждающих это. - person Rook; 26.05.2010
comment
@Idigas: Хорошо, я поддержу это. Один простой пример: Fortran выбирает неправильный нулевой знак для результатов, когда входные данные лежат на разветвлении нескольких сложных функций (особенно квадратного корня и логарифмического). См. превосходную статью Кахана «Разрезы ветвей» для сложных элементарных функций или «Много шума из ничего» для примеров того, где выбор Фортрана уступает стандарту C (который следует рекомендации Кахана). В более общем плане Fortran допускает множество оптимизаций производительности, которые могут иметь негативные последствия для числовой стабильности, которые по умолчанию запрещены в C. - person Stephen Canon; 26.05.2010
comment
Я также хотел бы отметить, что ваш комментарий действительно должен быть адресован Джеймсу, поскольку Фортран обычно считается лучшим для числовых вычислений =) - person Stephen Canon; 26.05.2010
comment
@Stephen Canon - Нет. Хотя я тоже не полностью согласен с Джеймсом, этот комментарий был адресован вам. Но оставим это в стороне. К сожалению, я не совсем понимаю ваше второе предложение. Я признаю, что мой английский может немного отсутствовать, поэтому я спрашиваю, не могли бы вы поподробнее рассказать об одном простом... - person Rook; 26.05.2010
comment
Что касается цитируемых статей, то у меня, к сожалению, нет ни времени, ни интереса их читать. В прошлом меня несколько раз убеждали прочитать статьи, рекомендованные другими здесь, на похожие темы (обычно в дискуссиях, которые почти всегда касаются фортрана, это неправильная тема), и почти каждый раз я находил их очень предвзятыми. Да, это правда, соглашения Фортрана (!) обычно отличаются. Но обычно они отличаются только от того, к чему привыкли компьютерщики (школа C с примесью некоторых других). - person Rook; 26.05.2010
comment
Я сам инженер (не cs), с программированием только как со вторым интересом, и до сих пор я иногда удивляюсь, как продуманы его соглашения. В то время как C по сравнению с ним кажется крайне запутанным, не имеющим (или, по крайней мере, для меня) общего знаменателя. Я до некоторой степени использовал сложные переменные в фортране, но не нашел неправильного знака. Поскольку стандарт fortran создается на основе запросов клиентов в отрасли к разработчикам компиляторов (и затем это проходит через комитет ...), я не согласен с утверждением, что это - person Rook; 26.05.2010
comment
уступает. Лично я (эта часть субъективна) в целом не согласен с мнением некоторых из очень уважаемых фигур, цитируемых здесь - Кнута, например, по ряду вопросов, за которым я регулярно слежу почти неукоснительно, хотя так редко критически думал о. - person Rook; 26.05.2010
comment
@Idigas: Отвечая на ваш комментарий о том, что соглашения Фортрана обычно отличаются только от того, к чему привыкли ученые-компьютерщики: по образованию я математик, а не ученый-компьютерщик. Автор, которого я цитировал, Уильям Кахан (получивший премию Тьюринга за свою работу по числовым вычислениям) также является математиком. Соглашения Фортрана о знаке нуля в сложной арифметике, реассоциации арифметики и других оптимизациях, которые справедливо называют небезопасными в C, контрпродуктивны для строгого численного программирования. Отлично подходит для производительности, плохо для воспроизводимости и правильности. - person Stephen Canon; 26.05.2010
comment
Признаюсь, слово «лучший» было неправильным. Я имел в виду самый быстрый, так как ОП интересовала скорость. Конечно, все постоянно меняется, и даже разные компиляторы для одного и того же языка могут создавать код с разной производительностью. Учитывая, что это относительно простой алгоритм для реализации, его тестирование на каждом языке перед расширением проекта не займет много времени. Лично я бы использовал C, так как программировать на Фортране довольно сложно, особенно на старых версиях. - person James; 26.05.2010
comment
@Stephen Canon - к сожалению, какие соглашения используют математики, для меня полная загадка. С некоторыми я знаком, но недостаточно, чтобы констатировать факты. Таким образом, вы имеете меня в невыгодном положении здесь. Кстати, что такое воспроизводимость и правильность? - person Rook; 26.05.2010
comment
@James - Я нахожу, что старые ароматы в настоящее время также несколько сложны в обращении. Но мне также трудно найти причины, по которым кто-то будет их использовать, поскольку f90/95 существует для чего, всего 20 лет? - person Rook; 26.05.2010
comment
@Idigas - Можно было бы подумать, что никто не будет их использовать, но когда дешевые отделы имеют лицензии только на библиотеки NAG f77, тогда ваша рука вынуждена. К сожалению, изучив f90, пришлось долго-долго отлаживать, только чтобы понять, что первые 7 символов строки - это символы комментария в f77! - person James; 26.05.2010
comment
@James - Пожалуйста, не вырывайте слова из контекста и не перекручивайте их. Я нигде не писал, что ими никто не пользуется. Я сказал, что их сложнее использовать, чем более новые воплощения. Если вы заперты из-за вендоров или из-за библиотек, то все - нам не о чем говорить. Но, по сравнению с другими языками сегодня, да, f77 несколько архаичен - поэтому я предлагаю не использовать его (мой комментарий выше). Вместо этого используйте (более новые, им всего 20 лет) версии языка. Я использую смесь f95/f2003 (большинство f2003 - person Rook; 26.05.2010
comment
функции теперь реализованы), и я не знаю ни одного другого языка, подходящего для работы, как он есть (за исключением, может быть, Matlab, но он довольно медленный и причудливый, на мой вкус ... не говоря уже о том, что я не не хочется переписывать код с каждой новой версией). Что касается последнего (7 столбцов) комментария - это правило обычно находится на первых 2 страницах каждой книги/руководства/раздаточного материала на фортране. Нежелание учиться не является оправданием. И я вижу, вы до сих пор его не читали, так как первые 7 символов не являются комментариями. Первые 5 – это метка строки. - person Rook; 26.05.2010
comment
символов, а 6-й зарезервирован для символов продолжения строки. Комментарии помещаются в строку, начинающуюся с буквы C (для комментария). Кроме того, каждый компилятор, который я видел в последнее время (насколько я помню), имеет возможность обработки фиксированной формы и свободной формы, а также возможности f77. Только. Ваш код f77 также является кодом f90, если вы решите его скомпилировать, поскольку f77 является полным подмножеством f90. Вы также можете смешивать их (если у вас есть библиотеки f77 с кодом f90). Что мне нравится в фортране, так это то, что он создавался с учетом того факта, что срок службы некоторых программ превышает срок службы вашей обычной ОС. - person Rook; 26.05.2010
comment
Но послушай, я устаю здесь писать абзацы текста, чтобы исправить каждую ошибку, которую кто-то делает в двух предложениях, которые он пишет. Так что я собираюсь остановиться сейчас ... вы можете использовать все, что хотите. Если вы хотите использовать более новые функции, купите себе книгу f95/2003 и прочитайте ее; если вы хотите сохранить мнение, что фортран застрял на f77 - я ничего против этого не имею. Для кого-то невежество — это блаженство. - person Rook; 26.05.2010
comment
@Идигас. Я не собирался искажать ваши слова, просто привел личный пример трудностей с Фортраном. Эта ветка больше не является продуктивной, поэтому это будет мой последний комментарий в ней. - person James; 26.05.2010