//! \addtogroup Math //! \{ //! \file pimathsolver.h //! \brief //! \~english Mathematical solver for differential equations //! \~russian Математический решатель дифференциальных уравнений //! \details //! \~english Solver for ordinary differential equations using various numerical methods //! \~russian Решатель обыкновенных дифференциальных уравнений с использованием различных численных методов //! \} /* PIP - Platform Independent Primitives PIMathSolver Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PIMATHSOLVER_H #define PIMATHSOLVER_H #include "pimathmatrix.h" //! \~english Differential evaluations //! \~russian Дифференциальные вычисления //! \~english Transfer function representation //! \~russian Представление передаточной функции struct PIP_EXPORT TransferFunction { PIVector vector_Bm, vector_An; }; //! \~english Mathematical solver for differential equations //! \~russian Математический решатель дифференциальных уравнений class PIP_EXPORT PIMathSolver { public: //! \~english Solving methods for differential equations //! \~russian Методы решения дифференциальных уравнений enum Method { Global = -1, //!< \~english Use global method //! \~russian Использовать глобальный метод Eyler_1 = 01, //!< \~english Euler method (first order) //! \~russian Метод Эйлера (1-й порядок) Eyler_2 = 02, //!< \~english Euler method (second order) //! \~russian Метод Эйлера (2-й порядок) EylerKoshi = 03, //!< \~english Euler-Cauchy method //! \~russian Метод Эйлера-Коши RungeKutta_4 = 14, //!< \~english Runge-Kutta 4th order //! \~russian Метод Рунге-Кутта 4-го порядка AdamsBashfortMoulton_2 = 22, //!< \~english Adams-Bashforth-Moulton 2nd order //! \~russian Метод Адамса-Башфорта-Мултона 2-го порядка AdamsBashfortMoulton_3 = 23, //!< \~english Adams-Bashforth-Moulton 3rd order //! \~russian Метод Адамса-Башфорта-Мултона 3-го порядка AdamsBashfortMoulton_4 = 24, //!< \~english Adams-Bashforth-Moulton 4th order //! \~russian Метод Адамса-Башфорта-Мултона 4-го порядка PolynomialApproximation_2 = 32, //!< \~english Polynomial approximation 2nd order //! \~russian Метод полиномиальной аппроксимации 2-го порядка PolynomialApproximation_3 = 33, //!< \~english Polynomial approximation 3rd order //! \~russian Метод полиномиальной аппроксимации 3-го порядка PolynomialApproximation_4 = 34, //!< \~english Polynomial approximation 4th order //! \~russian Метод полиномиальной аппроксимации 4-го порядка PolynomialApproximation_5 = 35 //!< \~english Polynomial approximation 5th order //! \~russian Метод полиномиальной аппроксимации 5-го порядка }; //! Constructs an empty solver PIMathSolver(); //! \~english Solve differential equation at point u with step h //! \~russian Решить дифференциальное уравнение в точке u с шагом h void solve(double u, double h); //! Initialize from transfer function //! \~english Set up solver from transfer function coefficients //! \~russian Инициализировать решатель из коэффициентов передаточной функции void fromTF(const TransferFunction & TF); //! Set solving method //! \~english Set numerical method for solving //! \~russian Установить численный метод решения void setMethod(Method m) { method = m; } //! Set simulation time //! \~english Set simulation time //! \~russian Установить время моделирования void setTime(double time); //! \~english Solve using Euler method (1st order) //! \~russian Решение методом Эйлера (1-й порядок) void solveEyler1(double u, double h); //! \~english Solve using Euler method (2nd order) //! \~russian Решение методом Эйлера (2-й порядок) void solveEyler2(double u, double h); //! \~english Solve using Runge-Kutta 4th order //! \~russian Решение методом Рунге-Кутта 4-го порядка void solveRK4(double u, double h); //! \~english Solve using Adams-Bashforth-Moulton 2nd order //! \~russian Решение методом Адамса-Башфорта-Мултона 2-го порядка void solveABM2(double u, double h); //! \~english Solve using Adams-Bashforth-Moulton 3rd order //! \~russian Решение методом Адамса-Башфорта-Мултона 3-го порядка void solveABM3(double u, double h); //! \~english Solve using Adams-Bashforth-Moulton 4th order //! \~russian Решение методом Адамса-Башфорта-Мултона 4-го порядка void solveABM4(double u, double h); //! \~english Solve using polynomial approximation //! \~russian Решение методом полиномиальной аппроксимации void solvePA(double u, double h, uint deg); //! \~english Solve using polynomial approximation 2nd order //! \~russian Решение методом полиномиальной аппроксимации 2-го порядка void solvePA2(double u, double h); //! \~english Solve using polynomial approximation 3rd order //! \~russian Решение методом полиномиальной аппроксимации 3-го порядка void solvePA3(double u, double h); //! \~english Solve using polynomial approximation 4th order //! \~russian Решение методом полиномиальной аппроксимации 4-го порядка void solvePA4(double u, double h); //! \~english Solve using polynomial approximation 5th order //! \~russian Решение методом полиномиальной аппроксимации 5-го порядка void solvePA5(double u, double h); //! \~english Solution vector //! \~russian Вектор решения PIMathVectord X; //! \~english Global default method //! \~russian Глобальный метод по умолчанию static Method method_global; //! \~english Description of available methods //! \~russian Описание доступных методов static const char methods_desc[]; private: void moveF(); PIMathMatrixd A, M; PIMathVectord d, a1, b1; PIMathVectord k1, k2, k3, k4, xx; PIMathVectord XX, Y, pY; PIVector F; PIVector times; uint size = 0, step = 0; Method method = Global; double sum = 0., td = 0., ct = 0., lp = 0., dh = 0., t = 0., x1 = 0., x0 = 0.; bool ok = false; }; #endif // PIMATHSOLVER_H