Извините за довольно длительный ответ, но у меня было ощущение, что было бы полезно разъяснение:
В общем, существует два способа специализации типов в odeint.
Один из способов специализируется алгебры, которые, как полагают, чтобы адаптироваться, как один перебирает контейнер или коллекции, как и std::vector
, std::array
, ublas::matrix
и т.д. odeint некоторые предопределенные алгебра существует:
range_algebra
, который работает с все контейнер выполняет концепцию диапазона от boost.range
fusion_algebra
для компиляции последовательности
vector_space_algebra
, который направляет итерацию к операции.
thrust_algebra
для использования с тягой - это STL-как основа для CUDA
Вторая возможность адаптировать для специальных типов операций, которые, как считается, позволяют определить, как выполнять основные операции над элементами контейнера. Вот некоторые предопределенные операции существуют
default_operations
, которые работают на большинстве типов, как double
, float
, std::complex<>
, ... default_operations
только предположить, что операторы +, -, *,/определены также основные функции, такие как abs
, max
.
thrust_operation
для использования с тягой
Если я правильно понимаю ваш вопрос, у вас есть один или несколько типов точек с могут жить в разных системах и, следовательно, операторы координат на этот тип должен быть адаптирован для работы с odeint. В этом случае вы можете использовать range_algebra
в сочетании с «default_operations»: скажем, ваш тип называется point_type
, и в основном он состоит из двухместных, основного типа с плавающей запятой.Для того чтобы работать с 'default_operations', необходимо
point_type operator+(point_type , double);
point_type operator+(double , point_type);
point_type operator+(point_type , point_type);
point_type operator*(point_type , double);
point_type operator*(double , point_type);
point_type operator/(point_type , double);
double abs(point_type);
Я думаю, что это все, что необходимо. Затем вы сможете использовать свой point_type в контейнерах, таких как vector
, array
и т. Д. В odeint также есть пример, показывающий, как адаптировать специальные типы точек: solar system с point types. Это довольно легко, если вы используете библиотеку Boost.Operators.
Редактировать: Исправлено несколько опечаток.
Я не совсем понимаю. Если вы хотите сделать преобразование координат, не должно быть необходимости в новых типах, так как это преобразованные уравнения. Вопрос в том, что один: «С odeint я хочу использовать свой собственный тип состояния. Каков минимальный набор операций, которые должен поддерживать мой тип состояния?» –
@ AndréBergner, да, вы правы. –