diff --git a/main.tex b/main.tex index 994ec38..5285968 100644 --- a/main.tex +++ b/main.tex @@ -15,7 +15,117 @@ \input{intro} \chapter{Описание численных методов и возможностей библиотек numpy и scipy} +В данном разделе будут описаны численные методы и их доступные +реализации в библиотеках в частях, посвященным классам задач, которые +они решают. +Стоит учитывать, что scipy основан на numpy, поэтому при рассмотрении +возможностей данных библиотек часто может возникнуть ситуация, +когда искомый функционал содержится только в scipy, либо в numpy +или scipy одновременно. + +\section{Численное решение нелинейных уравнений} +При решении некоторых практических задач или проведении исследований +может быть получена математическая модель, которая включает +непрерывную функцию \(F(x), x \in \Re\), и необходимо определить корни уравнения +\(F(x) = 0\). Если данное уравнение не имеет вид \(ax + b = 0\), +где \(a,b\) -- константы, то оно будет нелинейным. + +Для решения нелинейных уравнений существует несколько методов, в данной работе будут рассмотрены итерационные. + +Каждый из итерационных методов, перечисленных ниже, соответствует +следующему алгоритму из двух этапов \cite[с. 15]{book:nm-examples}: +\begin{enumerate} + \item отыскание приближенного значения корня или содержащего + его отрезка; + \item уточнения значения до некоторой степени точности. +\end{enumerate} +Начальное приближение определяется исходя из физических соображений +решений похожих задач или графических методов. Если ни один из этих +способов не доступен или не позволяет получить начальное приближение, +удовлетворяющее требованиям, то применяют следующий алгоритм +отыскания начального приближения: +\begin{enumerate} + \item Производится поиск двух близкорасположенных значений + \(a\) и \(b\) таких, что \(F(a) \cdot F(b) < 0\), при этом + \(F(x)\) должна быть всюду определена на отрезке \([a;b]\). + \item В качестве начального приближения первой итерации принимается + значение \(x_0 \in [a;b]\), обычно это середина данного + отрезка. +\end{enumerate} + +Так как выполняется условие \(F(a) \cdot F(b) < 0\) и \(F(x)\) непрерывна, то обязательно найдется такое \(x_k \in (a,b)\), что \(F(x_k) = 0\) либо \(|F(x_k)| < \epsilon\), где \(\epsilon\) --- погрешность искомого решения. +\subsection{Метод деления отрезка пополам} +Данный метод использует технику поиска решения, похожую на бинарный +поиск. + +\subsubsection{Описание метода} +Дано начальное приближение \(x_0 = (a+b)/2\) при +\(F(a) \cdot F(b) < 0\). Для поиска решения уравнения \(x_k\) +применяем следующий алгоритм: +\begin{enumerate} + \item Рассмотрим отрезки \([a;x_i], [x_i;b]\), \(i = 0 \dots k\) + --- номер итерации. На первой итерации \(i = 0\). \label{list:hls_begin} + \item Из рассмотренных отрезков берем те, что удовлетворяют условию + \(F(a) \cdot F(b) < 0\), где \(a,b\) --- границы отрезка. \label{list:hls_test} + \item Для каждого из взятых в п.\ref{list:hls_test} отрезков + вычисляем их длину \(l\). Если \(l < \epsilon\), + тогда дальнейшее выполнение данного алгоритма для данного + отрезка прекращается. За решение уравнения принимается + число \((a+b)/2\), округленное с учетом заданной погрешности. + Если для решения задачи достаточно любого одного решения, + то работа алгоритма прекращается. + \item Для каждого из взятых в п.\ref{list:hls_test} отрезков + устанавливаем значения + \(a,b,x_{i+1}\). Для левого отрезка эти значения будут равны + \(a = a,b = x_i,x_{i+1} = (a+x_i)/2\), для правого --- + \(a = x_i,b = b,x_{i+1} = (b+x_i)/2\). \label{list:hls_prepare} + \item Для каждого из взятых отрезков переходим к п.\ref{list:hls_begin}, + с увеличением номера итерации на \(1\) и установленными + относительно взятого отрезка значениями из п.\ref{list:hls_prepare}. +\end{enumerate} + +После применение метода на заданных входных данных получим множество +решений уравнения \(Ans = \{x, x \in \Re\}, |Ans| \geq 1\). +\subsubsection{Реализации метода в библиотеках numpy, scipy} +Библиотека scipy содержит функцию \textbf{bisect} из модуля +\textbf{scipy.optimize}\cite{links:scipy_doc}, которая реализует +данный метод. + +Функция имеет следующие параметры (задаются в порядке перечисления): +\begin{enumerate} + \item \(f\) --- function + + Функция Python, возвращающая число. \(f\) должна быть непрерывной, а \(f(a)\) и \(f(b)\) должны иметь противоположные знаки. + + \item \(a\) --- scalar + + Первый конец интервала \([a,b]\). + \item \(b\) --- scalar + + Второй конец интервала \([a,b]\). + \item \(xtol\) --- number, необязательный + + Вычисленный корень \(x0\) будет удовлетворять \verb|np.allclose(x, x0,| \verb|atol=xtol,| \verb|rtol=rtol)|, где \(x\) --- точный корень. Параметр должен быть положительным. + \item \(rtol\) --- number, необязательный + + Вычисленный корень \(x0\) будет удовлетворять \verb|np.allclose(x, x0,| \verb|atol=xtol, rtol=rtol)|, где \(x\) --- точный корень. Параметр не может быть меньше значения по умолчанию \verb|4*np.finfo(float).eps|. + \item \(maxiter\) --- int, необязательный + + Если сходимость не достигается в итерациях \(maxiter\), возникает ошибка. Должен быть \(\geq 0\). + \item \(args\) --- tuple, необязательный + + Содержит дополнительные аргументы для функции \(f\). \(f\) вызывается с помощью \verb|apply(f, (x)+args)|. + \item \(full\_output\) --- bool, необязательный + + Если \(full\_output\) имеет значение \verb|False|, возвращается корень. Если \(full\_output\) имеет значение \verb|True|, возвращаемое значение равно \verb|(x, r)|, где \(x\) --- это корень, а \(r\) --- объект \verb|RootResults|. + \item \(disp\) --- bool, необязательный + + Если \verb|True|, будет сгенерировано исключение \verb|RuntimeError|, если алгоритм не сошелся. В противном случае статус сходимости записывается в возвращаемый объект \verb|RootResults|. +\end{enumerate} + +\subsection{Метод Ньютона (метод касательных)} +\subsection{Метод простой итерации} \chapter{Экспериментальное исследование возможностей библиотек} diff --git a/sources.tex b/sources.tex index b3d75db..066532e 100644 --- a/sources.tex +++ b/sources.tex @@ -1,6 +1,7 @@ \newcommand{\LiteratureAccessDate}[1][1]{% дата~обращения: \ifcase#1\or 03.08.2023% \or 07.08.2023% + \or 09.08.2023% \else\@ctrerr\fi } \renewcommand\bibname{Библиографический список} @@ -13,8 +14,10 @@ 2011. -- 636 с., c илл. -- (Классический университетский учебник). \bibitem{book:lectures} Письменный~Д.~Т. Конспект лекций по высшей математике. 2 часть. -- М.: Рольф, 2000. -- 256 с., с илл. \bibitem{links:numpy} Numpy. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://numpy.org/} (\LiteratureAccessDate[2]). + \bibitem{links:numpy_doc} Numpy API Reference [Электронный ресурс] -- URL:~\url{https://numpy.org/doc/stable/reference/index.html} (\LiteratureAccessDate[3]). \bibitem{links:python} Python. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://www.python.org/} (\LiteratureAccessDate). \bibitem{links:scipy} Scipy. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://scipy.org/} (\LiteratureAccessDate[2]). + \bibitem{links:scipy_doc} Scipy API Reference [Электронный ресурс] -- URL:~\url{https://docs.scipy.org/doc/scipy/reference/index.html} (\LiteratureAccessDate[3]). \bibitem{links:tiobe_index} TIOBE. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://www.tiobe.com/tiobe-index/} (\LiteratureAccessDate). \end{thebibliography}