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

Integrate functions

Boost , Chapter 1. Boost.Numeric.Odeint , odeint in detail

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++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Интегрированные функции выполняют временную эволюцию данного ОДЭ от некоторого начального времениt0до заданного конечного времениt1и начиная с состоянияx0последующими вызовами функции<do_step>данного степпера. Кроме того, пользователь может предоставить __observer для анализа состояния во время эволюции и<max_step_checker>для исключения, если между вызовами наблюдателя делается слишком много шагов (т.е. слишком маленький размер шага). Существует пять различных интегрирующих функций, которые имеют разные стратегии вызова функции наблюдателя во время интеграции. Все функции интеграции, за исключением<integrate_n_steps>, могут быть вызваны любым степпером, следующим за одним из степперных понятий:Stepper,Error Stepper,Controlled Stepper,Dense Output Stepper. В зависимости от способностей степпера интегрируемые функции используют пошаговый контроль или плотный выход.

Equidistant observer calls

Если требуется вызов наблюдателя с равноудаленными интервалами времениdt, следует использовать функцию<integrate_const>или<integrate_n_steps>. Начнем с объяснения<integrate_const>:

<integrate_const( stepper, system, x0, t0, t1, dt)>

<integrate_const( stepper, system, x0, t0, t1, dt, observer)>

<integrate_const( stepper, system, x0, t0, t1, dt, observer, max_step_checker)>

