Превосходит ли ODE, написанная с использованием GNU gsl, NDSolve от Mathematica?

Может ли решатель ODE, написанный на C с использованием библиотеки GSL, иметь значительные преимущества в скорости по сравнению с Mathematica 8.0 NDSolve? Насколько это справедливо с точки зрения точности?

Насколько я понимаю, скомпилированный код в принципе может быть быстрее, но что в наши дни NDSolve каким-то образом уже использует много скомпилированного кода?

Также есть ли какие-либо варианты использования таких вещей, как MathLink или функция компиляции Mathematica, для ускорения решения ODE?


person fpghost    schedule 18.10.2012    source источник
comment
Кстати, если вас беспокоит производительность, попробуйте c ++ odeint. вот что я использую. имеет более современные интеграторы и лучшую производительность   -  person kirill_igum    schedule 05.11.2012


Ответы (2)


В центре внимания Mathematica - удобство использования. Они действительно используют числовые библиотеки. Таким образом, скорость будет такой же, как у лучшей доступной библиотеки или хуже (почти во всех случаях). например, я слышал, что они используют собственное значение для матричного материала.

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

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

person kirill_igum    schedule 18.10.2012
comment
хотя они оптимизируют функции, которые они предоставляют, ваши собственные функции не оптимизированы. Есть ли способ использовать компиляцию Mathematica, чтобы избежать этой ловушки и, таким образом, сравнять скорость c? - person fpghost; 19.10.2012
comment
не компилировать mathematica, но вы можете создать интерфейс mathematica с помощью c libs. поэтому вы должны сделать свою функцию как c lib. если вы знаете или научитесь это делать, было бы проще просто использовать c. - person kirill_igum; 19.10.2012
comment
кстати, я обнаружил, что nongnu.org/gsl-shell неплохо подходит для создания прототипов. это быстро и просто. - person kirill_igum; 19.10.2012

NDSolve и другие числовые функции в Mathematica автоматически компилируют ваш операнд (например, RHS ODE) на промежуточный язык «байт-кода» (тот же, что используется функцией Compile). При желании вы можете указать CompilationTarget -> "C", и функция будет быть полностью скомпилирован в код C и снова связан с Mathematica ... Вы можете сами увидеть сгенерированный код C в этом предыдущем вопросе на Mathematica Stack Exchange:

https://mathematica.stackexchange.com/questions/821/how-well-does-mathematica-code-exported-to-c-compare-to-code-directly-written-fo/830#830

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

person Andrew Moylan    schedule 18.10.2012