Add method description, Update theory
This commit is contained in:
parent
a34f5fcb46
commit
ef528d67d8
110
main.tex
110
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{Экспериментальное исследование возможностей библиотек}
|
||||
|
||||
|
||||
|
@ -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}
|
||||
|
Loading…
Reference in New Issue
Block a user