From eef44ba60da781d48e39bb917e8017124f675385 Mon Sep 17 00:00:00 2001 From: AVAtarMod Date: Sat, 19 Aug 2023 19:38:13 +0300 Subject: [PATCH] [content] Add 2 SLE methods. Refactor --- main.tex | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 148 insertions(+), 6 deletions(-) diff --git a/main.tex b/main.tex index 046af9d..d3945ae 100644 --- a/main.tex +++ b/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