![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Complex state typesBoost , Chapter 1. Boost.Numeric.Odeint , Tutorial
|
![]() | Home | Libraries | People | FAQ | More |
До сих пор мы видели несколько примеров, определенных для реальных значений. Одеинт может обрабатывать сложные типы состояний, следовательно, ОДЭ, которые также определяются на сложных векторных пространствах. Примером может служить осциллятор Стюарта-Ландау.
гдеи #936;иi— сложная переменная. Определение этого ODE в C++ с использованием complex< double>в качестве типа состояния может выглядеть следующим образом:
typedef complex< double > state_type; struct stuart_landau { double m_eta; double m_alpha; stuart_landau( double eta = 1.0 , double alpha = 1.0 ) : m_eta( eta ) , m_alpha( alpha ) { } void operator()( const state_type &x , state_type &dxdt , double t ) const { const complex< double > I( 0.0 , 1.0 ); dxdt = ( 1.0 + m_eta * I ) * x - ( 1.0 + m_alpha * I ) * norm( x ) * x; } };
Можно также использовать функцию вместо функтора для ее реализации.
double eta = 1.0; double alpha = 1.0; void stuart_landau( const state_type &x , state_type &dxdt , double t ) { const complex< double > I( 0.0 , 1.0 ); dxdt = ( 1.0 + m_eta * I ) * x - ( 1.0 + m_alpha * I ) * norm( x ) * x; }
Настоятельно рекомендуем использовать первый ансамбль. В этом случае вы имеете явный контроль над параметрами системы и не ограничены использованием глобальных переменных для параметризации осциллятора.
При выборе степперного типа необходимо учитывать «необычный» тип состояния: он является единичным<complex<double>
>в отличие от векторных типов, используемых в предыдущих примерах. Это означает, что никакие итерации по векторным элементам не должны выполняться внутри алгоритма. Odeint уже обнаруживает это и автоматически использует<vector_space_algebra
>для вычислений. Вы можете применить это, предоставив дополнительные аргументы шаблона для степпера, включая<vector_space_algebra
>. Подробности об использовании алгебр можно найти в разделеАдаптация собственных типов состояний.
state_type x = complex< double >( 1.0 , 0.0 ); const double dt = 0.1; typedef runge_kutta4< state_type > stepper_type; integrate_const( stepper_type() , stuart_landau( 2.0 , 1.0 ) , x , 0.0 , 10.0 , dt , streaming_observer( cout ) );
Статья Complex state types раздела Chapter 1. Boost.Numeric.Odeint Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |