Для этого нужны библиотеки "решателей" ОДУ и векторно-матричных операций. При этом мне хотелось разработать 1) максимально независимую от сторонних библиотек и 2) компактную программу. Быстродействие также весьма существенно, но здесь "будем посмотреть". Не хотелось бы из-за одной операции обращения матрицы пристёгивать целый BLAS или нечто подобное. Предпочтение отдавалось С++-библиотекам или библиотекам, имеющим С++-обёртки.
Из решателей нужны один-два хороших метода численного решения ДУ и необходимые для них сервисные классы. Поэтому возможностей любой, даже самой скромной библиотеки решателей хватает более чем с избытком. Каждая из подобных библиотек поддерживает свой набор векторно-матричных контейнеров.
Контейнеры:
- GNU Scientific Library: gsl_vector, gsl_matrix
- Numerical Recipes: NRvector, NRmatrix
- Blitz++ arrays
- MTL4 matrix types
- Armadillo C++ Library
- IT++: vec, mat
- Seldon
- boost::Ublas
- QT:QVector, wxWidgets:wxArray, MFC:CArray
- Thrust: device_vector, host_vector
дополнения к этому списку – см. %newwin%здесь.
Векторы и матрицы предполагаются фиксированных размеров, поэтому необходимости в функционале std::vector<> нет. В этом смысле мне вполне подходят классы из Numerical Recipes, которые надо дополнить недостающими операциями, в частности:
linspace()
- срез массива
- заполнение вектора/матрицы константой
- конкатенация
- векторное и скалярное произведения
- транспонирование
а также классами проверки диапазонов и allocator
'ом.
Интеграторы:
- GNU Scientific Library
- Numerical Recipes
- Boost.Numeric.odeint
Разработчики последней утверждает, что он быстрее GSL и "понимает":
- контейнеры STL (vector, list, map, tr1::array)
- MTL4 matrix types, blitz++ arrays, Boost.Ublas matrix types
- thrust::device_vector
- ANY type you like
Попробовав её, убедился – для моих целей это избыточно. Достаточно взять необходимые степперы и сервисные классы из NR и переделать под свои нужды.
Комментарии
comments powered by Disqus