Skip to content

Высокопроизводительная библиотека на C++ для решения задачи Коши (IVP) 2-го порядка. Реализованы методы: Эйлера, Эйлера с пересчетом, RK2, RK4, и Адамса–Башфорта. Поддерживается адаптивный выбор шага, оценка погрешности (L1, L2, Linf) и визуализация результатов.

Notifications You must be signed in to change notification settings

stonexis/IVPSolverLib

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IVPSolverLib – Библиотека решения задачи Коши 2-го порядка

IVPSolverLib – это библиотека для численного решения задачи Коши (initial value problem) для обыкновенных дифференциальных уравнений второго порядка.

Она позволяет решать уравнения вида $y'' = f (x, y, y')$ с начальными условиями $y(x_0) = q_0$, $y'(x_0) = q_1$ на отрезке $[a, b]$.

В библиотеке реализовано несколько классических как явных, так и неявных методов интегрирования, имеется возможность анализировать погрешность решения при различном шаге сетки и визуализировать полученные численные решения (как функцию, так и ее первую производную) для сравнения методов.

Преимуществом библиотеки является высокая производительность. Так, все методы выполнены с использованием контейнеров с выделением исключительно выровненной (по 64 бита) памяти aligned_alloc() и с доступом к ней assume_aligned , для наибольшей производительности. Так же везде, где в этом есть смысл, реализован параллелизм на уровне данных SIMD-векторизация.

Поддерживаемые численные методы

В текущей версии IVPSolverLib реализованы следующие численные методы решения ОДУ:

  • Метод Эйлера – простой одношаговый явный метод первого порядка точности.
  • Метод Эйлера с пересчётом – метод предиктор-корректор (модифицированный Эйлер) второго порядка точности.
  • Метод Рунге–Кутты 2-го порядка – явная двухслойная схема второго порядка.
  • Метод Рунге–Кутты 4-го порядка – классическая четырехстадийная схема Рунге–Кутты.
  • Явный метод Адамса 3-го порядка – трехшаговая схема Адамса–Башфорта третьего порядка точности.

Каждый из этих методов может быть выбран для решения задачи через единый интерфейс библиотеки. Это позволяет сравнивать их между собой по точности и производительности на различных задачах.

Анализ погрешности численного решения

Одной из возможностей IVPSolverLib является оценка точности методов путем сравнения решений на разных шагах сетки. Пользователь может вычислить решение при шаге h, а затем повторить расчет при шаге 2h (более грубая сетка) и h/2 (более плотная сетка). Библиотека позволит автоматически сравнить полученные результаты и оценить абсолютные и относительные отклонения решения на шаге h относительно решений на шагах 2h и h/2.

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

Общая сигнатура методов

Методы можно вызывать через общий хаб, как для адаптивного шага integrate_adaptive, так и для фиксированного integrate_freeze

Основные методы интегрирования

template<std::size_t ExpDim, class Span, class Rhs, class Kernel> ReturnBuffer<Span> integrate_adaptive( const Rhs& F, typename Span::Scalar a, typename Span::Scalar b, typename Span::Scalar q0, typename Span::Scalar q1, typename Span::Scalar eps_tol, Kernel&& kernel ) 

Здесь:

  • ExpDim - предполагаемое количество узлов для достижение требуемой точности (чем ближе к оптимальному числу, тем быстрее алгоритм)
  • Span - предпочитаемый view-контейнер
  • Rhs - формат правой части уравнения (например лямбда функция)
  • Kernel - ядро интегрирования (EulerStepper, EulerRecountStepper, RK2Stepper, RK4Stepper, AdamsStepper)
template<class Span, class Rhs, class Kernel> ReturnBuffer<Span> integrate_freeze( const Rhs& F, typename Span::Scalar a, typename Span::Scalar b, typename Span::Scalar q0, typename Span::Scalar q1, Kernel&& kernel, std::size_t grid_size ) 

Здесь:

  • Span - предпочитаемый view-контейнер
  • Rhs - формат правой части уравнения (например лямбда функция)
  • Kernel - ядро интегрирования (EulerStepper, EulerRecountStepper, RK2Stepper, RK4Stepper, AdamsStepper)

Помимо методов вычислений, библиотека предлагает методы анализа полученных решений

  • write_norms_table() Вывод таблицы норм разности решений
  • write_data_to_json_file() Запись решения в json файл, для дальнейшей визуализации при помощи matplotlib,seaborn, etc

Пример использования

#include <cmath> #include "odesolver.hpp" #include "utils.hpp" using namespace std; int main(){ //ДУ auto rhs = [](double x, double y1, double y2){return y2 * cos(x) + y1 * sqrt(x + 1) + pow(x,2) - 1;}; double q0 = -4.7, q1 = 4.2; double a = 0.0, b = 1.0; //Требуемая точность double tol = 1e-5; using KernelTRK2 = ode::RK2Stepper<ali_span<double>, decltype(rhs)>; //Создание ядра интегрирования KernelTRK2 rk2; //Результат формата (x, y, y', success) auto Result_rk2 = ode::integrate_adaptive<101, ali_span<double>>(rhs, a, b, q0, q1, tol, rk2); ode::compare_results<ali_span<double>>(rhs, a, b, q0, q1, rk2, opt_N_rk2, "rk2", "norms_table.csv", false); write_data_to_json_file( "data.json", make_pair(Result_rk2.x(), "rk2_x"), make_pair(Result_rk2.y1(), "rk2_y1"), make_pair(Result_rk2.y2(), "rk2_y2"), ); return 0; } 

About

Высокопроизводительная библиотека на C++ для решения задачи Коши (IVP) 2-го порядка. Реализованы методы: Эйлера, Эйлера с пересчетом, RK2, RK4, и Адамса–Башфорта. Поддерживается адаптивный выбор шага, оценка погрешности (L1, L2, Linf) и визуализация результатов.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published