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}
|
\input{intro}
|
||||||
|
|
||||||
\chapter{Описание численных методов и возможностей библиотек numpy и scipy}
|
\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{Экспериментальное исследование возможностей библиотек}
|
\chapter{Экспериментальное исследование возможностей библиотек}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
\newcommand{\LiteratureAccessDate}[1][1]{%
|
\newcommand{\LiteratureAccessDate}[1][1]{%
|
||||||
дата~обращения: \ifcase#1\or 03.08.2023%
|
дата~обращения: \ifcase#1\or 03.08.2023%
|
||||||
\or 07.08.2023%
|
\or 07.08.2023%
|
||||||
|
\or 09.08.2023%
|
||||||
\else\@ctrerr\fi
|
\else\@ctrerr\fi
|
||||||
}
|
}
|
||||||
\renewcommand\bibname{Библиографический список}
|
\renewcommand\bibname{Библиографический список}
|
||||||
@ -13,8 +14,10 @@
|
|||||||
2011. -- 636 с., c илл. -- (Классический университетский учебник).
|
2011. -- 636 с., c илл. -- (Классический университетский учебник).
|
||||||
\bibitem{book:lectures} Письменный~Д.~Т. Конспект лекций по высшей математике. 2 часть. -- М.: Рольф, 2000. -- 256 с., с илл.
|
\bibitem{book:lectures} Письменный~Д.~Т. Конспект лекций по высшей математике. 2 часть. -- М.: Рольф, 2000. -- 256 с., с илл.
|
||||||
\bibitem{links:numpy} Numpy. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://numpy.org/} (\LiteratureAccessDate[2]).
|
\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:python} Python. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://www.python.org/} (\LiteratureAccessDate).
|
||||||
\bibitem{links:scipy} Scipy. Официальный сайт проекта [Электронный ресурс] -- URL:~\url{https://scipy.org/} (\LiteratureAccessDate[2]).
|
\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. Официальный сайт проекта
|
\bibitem{links:tiobe_index} TIOBE. Официальный сайт проекта
|
||||||
[Электронный ресурс] -- URL:~\url{https://www.tiobe.com/tiobe-index/} (\LiteratureAccessDate).
|
[Электронный ресурс] -- URL:~\url{https://www.tiobe.com/tiobe-index/} (\LiteratureAccessDate).
|
||||||
\end{thebibliography}
|
\end{thebibliography}
|
||||||
|
Loading…
Reference in New Issue
Block a user