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

Complex 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

До сих пор мы видели несколько примеров, определенных для реальных значений. Одеинт может обрабатывать сложные типы состояний, следовательно, ОДЭ, которые также определяются на сложных векторных пространствах. Примером может служить осциллятор Стюарта-Ландау.

гдеи #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 ) );


PrevUpHomeNext

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-04 17:24:55/0.0037209987640381/0