diff --git a/main.tex b/main.tex index 42d98cb..9308a7e 100644 --- a/main.tex +++ b/main.tex @@ -1,6 +1,9 @@ \input{vars} \input{config} +\NewDocumentCommand{\MFArgs} + {}{x^{(p)}_1,x^{(p)}_2,x^{(p)}_3,\dots,x^{(p)}_n} + \begin{document} \lstset{language=[11]C++} @@ -590,7 +593,7 @@ LU-разложение \cite[с. 259]{book:levitin}. Для получения \subsubsection{Описание метода} Для матрицы СЛУ (\ref{formula:eqn_matrix_system}) размеров \(n \times n\), и начального приближения \(x^{(0)}\) приближенное -решение на итерации \(p, p = 1,2,3,\dots,k,k+1\) вычисляется по +решение на итерации \(p, p = 1,2,3,\dots,k\) вычисляется по следующей формуле: \begin{equation*} x^{(p+1)}_i = \frac{1}{a_{ii}} @@ -604,7 +607,7 @@ LU-разложение \cite[с. 259]{book:levitin}. Для получения \ref{formula:eqn_diag_dominant}). Заданная точность достигается при выполнении условия: \begin{equation} - \max_i |x^{(p+1)}_i-x^{(p)_i}| < \varepsilon + \max_{i \le i \le n} |x^{(p+1)}_i-x^{(p)}_i| < \varepsilon \label{formula:precision_iter_sle} \end{equation} \subsubsection{Реализации метода в библиотеках numpy, scipy} @@ -614,7 +617,7 @@ LU-разложение \cite[с. 259]{book:levitin}. Для получения \subsubsection{Описание метода} Для матрицы СЛУ (\ref{formula:eqn_matrix_system}) размеров \(n \times n\), и начального приближения \(x^{(0)}\) приближенное -решение на итерации \(p, p = 1,2,3,\dots,k,k+1\) вычисляется по +решение на итерации \(p, p = 1,2,3,\dots,k\) вычисляется по следующей формуле: \begin{equation*} x^{(p+1)}_i = \frac{1}{a_{ii}} @@ -669,26 +672,123 @@ LU-разложение \cite[с. 259]{book:levitin}. Для получения x^{(p+1)}_{i} = f_i(x^{(p)}_1,x^{(p)}_2,\dots,x^{(p)}_n); \quad i=1,2,3,\dots,n \end{equation} -где \(p, p = 1,2,3,\dots,k,k+1\) --- номер итерации. +где \(p, p = 1,2,3,\dots,k\) --- номер итерации. Заданная точность \(\varepsilon\) достигается выполнением следующего условия: \begin{equation*} - \forall i = 1,2,3,\dots,n;\ - \max_i |x^{(k+1)}_i - x^{(k)}_i | < \varepsilon + \max_i |x^{(p+1)}_i - x^{(p)}_i | < \varepsilon; \quad + i = 1,2,3,\dots,n \end{equation*} \subsubsection{Реализации метода в библиотеках numpy, scipy} Реализаций данного метода в библиотеках numpy, scipy не найдено. \subsection{Метод Зейделя для систем нелинейных уравнений} +Данный метод является модификацией предыдущего; отличие состоит в +условии сходимости и формуле получения приближенного решения. + +Ниже будут описаны только вышеперечисленные различия. \subsubsection{Описание метода} +Формула вычисления приближенного решения данного алгоритма следующая: +\begin{equation*} + \begin{aligned} + & x^{(p+1)}_{1} = f_1(x^{(p)}_1,x^{(p)}_2,\dots,x^{(p)}_n) \\ + & x^{(p+1)}_{2} = f_2(x^{(p)}_1,x^{(p)}_2,\dots,x^{(p)}_n) \\ + & \dots\dots\dots\dots\dots\dots\dots\dots\dots \\ + & x^{(p+1)}_{n} = f_n(x^{(p)}_1,x^{(p)}_2,\dots,x^{(p)}_n) \\ + \end{aligned} +\end{equation*} +где \(p, p = 1,2,3,\dots,k\) --- номер итерации. + +Данный алгоритм более требователен к точности начального приближения. + +Сходимость метода зависит от характера функций исходной системы, +для определения которого необходимо вычислить значения матрицы +\begin{equation} + F' = \left( + \begin{aligned} + & f^{'}_{11} \ \ f^{'}_{12} \ \ f^{'}_{13} \ \ \dots \ \ f^{'}_{1n} \\ + & f^{'}_{21} \ \ f^{'}_{22} \ \ f^{'}_{23} \ \ \dots \ \ f^{'}_{2n} \\ + & \dots \ \ \dots \ \ \dots \ \ \dots \ \ \dots \\ + & f^{'}_{n1} \ \ f^{'}_{n2} \ \ f^{'}_{n3} \ \ \dots \ \ f^{'}_{nn} \\ + \end{aligned} + \right) +\end{equation} +где \(f^{'}_{ij} = \frac{\partial f_i}{\partial x_j}\). + +Сходимость метода обеспечивается выполнением следующего условия: +\vspace{-5mm} +\begin{equation*} + |f^{'}_{i1}| + |f^{'}_{i2}| + |f^{'}_{i3}| + \dots |f^{'}_{in}| < 1; + \quad i = 1,2,3,\dots,n +\end{equation*} + \subsubsection{Реализации метода в библиотеках numpy, scipy} +Реализаций данного метода в библиотеках numpy, scipy не обнаружено. \subsection{Метод Ньютона решения систем нелинейных уравнений} \subsubsection{Описание метода} +На каждой итерации \(p, p = 1,2,3,\dots,k\) вычисляются значения +\(\Delta x^{(p)}_1, \Delta x^{(p)}_2, \Delta x^{(p)}_3, \dots, +\Delta x^{(p)}_n \). + +Для этого исходная система уравнений раскладывается в ряд Тейлора по +\(\Delta x^{(p)}_1, \Delta x^{(p)}_2, \Delta x^{(p)}_3, \dots, +\Delta x^{(p)}_n \). Сохранив линейные по данным значениям части, получим +СЛУ: +\begin{equation} + \begin{aligned} + & \splitdfrac{\frac{\partial F_1(\MFArgs)}{\partial x_1} \Delta x^{(p)}_1 + + \frac{\partial F_1(\MFArgs)}{\partial x_2} \Delta x^{(p)}_2 + \dots +} + {\frac{\partial F_1(\MFArgs)}{\partial x_n} \Delta x^{(p)}_n = -F_1(\MFArgs)} \\ + & \splitdfrac{\frac{\partial F_2(\MFArgs)}{\partial x_1} \Delta x^{(p)}_1 + + \frac{\partial F_2(\MFArgs)}{\partial x_2} \Delta x^{(p)}_2 + \dots +} + {\frac{\partial F_2(\MFArgs)}{\partial x_n} \Delta x^{(p)}_n = -F_2(\MFArgs)} \\ + & \dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots \\ + & \splitdfrac{\frac{\partial F_n(\MFArgs)}{\partial x_1} \Delta x^{(p)}_1 + + \frac{\partial F_n(\MFArgs)}{\partial x_2} \Delta x^{(p)}_2 + \dots +} + {\frac{\partial F_n(\MFArgs)}{\partial x_n} \Delta x^{(p)}_n = -F_n(\MFArgs)} \\ + \end{aligned} + \label{formula:SnLE-Newton-sys} +\end{equation} +Данную систему можно решить любым наиболее подходящим с учетом доступных +ресурсов методом. + +Решением СЛУ (\ref{formula:SnLE-Newton-sys}) будет вектор +\(\Delta X^{(p)} = (\MFArgs)\). После этого, приближенное решение +исходной задачи находится по формуле +\(X^{(p+1)} = X^{(p)} + \Delta X^{(p)}\). + +Заданная точность достигается выполнением условия +(\ref{formula:precision_iter_sle}). Стоит учитывать, что данный метод +так же, как и предыдущий, требователен к точности начального приближения. \subsubsection{Реализации метода в библиотеках numpy, scipy} +Реализаций данного алгоритма в библиотеках numpy, scipy не найдено, +кроме того, для его работы требуется нахождение частных производных. + +Для поиска частной производной в scipy есть функция \textbf{derivative} +в модуле \textbf{scipy.misc}, но она отмечена устаревшей и будет +удалена в версии 1.12.0, поэтому реализация данного метода с помощью +применения функций общей направленности библиотеки рассматриваться +не будет. \section{Аппроксимация функций} +Иногда значения некоторой функциональной зависимости +\(y= \widetilde{y}(x) \) известны для отдельных пар значений +\((x_i,y_i)\). + +Задача восстановления аналитической функции \(\widetilde{y}\) +по отдельным парам значений называется аппроксимацией. +Для получения ее однозначного решения необходимо задать общий вид +функции, включающей коэффициенты, и затем эти коэффициенты определить +с помощью подходящего метода. + +Для определения коэффициентов существует два основных подхода --- +интерполяция (когда \(y_i = \widetilde{x_i}\)), и сглаживание, когда +требуется лишь минимизировать отклонение от известных значений. + +Первые три метода решают поставленную задачу с помощью интерполяции, +последний --- с помощью сглаживания. \subsection{Интерполяционный полином в форме Лагранжа} \subsubsection{Описание метода} \subsubsection{Реализации метода в библиотеках numpy, scipy}