diff --git a/main.tex b/main.tex index d3945ae..e00641b 100644 --- a/main.tex +++ b/main.tex @@ -257,7 +257,7 @@ \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 \\ - & ........................................ \\ + & \dots\dots\dots\dots\dots\dots\dots\dots \\ & a_{n1}x_1 + a_{n2}x_2 + a_{nn}x_n = b_n \\ \end{aligned} \right. @@ -281,7 +281,7 @@ \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 \\ - & ........................................ \\ + & \dots\dots\dots\dots\dots\dots\dots. \\ & 0x_1 + 0x_2 + a'_{nn}x_n = b'_n \\ \end{aligned} \right. @@ -389,6 +389,7 @@ LU-разложение \cite[с. 259]{book:levitin}. Для получения привести к проблемам (сбоям, незавершению), если входные данные содержат бесконечности или NaN. По умолчанию \verb|True|. \end{enumerate} +\vspace{\baselineskip} Функция \textbf{inv} модуля \textbf{scipy.linalg} имеет следующие параметры (задаются в порядке перечисления): @@ -397,106 +398,225 @@ LU-разложение \cite[с. 259]{book:levitin}. Для получения \end{enumerate} \subsection{Метод прогонки} -TODO +Данный метод применяется для решения трехдиагональных матриц \hspace{1mm} вида +\begin{equation} + \left\{ + \begin{aligned} + & a_1 x_0 + b_1 x_1 + c_1 x_2 = d_1 \\ + & a_2 x_1 + b_2 x_2 + c_2 x_3 = d_2 \\ + & \dots\dots\dots\dots\dots\dots\dots \\ + & a_n x_{n-1} + b_n x_n + c_n x_{n+1} = d_n \\ + \end{aligned} + \right. + \label{formula:eqn_banded_system} +\end{equation} + +Является частным случаем метода Гаусса. \subsubsection{Описание метода} -TODO +После исключения переменных ниже главной диагонали с помощью +элементарных преобразований, в каждом уравнении СЛУ остается +\(\leq 2\) неизвестных. В таком случае, формула обратного хода будет +следующей: \(x_i = U_i x_{i+1}+V_i, i = n,n-1,\dots,1\). После замены +\(i\) на \(i-1\) и подстановке выражения в общий вид уравнения из СЛУ +(\ref{formula:eqn_banded_system}) \(a_i x_{i-1} + b_i x_i + c_i x_{i+1}\) +получим следующее выражение: +\begin{equation} + x_i = - \frac{c_i}{a_i U_{i-1} + b_i} x_{i+1} + + \frac{d_i - a_i V_{i-1}}{a_i U_{i-1} + b_i} +\end{equation} +Из которого получим: +\begin{equation} + U_i = - \frac{c_i}{a_i U_{i-1} + b_i}, + V_i = \frac{d_i - a_i V_{i-1}}{a_i U_{i-1} + b_i} + \hspace{1cm} i = 1,2,3,\dots,n +\end{equation} +При этом \( c_n = 0; a_1 = 0\). + +Таким образом, сначала вычисляем \(U_i, V_i\), затем +\(x_i, i =n,n-1,\dots,1\). + +Данный метод в общем случае не устойчив, за исключением случаев, +когда матрица СЛУ обладает свойством диагонального преобладания +(условие \ref{formula:eqn_diag_dominant}) или она положительно +определенная \cite{links:bhatia}. +\begin{equation} + \sum_{i \ne j} |a_{ij}| < |a_{ii}| + \label{formula:eqn_diag_dominant} +\end{equation} + \subsubsection{Реализации метода в библиотеках numpy, scipy} +В scipy для решения СЛУ вида (\ref{formula:eqn_banded_system}) +существует две функции в модуле \textbf{scipy.linalg}: +\textbf{solve\_banded} \cite{links:scipy_doc} и +\textbf{solveh\_banded} \cite{links:scipy_doc}. + +Различие между ними заключается в том, что \textbf{solve\_banded} +не использует метод прогонки, из-за низкой устойчивости метода в общем +случае, что позволяет найти решение даже если матрица не положительно +определенная или не обладает свойством диагонального преобладания. + +\textbf{solveh\_banded} реализует метод прогонки, но авторы библиотеки +указывают, что вводимая матрица должна быть положительно определенной +\cite{links:scipy_doc}. + +Функция \textbf{solve\_banded} имеет следующие параметры (задаются в +порядке перечисления): +\begin{enumerate} + \item \((l, u)\) --- (integer, integer) tuple + + Количество ненулевых нижних и верхних диагоналей. + \item \(ab\) --- (l + u + 1, M) array\_like + + Ленточная матрица. + \item \(b\) --- (M,) or (M, K) array\_like + + Правая сторона. + \item \(overwrite\_ab\) --- bool, необязательный + + Разрешить изменять данные в \(ab\) (может повысить + производительность). По умолчанию \verb|False|. + \item \(overwrite\_b\) --- bool, необязательный + + Разрешить изменять данные в \(b\) (может повысить + производительность). По умолчанию \verb|False|. + \item \(check\_finite\) --- bool, необязательный + + Проверять, содержат ли входные матрицы только конечные числа. + Отключение может дать прирост производительности, но может + привести к проблемам (сбоям, незавершению), если входные данные + содержат бесконечности или NaN. По умолчанию \verb|True|. +\end{enumerate} + +Функция \textbf{solveh\_banded} имеет несколько иной набор параметров +(задаются в порядке перечисления): +\begin{enumerate} + \item \(ab\) --- (u + 1, M) array\_like + + Ленточная матрица, \(u\) --- число верхних диагоналей. + \item \(b\) --- (M,) or (M, K) array\_like + + Правая сторона. + \item \(overwrite\_ab\) --- bool, необязательный + + Разрешить изменять данные в \(ab\) (может повысить + производительность). По умолчанию \verb|False|. + \item \(overwrite\_b\) --- bool, необязательный + + Разрешить изменять данные в \(b\) (может повысить + производительность). По умолчанию \verb|False|. + \item \(lower\) --- bool, необязательный + + Является ли матрица в нижней форме. (По умолчанию используется + верхняя форма), то есть \verb|False|. + \item \(check\_finite\) --- bool, необязательный + + Совпадает с параметром \(check\_finite\) функции + \textbf{solve\_banded}. +\end{enumerate} + +Обе функции принимают матрицу \(ab\) либо в верхней (\textbf{solve\_banded}), либо в нижней форме (\textbf{solveh\_banded} при +включенной опции \(lower\)). Например, для матрицы + +\begin{tabular}[htpb]{ccccc} + 5 & 2 & -1 & 0 & 0 \\ + 1 & 4 & 2 & -1 & 0 \\ + 0 & 1 & 3 & 2 & -1 \\ + 0 & 0 & 1 & 2 & 2 \\ + 0 & 0 & 0 & 1 & 1 \\ +\end{tabular}\\ +верхняя форма будет следующей: + +\begin{tabular}[htpb]{ccccc} + 0 & 0 & -1 & -1 & -1 \\ + 0 & 2 & 2 & 2 & 2 \\ + 5 & 4 & 3 & 2 & 1 \\ + 1 & 1 & 1 & 1 & 0 \\ +\end{tabular} + +Так как данная матрица не эрмитова, и, следовательно, не положительно +определенна, описание нижней формы для нее неуместно. Если взять эрмитову +положительно определенную матрицу + +\begin{tabular}[htpb]{cccccc} + 4 & 2 & -1 & 0 & 0 & 0 \\ + 2 & 5 & 2 & -1 & 0 & 0 \\ + -1 & 2 & 6 & 2 & -1 & 0 \\ + 0 & -1 & 2 & 7 & 2 & -1 \\ + 0 & 0 & -1 & 2 & 8 & 2 \\ + 0 & 0 & 0 & -1 & 2 & 9 \\ +\end{tabular}\\ +то ее нижняя форма будет следующая: + +\begin{tabular}[htpb]{cccccc} + 4 & 5 & 6 & 7 & 8 & 9 \\ + 2 & 2 & 2 & 2 & 2 & 0 \\ + -1 & -1 & -1 & -1 & 0 & 0 \\ +\end{tabular} \subsection{Метод простой итерации (метод Якоби)} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Метод Зейделя} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \section{Численные методы решения систем нелинейных уравнений} -TODO \subsection{Метод простой итерации (метод Якоби) для систем нелинейных уравнений} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Метод Зейделя для систем нелинейных уравнений} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Метод Ньютона решения систем нелинейных уравнений} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \section{Аппроксимация функций} \subsection{Интерполяционный полином в форме Лагранжа} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Интерполяционный полином в форме Ньютона} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Сплайн-интерполяция} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Сглаживание. Метод наименьших квадратов} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \section{Численное интегрирование} \subsection{Метод прямоугольников} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Метод трапеций} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Метод парабол (Симпсона)} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \section{Численное решение обыкновенных дифференциальных уравнений} \subsection{Метод Эйлера} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Модифицированный метод Эйлера} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy} \subsection{Метод Рунге-Кутта} -TODO \subsubsection{Описание метода} -TODO \subsubsection{Реализации метода в библиотеках numpy, scipy}