160 lines
9.5 KiB
TeX
160 lines
9.5 KiB
TeX
\input{vars}
|
||
\input{config}
|
||
|
||
\begin{document}
|
||
\lstset{language=[11]C++}
|
||
|
||
%title-page
|
||
\include{titlepage}
|
||
\thispagestyle{empty}
|
||
\clearpage
|
||
|
||
\tableofcontents
|
||
\thispagestyle{empty}
|
||
\clearpage
|
||
\input{intro}
|
||
|
||
\chapter{Описание численных методов и возможностей библиотек numpy и scipy}
|
||
В данном разделе будут описаны численные методы и их доступные
|
||
реализации в библиотеках в частях, посвященным классам задач, которые
|
||
они решают.
|
||
|
||
Стоит учитывать, что scipy основан на numpy, поэтому при рассмотрении
|
||
возможностей данных библиотек часто может возникнуть ситуация,
|
||
когда искомый функционал содержится только в scipy, либо в numpy
|
||
или scipy одновременно.
|
||
|
||
\section{Численное решение нелинейных уравнений}
|
||
При решении некоторых практических задач или проведении исследований
|
||
может быть получена математическая модель, которая включает
|
||
непрерывную функцию \(F(x), x \in \textbf{R}\), и необходимо определить корни уравнения
|
||
\(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)| < \varepsilon\), где \(\varepsilon\)
|
||
--- погрешность искомого решения.
|
||
\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 < \varepsilon\),
|
||
тогда дальнейшее выполнение данного алгоритма для данного
|
||
отрезка прекращается. За решение уравнения принимается
|
||
число \((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 \textbf{R}\}, |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*{Заключение}
|
||
\addcontentsline{toc}{chapter}{Заключение}
|
||
|
||
\input{sources}
|
||
\include{appendix}
|
||
\end{document}
|