[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)\), что
|
непрерывна, то обязательно найдется такое \(x_k \in (a,b)\), что
|
||||||
\(F(x_k) = 0\) либо \(|F(x_k)| < \varepsilon\), где \(\varepsilon\)
|
\(F(x_k) = 0\) либо \(|F(x_k)| < \varepsilon\), где \(\varepsilon\)
|
||||||
--- погрешность искомого решения.
|
--- погрешность искомого решения.
|
||||||
|
|
||||||
\subsection{Метод деления отрезка пополам}
|
\subsection{Метод деления отрезка пополам}
|
||||||
Данный метод использует технику поиска решения, похожую на бинарный
|
Данный метод использует технику поиска решения, похожую на бинарный
|
||||||
поиск.
|
поиск.
|
||||||
@ -219,7 +220,14 @@
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
\item \(disp\) --- bool, необязательный
|
\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}
|
\end{enumerate}
|
||||||
|
|
||||||
\subsection{Метод простой итерации}
|
\subsection{Метод простой итерации}
|
||||||
@ -229,7 +237,8 @@
|
|||||||
Уравнение \(F(x)=0\) приводим к виду \(x = \varphi(x)\), например
|
Уравнение \(F(x)=0\) приводим к виду \(x = \varphi(x)\), например
|
||||||
\(x-F(x)/M\), где \(M\) --- константа.
|
\(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,\)
|
Таким образом, для итерации \(i, i = 1\dots k,\)
|
||||||
@ -242,17 +251,150 @@
|
|||||||
В библиотеках numpy, scipy не найдено реализаций данного метода.
|
В библиотеках numpy, scipy не найдено реализаций данного метода.
|
||||||
|
|
||||||
\section{Методы решения систем линейных алгебраических уравнений}
|
\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{Метод Гаусса}
|
\subsection{Метод Гаусса}
|
||||||
TODO
|
|
||||||
\subsubsection{Описание метода}
|
\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}
|
\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{Метод обратной матрицы}
|
\subsection{Метод обратной матрицы}
|
||||||
TODO
|
|
||||||
\subsubsection{Описание метода}
|
\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}
|
\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{Метод прогонки}
|
\subsection{Метод прогонки}
|
||||||
TODO
|
TODO
|
||||||
|
Loading…
Reference in New Issue
Block a user