Files
pip/libs/main/math/pimathsolver.h

157 lines
7.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! \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 <http://www.gnu.org/licenses/>.
*/
#ifndef PIMATHSOLVER_H
#define PIMATHSOLVER_H
#include "pimathmatrix.h"
//! \~english Differential evaluations
//! \~russian Дифференциальные вычисления
//! \~english Transfer function representation
//! \~russian Представление передаточной функции
struct PIP_EXPORT TransferFunction {
PIVector<double> 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<PIMathVectord> F;
PIVector<double> 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