Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Using matrices as state types

Boost , Chapter 1. Boost.Numeric.Odeint , Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost C++ LibrariesHomeLibrariesPeopleFAQMore

PrevUpHomeNext

одеинт хорошо работает с различными типами состояний. Он не ограничивается чисто векторными типами, такими как<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;
};

В принципе, это все. Обратите внимание, что приведенный выше код далеко не оптимальный. Лучшая производительность может быть достигнута, если каждое взаимодействие рассчитывается только один раз и используются итераторы для столбцов и строк. Ниже приведены некоторые визуализации эволюции этого уравнения решетки.

phase_lattice_2d_0000phase_lattice_2d_0100phase_lattice_2d_1000

Полный cpp для этого примера можно найти здесьtwo_dimensional_phase_lattice.cpp.


PrevUpHomeNext

Статья Using matrices as state types раздела Chapter 1. Boost.Numeric.Odeint Tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:11:10/0.0086719989776611/1