2012-04-11 2 views
3

приведены примеры использования arbitrary precision и matrices в boost.odeint (ускоритель обыкновенного дифференциального уравнения).Требования к произвольным типам в boost.odeint

Я хотел бы использовать атомы odeint в разных типах координат (декартов, полярных или угол действия).

Какие операции следует перегружать для атомов? +, -, min, max, pow?

, в каком файле можно посмотреть, какие операции использует odeint?

Update (1) из default algebra, похоже, что он нуждается в "+", "*" и абс(), не более()

+1

Я не совсем понимаю. Если вы хотите сделать преобразование координат, не должно быть необходимости в новых типах, так как это преобразованные уравнения. Вопрос в том, что один: «С odeint я хочу использовать свой собственный тип состояния. Каков минимальный набор операций, которые должен поддерживать мой тип состояния?» –

+0

@ AndréBergner, да, вы правы. –

ответ

5

Извините за довольно длительный ответ, но у меня было ощущение, что было бы полезно разъяснение:

В общем, существует два способа специализации типов в 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.

Редактировать: Исправлено несколько опечаток.

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