![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Using matrices as state typesBoost , Chapter 1. Boost.Numeric.Odeint , Tutorial
|
![]() | Home | Libraries | People | FAQ | More |
одеинт хорошо работает с различными типами состояний. Он не ограничивается чисто векторными типами, такими как<vector<double>
>,<array<double,N>
>,<fusion::vector<double,double>
>и т. д., но также работает с типами, имеющими другую топологию, чем простые векторы. Здесь мы покажем, как можно использовать одеинт с матрицами в качестве типа состояний, в следующем разделе мы покажем, как можно использовать для решения ОДЭ, определенных в сложных сетях.
По умолчанию odeint можно использовать с<ublas::matrix<T>
>в качестве типа состояния для матриц. Простым примером является двумерная решетка сцепленных фазовых осцилляторов. Другие типы матриц, такие как<mtl::dense_matrix
>или блиц-массивы и матрицы, также могут использоваться, но для работы с odeint требуется некоторая активация. Эта активация описана в следующих разделах:
Определение системы является
typedef boost::numeric::ublas::matrix< double > state_type; struct two_dimensional_phase_lattice { two_dimensional_phase_lattice( double gamma = 0.5 ) : m_gamma( gamma ) { } void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const { size_t size1 = x.size1() , size2 = x.size2(); for( size_t i=1 ; i<size1-1 ; ++i ) { for( size_t j=1 ; j<size2-1 ; ++j ) { dxdt( i , j ) = coupling_func( x( i + 1 , j ) - x( i , j ) ) + coupling_func( x( i - 1 , j ) - x( i , j ) ) + coupling_func( x( i , j + 1 ) - x( i , j ) ) + coupling_func( x( i , j - 1 ) - x( i , j ) ); } } for( size_t i=0 ; i<x.size1() ; ++i ) dxdt( i , 0 ) = dxdt( i , x.size2() -1 ) = 0.0; for( size_t j=0 ; j<x.size2() ; ++j ) dxdt( 0 , j ) = dxdt( x.size1() -1 , j ) = 0.0; } double coupling_func( double x ) const { return sin( x ) - m_gamma * ( 1.0 - cos( x ) ); } double m_gamma; };
В принципе, это все. Обратите внимание, что приведенный выше код далеко не оптимальный. Лучшая производительность может быть достигнута, если каждое взаимодействие рассчитывается только один раз и используются итераторы для столбцов и строк. Ниже приведены некоторые визуализации эволюции этого уравнения решетки.
Полный cpp для этого примера можно найти здесьtwo_dimensional_phase_lattice.cpp.
Статья Using matrices as state types раздела Chapter 1. Boost.Numeric.Odeint Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |