nm-coursework/main.tex
2023-08-15 12:20:32 +03:00

160 lines
9.5 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\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}