From a70592186a456a9aa52c6c9e2a9d2097cd9a9c15 Mon Sep 17 00:00:00 2001 From: AVAtarMod Date: Sun, 24 Sep 2023 23:38:25 +0300 Subject: [PATCH] [content] Add spline definition, library info --- main.tex | 203 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 190 insertions(+), 13 deletions(-) diff --git a/main.tex b/main.tex index 08a2ead..37ba9cb 100644 --- a/main.tex +++ b/main.tex @@ -1,5 +1,6 @@ \input{vars} \input{config} +\sloppy \NewDocumentCommand{\MFArgs} {}{x^{(p)}_1,x^{(p)}_2,x^{(p)}_3,\dots,x^{(p)}_n} @@ -859,30 +860,206 @@ LU-разложение \cite[с. 259]{book:levitin}. Для получения и т.д. \subsubsection{Реализации метода в библиотеках numpy, scipy} Реализаций данного метода в в библиотеках numpy, scipy не найдено. + \subsection{Сплайн-интерполяция} +Перед рассмотрением метода необходимо ввести понятие интерполяционного +сплайна. Это кусочно-заданная функция, каждый фрагмент которой является +непрерывной функцией, и на концах его значение совпадает с известными +значениями функции. + +Иногда выбирают фрагменты сплайна такого вида, что непрерывными будут и их +производные, вплоть до нужного порядка (например, если в роли сплайнов +выбрать полиномы 3 степени, то они будут соответствовать условиями +непрерывности вместе с 1 и 2 производными). В зависимости от цели, +на сплайны могут быть наложены и иные ограничения. Также, для упрощения +вычислений, чаще всего все фрагменты сплайна --- функции из одного +класса, например, многочленов фиксированной степени. \subsubsection{Описание метода} -Между парами значений \((x_{i-1},y_{i-1}),(x_i,y_i)\) строятся -функции-сплайны \(f_1(x),\dots,f_n(x)\), соответствущие условиям +Между парами значений \((x_{l(j-1)},y_{l(j-1)}),(x_{l(j)},y_{l(j)})\), +где \(l \in \textbf{N}, 0 \le l_j \le n\) строятся +фрагменты сплайна \(f_1(x),\dots,f_n(x)\), соответствущие условиям непрерывности. Комбинация таких функций образует исходную: \begin{equation*} \widetilde{y}(x) = \left\{ \begin{aligned} - & f_1(x),\; x_0 \le x < x_1 \\ - & f_2(x),\; x_1 \le x < x_2 \\ - & \ \dots \qquad \quad \dots \\ - & f_n(x),\; x_{n-1} \le x < x_n \\ + & f_1(x),\; x_0 \le x < x_l \\ + & f_2(x),\; x_{l} \le x < x_{2l} \\ + & \ \dots \qquad \quad \dots \\ + & f_n(x),\; x_{jl} \le x < x_n \\ \end{aligned} \right. \end{equation*} - -Иногда выбирают сплайны такого вида, что непрерывными будут и их -производные, вплоть до нужного порядка (например, если в роли сплайнов -выбрать полиномы 3 степени, то они будут соответствовать условиями -непрерывности вместе с 1 и 2 производными). В зависимости от цели, -на сплайны могут быть наложены и иные ограничения. +При этом +\begin{equation*} + \begin{aligned} + & f_1(x_0) = y_0, f_1(x_l) = y_l \\ + & f_2(x_l) = y_l, f_2(x_{2l}) = y_{2l} \\ + & \ \dots \qquad \quad \dots \\ + & f_n(x_{jl}) = y_{jl},f_n(x_n) = y_n \\ + \end{aligned} +\end{equation*} +Для полиномов 3 степени чаще всего \(l=3\), и в таком случае по \(l\) +точкам на каждом фрагменте строиться полином (например, интерполяционный +полином Ньютона). В общем случае \(l\) определяется исходя из условий +и ограничений поставленной перед исследователем задачи. \subsubsection{Реализации метода в библиотеках numpy, scipy} В библиотеке scipy существует множество реализаций данного метода, -которые отличаются используемым видом сплайна. +которые отличаются используемым видом сплайна. В модуле +\textbf{scipy.interpolate} описаны следующие объекты +\cite{links:scipy_doc}: +\begin{enumerate} + \item класс \textbf{CubicSpline}; + \item класс \textbf{PchipInterpolator}; + \item класс \textbf{CubicHermiteSpline}; + \item класс \textbf{Akima1DInterpolator}; + \item класс \textbf{RectBivariateSpline}, используется для многомерной + \item интерполяции; + \item функция \textbf{interp1d}, которая может интерполировать таблично + заданную функцию разными методами, в т.ч. сплайн-интерполяцией. + Признана устаревшей и поэтому не будет рассмотрена; +\end{enumerate} + + +Классы \textbf{CubicSpline}, \textbf{PchipInterpolator}, +\textbf{CubicHermiteSpline}, \textbf{Akima1DInterpolator} +используются для интерполяции функций одного аргумента, и их +применение одинаково: для создания сплайна необходимо создать +экземпляр класса, для получения значений сплайна необходимо +вызвать созданный экземпляр с необходимыми входными данными +(то есть вызвать метод \verb|__call__|). + +Каждый из классов имеет разное количество параметров, которые +можно задать при его создании его экземпляра; метод получения +данных сплайна, в свою очередь, имеет одинаковое количество +параметров для всех классов, поэтому он имеет смысл описать его сейчас. + +Метод \verb|__call__| вышеописанных классов имеет 3 параметра: +\begin{enumerate} + \item \(x\) --- array\_like + + Точки, для которых будет вычислено значения сплайна. + \item \(nu\) --- int, необязательный + + Порядок производной сплайна, который необходимо использовать при + вычислении значений. Должен быть неотрицательным. По умолчанию + --- 0 (то есть вычисляется исходный сплайн). + \item \(extrapolate\) --- {bool, \verb|"periodic"|, + \verb|None|}, необязательный + + Если bool, определяет, следует ли экстраполировать точки, + которые выходят за пределы границ, установленные первым и + последним интервалами или возвращать \verb|NaN|. Если + \verb|"periodic"|, используется периодическая экстраполяция. + Если \verb|None| (по умолчанию), используйте метод \textbf{extrapolate} + этого класса. +\end{enumerate} +Данный метод возвращает массив значений сплайна, соответствующих значений +\(x\). + +Конструктор экземпляра класса \textbf{CubicSpline} имеет следующие +параметры: +\begin{enumerate} + \item \(x\) --- array\_like, одномерный + + Одномерный массив, содержащий значения независимой переменной. + Значения должны быть действительными, конечными числами и + находиться в строго возрастающем порядке. + + \item \(y\) --- array\_like + + Массив, содержащий значения зависимой переменной. Он может + иметь произвольное количество измерений, но длина должна + совпадать с длиной \(x\). Значения должны быть конечными. + + \item \(axis\) int, необязательный + + Ось, вдоль которой предполагается изменение y. Это означает, + что для \(x[i]\) соответствующие значения равны + \verb|np.take(y, i, axis=axis)|. По умолчанию --- 0. + \item \(bc\_type\) --- string / tuple размера = 2, необязательный + + Тип граничного условия. Два дополнительных уравнения, заданные + граничными условиями, необходимы для определения всех + коэффициентов многочленов на каждом отрезке. + + Если \(bc\_type\) --- строка, то указанное в параметре условие + будет применено к обоим концам сплайна. Доступные условия: + \begin{itemize} + \item \verb|"not-a-knot"| (по умолчанию): первый и второй + сегменты на конце кривой представляют собой один и тот + же полином. Это хороший вариант по умолчанию, когда нет + информации о граничных условиях. + + \item \verb|"periodic"|: Предполагается, что интерполируемые + функции являются периодическими с периодом + \(x[-1] \ \mbox {---}\ x[0]\). + Первое и последнее значение y должны быть идентичными: + \(y[0] == y[-1]\). Это граничное условие приведет к + тому, что \(y'[0] == y'[-1]\) и \(y''[0] == y''[-1]\). + + \item \verb|"clamped"|: Первая производная на концах кривых + равна нулю. Предполагая, что y одномерный, + \(bc\_type=((1, 0.0), (1, 0.0))\) --- то же самое + условие. + + \item \verb|"natural"|: Вторая производная на концах кривой + равна нулю. Предполагая, что y одномерный, + \(bc\_type=((2, 0.0), (2, 0.0))\) --- то же самое + условие. + \end{itemize} + + Если \(bc\_type\) представляет собой кортеж из двух элементов, + первое и второе значения будут применены в начале и конце + кривой соответственно. Значения кортежа могут быть одной из + ранее упомянутых строк (кроме \verb|"periodic"|) или кортежем + \((order, deriv\_values)\), позволяющим указывать произвольные + производные на концах кривой: + + \begin{itemize} + \item \(order\): порядок производной --- 1 или 2. + + \item \(deriv\_value\): array\_like + + Содержит значения производной, форма должна быть такой + же, как \(y\), за исключением измерения \(axis\). + Например, если \(y\) --- одномерный, то + \(deriv\_values\) должен быть скаляром. Если \(y\) + является трехмерным, имеет форму \((n0, n1, n2)\) и + \(axis=1\), то \(deriv\_values\) должно быть + двухмерным и иметь форму \((n0, n2)\). + \end{itemize} + + \item \(extrapolate\) --- {bool, \verb|"periodic"|, + \verb|None|}, необязательный + + Если bool, определяет, следует ли экстраполировать точки, + которые выходят за пределы границ, установленные первым и + последним интервалами или возвращать \verb|NaN|. Если + \verb|"periodic"|, используется периодическая экстраполяция. + Если \verb|None| (по умолчанию), параметр имеет значение + \verb|"periodic"| если \(bc\_type\)=\verb|"periodic"| и + значение \verb|True| в противном случае. +\end{enumerate} + +Конструктор экземпляра класса \textbf{PchipInterpolator} имеет следующие +параметры: +\begin{enumerate} + \item +\end{enumerate} + +Конструктор экземпляра класса \textbf{CubicHermiteSpline} имеет следующие +параметры: +\begin{enumerate} + \item +\end{enumerate} + +Конструктор экземпляра класса \textbf{Akima1DInterpolator} имеет +следующие параметры: +\begin{enumerate} + \item +\end{enumerate} + + \subsection{Сглаживание. Метод наименьших квадратов} \subsubsection{Описание метода} \subsubsection{Реализации метода в библиотеках numpy, scipy}