Они объединяют ODE, данное<system>, с последующими шагами<stepper>. Интеграция начинается с<t0>и<x0>и заканчивается примерноt' = t0+ n dtсnтаким образом, чтоt1- dt< t'<= t1.<x0>изменяется на приблизительное решениеx(t')в конце интеграции. Если дано,<observer>вызывается время от времениt0,t0+ dt,t0+ 2dt, ...,t'. При условии, что<max_step_checker>подсчитывает количество шагов между вызовами наблюдателя и бросает<no_progress_error>, это превышает некоторый предел (по умолчанию: 500).<integrate_const>возвращает количество шагов, выполненных во время интеграции. Обратите внимание, что если вы используете простыеStepperилиError Stepperи хотите сделать ровно<n>шагов, вы должны предпочесть функцию<integrate_n_steps>ниже.

  • Если<stepper>являетсястепперомилистеппером ошибки, то<dt>также является размером шага, используемым для интеграции, и наблюдатель вызывается сразу после каждого шага.
  • Если<stepper>являетсяуправляемым степпером, то<dt>является начальным размером шага. Фактический размер шага будет меняться из-за контроля ошибок во время эволюции. Однако, если наблюдатель обеспечен, размер шага будет отрегулирован таким образом, что алгоритм всегда вычисляетx(t)приt = t0+ n dtи вызывает наблюдателя в этой точке. Обратите внимание, что использованиеControlled Stepperявляется разумным здесь только в том случае, если<dt>значительно больше, чем типичные размеры шагов, используемые степпером.
  • Если<stepper>являетсяплотным выходным шагом, то<dt>является начальным размером шага. Фактический размер шага будет корректироваться во время интеграции из-за управления ошибками. Если наблюдателю предоставлен плотный выход, используется для вычисленияx(t)приt = t0+ n dt.
Integrate a given number of steps

Эта функция очень похожа на<integrate_const>выше. Разница лишь в том, что оно принимает в качестве параметра не конечное время, а количество шагов. Интеграция выполняется до времени<t0+n*dt>.

<integrate_n_steps( stepper, system, x0, t0, dt, n)>

<integrate_n_steps( stepper, system, x0, t0, dt, n,observer)>

<integrate_n_steps( stepper, system, x0, t0, dt, n,observer,max_step_checker)>

Интегрирует ODE, данный<system>, с последующими шагами от<stepper>, начиная сx0иt0. Если дано, то<observer>вызывается после каждого шага и в начале<t0>, как и выше. И снова, если между вызовами наблюдателя выполняется слишком много шагов<max_step_checker>, то он бросает<no_progress_error>. Примерный результат дляx(t0+ n dt )хранится в<x0>. Эта функция возвращает время окончания<t0 +n*dt>.

Observer calls at each step

Если наблюдатель должен вызываться на каждом этапе, то следует использовать функцию<integrate_adaptive>. Обратите внимание, что в случаеКонтролируемый степперилиDense Output Stepperприводит к неэквидистантным вызовам наблюдателя при изменении размера шага.

<integrate_adaptive( stepper, system, x0, t0, t1, dt)>

<integrate_adaptive( stepper, system, x0, t0, t1, dt, observer)>

Для этого необходимо, чтобы<system><stepper>было принято решение. Интеграция начинается на<t0>и<x0>и заканчивается наt1.<x0>изменяется на приблизительное решениеx(t1]в конце интеграции. Если это так, то<observer>называется после каждого шага (и перед первым шагом<t0>).<integrate_adaptive>возвращает количество шагов, выполненных во время интеграции.

[Note] Note

<integrate_adaptive>по замыслу выполняет вызов наблюдателя после каждого шага времени. Следовательно, нет необходимости в<max_step_checker>, поскольку между вызовами наблюдателя выполняется только один шаг.

  • Если<stepper>являетсястепперомилистеппером ошибки, то<dt>- это размер шага, используемый для интеграции, и<integrate_adaptive>ведет себя как<integrate_const>, за исключением того, что для последнего шага размер шага уменьшается, чтобы гарантировать, что мы заканчиваем точно на<t1>. При условии, что наблюдатель вызывается на каждом шаге.
  • Если<stepper>этоКонтролируемый степпер, затем<dt>является начальным размером шага. Фактический размер шага изменяется в соответствии с контролем ошибок шага. Для последнего шага размер шага будет уменьшен, чтобы мы закончили точно на<t1>. При условии, что наблюдатель вызывается после каждого шага времени (и перед первым шагом на<t0>).
  • Если степпер являетсяплотным выходным степпером, то<dt>является начальным размером шага и<integrate_adaptive>ведет себя так же, как дляконтролируемого степперавыше. Плотный выход не используется.
Observer calls at given time points

Если наблюдатель должен быть вызван в определенный момент времени пользователем, следует использовать функцию<integrate_times>. Время вызова наблюдателя предоставляется как последовательность значений времени. Последовательность определяется либо с помощью двух итераторов, указывающих начало и конец последовательности, либо с точки зрения объектаBoost.Range.

<integrate_times( stepper, system, x0, times_start, times_end, dt, observer)>

<integrate_times( stepper, system, x0, time_range, dt, observer)>

Устанавливается<system>с последующими шагами<stepper>. Интеграция начинается в<*times_start>и заканчивается точно в<*(times_end-1)>.<x0>содержит приблизительное решение в конечной точке интеграции. Эта функция требует наблюдателя, который вызывается в последующие времена<*times_start++>до<times_start== times_end>. При вызове сBoost.Range<time_range>функция ведет себя так же с<times_start=boost::begin(time_range )>и<times_end =boost::end( time_range)>. Кроме того, может быть предусмотрена<max_step_checker>, например:

<integrate_times( stepper, system, x0, times_start, times_end, dt, observer, max_step_checker)>

Как указано выше, это приведет к тому, что<no_progress_error>будет выполнено слишком много шагов между вызовами наблюдателя.

<integrate_times>возвращает количество шагов, выполненных во время интеграции.

  • Если<stepper>являетсястепперомилиошибкой, степпер<dt>является размером шага, используемым для интеграции. Однако всякий раз, когда точка времени от последовательности приближается, размер шага<dt>будет уменьшен, чтобы получить состояниеx(t)точно в точке времени.
  • Если<stepper>являетсяуправляемым степпером, то<dt>является начальным размером шага. Фактический размер шага корректируется во время интеграции в соответствии с контролем ошибок. Однако, если точка времени от последовательности приближается, размер шага уменьшается, чтобы получить состояниеx(t)точно в точке времени.
  • Если<stepper>являетсяплотным выходным шагом, то<dt>является начальным размером шага. Фактический размер шага корректируется во время интеграции в соответствии с контролем ошибок. Плотный выход используется для получения состоянийx(t)в точках времени из последовательности.
Convenience integrate function

Дополнительно к сложной функции интеграции выше odeint также обеспечивается простая<integrate>процедура, которая использует плотный выходной степпер на основе<runge_kutta_dopri5>со стандартными границами ошибок10-6для этапов.

<integrate( system, x0, t0, t1, dt)>

<integrate( system, x0, t0, t1, dt, observer)>

Эта функция ведет себя точно так же, как<integrate_adaptive>выше, но не должна быть предусмотрена степпер. Он также возвращает количество шагов, выполненных во время интеграции.


PrevUpHomeNext

Статья Integrate functions раздела Chapter 1. Boost.Numeric.Odeint odeint in detail может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: odeint in detail ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:33:13/0.030940055847168/1