[content] Add 2 SLE methods. Refactor
This commit is contained in:
parent
267497e79c
commit
eef44ba60d
154
main.tex
154
main.tex
@ -58,6 +58,7 @@
|
||||
непрерывна, то обязательно найдется такое \(x_k \in (a,b)\), что
|
||||
\(F(x_k) = 0\) либо \(|F(x_k)| < \varepsilon\), где \(\varepsilon\)
|
||||
--- погрешность искомого решения.
|
||||
|
||||
\subsection{Метод деления отрезка пополам}
|
||||
Данный метод использует технику поиска решения, похожую на бинарный
|
||||
поиск.
|
||||
@ -219,7 +220,14 @@
|
||||
\end{itemize}
|
||||
\item \(disp\) --- bool, необязательный
|
||||
|
||||
Если \verb|True| и алгоритм не сошелся, будет сгенерировано исключение \verb|RuntimeError|, с сообщением, содержащим количество итераций и текущее значение функции. В противном случае статус сходимости записывается в возвращаемый объект \verb|RootResults|. Игнорируется, если \verb|x0| не является скалярным. Примечание: это не имеет ничего общего с отображением, однако ключевое слово \verb|disp| нельзя переименовать для сохранения обратной совместимости.
|
||||
Если \verb|True| и алгоритм не сошелся, будет сгенерировано
|
||||
исключение \verb|RuntimeError|, с сообщением, содержащим
|
||||
количество итераций и текущее значение функции. В противном
|
||||
случае статус сходимости записывается в возвращаемый объект
|
||||
\verb|RootResults|. Игнорируется, если \verb|x0| не является
|
||||
скалярным. Примечание: это не имеет ничего общего с
|
||||
отображением, однако ключевое слово \verb|disp| нельзя
|
||||
переименовать для сохранения обратной совместимости.
|
||||
\end{enumerate}
|
||||
|
||||
\subsection{Метод простой итерации}
|
||||
@ -229,7 +237,8 @@
|
||||
Уравнение \(F(x)=0\) приводим к виду \(x = \varphi(x)\), например
|
||||
\(x-F(x)/M\), где \(M\) --- константа.
|
||||
|
||||
Условие сходимости алгоритма: \(0<|\varphi'(x)|<1\). Исходя из него, \(M\) определяется как \(M=1.01*F'(x_0)\), где \(x_0\) ---
|
||||
Условие сходимости алгоритма: \(0<|\varphi'(x)|<1\). Исходя из него,
|
||||
\(M\) определяется как \(M=1.01 \cdot F'(x_0)\), где \(x_0\) ---
|
||||
начальное приближение.
|
||||
|
||||
Таким образом, для итерации \(i, i = 1\dots k,\)
|
||||
@ -242,17 +251,150 @@
|
||||
В библиотеках numpy, scipy не найдено реализаций данного метода.
|
||||
|
||||
\section{Методы решения систем линейных алгебраических уравнений}
|
||||
Система линейных алгебраических (далее, СЛУ) уравнений имеет вид
|
||||
\begin{eqnarray}
|
||||
\left\{
|
||||
\begin{aligned}
|
||||
& a_{11}x_1 + a_{12}x_2 + a_{1n}x_n = b_1 \\
|
||||
& a_{21}x_1 + a_{22}x_2 + a_{2n}x_n = b_2 \\
|
||||
& ........................................ \\
|
||||
& a_{n1}x_1 + a_{n2}x_2 + a_{nn}x_n = b_n \\
|
||||
\end{aligned}
|
||||
\right.
|
||||
\label{formula:eqn_system}
|
||||
\end{eqnarray}
|
||||
|
||||
Для решения таких систем существуют прямые и итерационные методы.
|
||||
Прямые методы (к ним относятся "метод Гаусса", "метод обратной матрицы"
|
||||
и "метод прогонки") позволяют получить решение за конечное количество
|
||||
операций, точность которого ограничивается лишь погрешностью округления.
|
||||
Итерационные методы (среди которых есть методы, такие как
|
||||
"метод простой итерации" и "метод Зейделя") позволяют получить
|
||||
приближенное решение с помощью последовательного приближения к точному.
|
||||
|
||||
\subsection{Метод Гаусса}
|
||||
TODO
|
||||
\subsubsection{Описание метода}
|
||||
TODO
|
||||
Для решения СЛУ система (\ref{formula:eqn_system}) приводится к
|
||||
треугольному виду (\ref{formula:triag_eqn_system}) с помощью цепочки элементарных преобразований.
|
||||
\begin{eqnarray}
|
||||
\left\{
|
||||
\begin{aligned}
|
||||
& a'_{11}x_1 + a'_{12}x_2 + a'_{1n}x_n = b'_1 \\
|
||||
& 0x_1 + a'_{22}x_2 + a'_{2n}x_n = b'_2 \\
|
||||
& ........................................ \\
|
||||
& 0x_1 + 0x_2 + a'_{nn}x_n = b'_n \\
|
||||
\end{aligned}
|
||||
\right.
|
||||
\label{formula:triag_eqn_system}
|
||||
\end{eqnarray}
|
||||
Данный процесс называется прямым ходом, а нахождение неизвестных
|
||||
\(x_n, x_{n-1}, \dots,x_1 \) --- обратным.
|
||||
\subsubsection{Реализации метода в библиотеках numpy, scipy}
|
||||
В библиотеке scipy реализован частный случай метода Гаусса ---
|
||||
LU-разложение \cite[с. 259]{book:levitin}. Для получения решения
|
||||
СЛУ необходимо задействовать две функции из модуля \textbf{scipy.linalg} \cite{links:scipy_doc}:
|
||||
\begin{enumerate}
|
||||
\item Для получения разложения используется функция
|
||||
\textbf{lu\_factor}.
|
||||
\item Для совершения обратного хода алгоритма используется
|
||||
\textbf{lu\_solve}, которая принимает на вход разложение с
|
||||
предыдущего этапа.
|
||||
\end{enumerate}
|
||||
|
||||
Функция \textbf{lu\_factor} имеет следующие параметры (задаются в порядке перечисления):
|
||||
\begin{enumerate}
|
||||
\item \(a\) --- (M, N) array\_like
|
||||
|
||||
Матрица для разложения
|
||||
\item \(overwrite\_a\) bool, необязательный
|
||||
|
||||
Следует ли перезаписывать данные в A (может повысить
|
||||
производительность). По умолчанию \verb|False|.
|
||||
\item \(check\_finite\) bool, необязательный
|
||||
|
||||
Проверять, содержит ли входная матрица только конечные числа.
|
||||
Отключение может дать прирост производительности, но может
|
||||
привести к проблемам (сбоям, незавершению), если входные данные
|
||||
содержат бесконечности или NaN. По умолчанию \verb|True|.
|
||||
\end{enumerate}
|
||||
|
||||
Функция \textbf{lu\_solve} имеет следующие параметры (задаются в порядке перечисления):
|
||||
\begin{enumerate}
|
||||
\item \((lu, piv)\) --- tuple
|
||||
|
||||
Факторизация матрицы коэффициентов a, полученная из
|
||||
\textbf{lu\_factor}.
|
||||
\item \(b\) --- array
|
||||
|
||||
Правая сторона
|
||||
\item \(trans\) --- {0, 1, 2}, необязательный
|
||||
|
||||
Тип системы, которую необходимо решить:
|
||||
|
||||
\begin{tabularx}{0.8\textwidth}{|X|X|}
|
||||
\hline \(trans\) & вид системы \\
|
||||
\hline 0 & \(ax = b\) \\
|
||||
\hline 1 & \(a^T x = b\) \\
|
||||
\hline 2 & \(a^H x = b\) \\
|
||||
\hline
|
||||
\end{tabularx}\\
|
||||
|
||||
По умолчанию \verb|0|.
|
||||
\item \(overwrite\_b\) --- bool, необязательный
|
||||
|
||||
Следует ли перезаписывать данные в \(b\) (может повысить производительность). По умолчанию \verb|False|.
|
||||
\item \(check\_finite\) --- bool, необязательный
|
||||
|
||||
Проверять, содержат ли входные матрицы только конечные числа.
|
||||
Отключение может дать прирост производительности, но может
|
||||
привести к проблемам (сбоям, незавершению), если входные данные
|
||||
содержат бесконечности или NaN. По умолчанию \verb|True|.
|
||||
\end{enumerate}
|
||||
|
||||
\subsection{Метод обратной матрицы}
|
||||
TODO
|
||||
\subsubsection{Описание метода}
|
||||
TODO
|
||||
Исходная система (\ref{formula:eqn_system}) представляется в форме
|
||||
\(AX=B\), тогда вектор неизвестных переменных \(X\) определяется по
|
||||
формуле (\ref{formula:inv_m_method}).
|
||||
\begin{equation}
|
||||
X=A^{-1}B
|
||||
\label{formula:inv_m_method}
|
||||
\end{equation}
|
||||
\subsubsection{Реализации метода в библиотеках numpy, scipy}
|
||||
Отдельной функции для решения СЛУ не существует, вектор \(X\) можно
|
||||
найти по формуле (\ref{formula:inv_m_method}). Для получения \(A^{-1}\)
|
||||
существует функция \textbf{inv} в модуле \textbf{scipy.linalg}
|
||||
\cite{links:scipy_doc} библиотеки scipy, и функция \textbf{inv} в модуле
|
||||
\textbf{numpy.linalg} библиотеки numpy. Для перемножения \(A^{-1}\)
|
||||
и \(B\) в языке Python есть оператор \verb|@|, начиная с версии \(3.5\)
|
||||
\cite{links:numpy_doc}\cite{links:PEP465}.
|
||||
|
||||
В результате для получения решения СЛУ необходимо выполнить выражение
|
||||
\verb|inv(A) @ B|, используя одну из вышеописанных функций.
|
||||
|
||||
Функция \textbf{inv} модуля \textbf{scipy.linalg} имеет следующие
|
||||
параметры (задаются в порядке перечисления):
|
||||
\begin{enumerate}
|
||||
\item \(a\) --- array\_like
|
||||
|
||||
Квадратная матрица, которую необходимо инвертировать.
|
||||
\item \(overwrite\_a\) --- bool, необязательный
|
||||
|
||||
Не запоминать состояние \(a\) (может улучшить
|
||||
производительность). По умолчанию \verb|False|.
|
||||
\item \(check\_finite\) --- bool, необязательный
|
||||
|
||||
Проверять, содержат ли входные матрицы только конечные числа.
|
||||
Отключение может дать прирост производительности, но может
|
||||
привести к проблемам (сбоям, незавершению), если входные данные
|
||||
содержат бесконечности или NaN. По умолчанию \verb|True|.
|
||||
\end{enumerate}
|
||||
|
||||
Функция \textbf{inv} модуля \textbf{scipy.linalg} имеет следующие
|
||||
параметры (задаются в порядке перечисления):
|
||||
\begin{enumerate}
|
||||
\item \(a\) --- аналогичен параметру \(a\) функции из модуля \textbf{scipy.linalg}.
|
||||
\end{enumerate}
|
||||
|
||||
\subsection{Метод прогонки}
|
||||
TODO
|
||||
|
Loading…
Reference in New Issue
Block a user