Реализация на языке C# Платформа .NET
// Интерполирование функций естественными кубическими сплайнами using System; class CubicSpline{ SplineTuple[] splines; // Сплайн // Структура, описывающая сплайн на каждом сегменте сетки private struct SplineTuple { public double a, b, c, d, x; } // Построение сплайна // x - узлы сетки, должны быть упорядочены по возрастанию, кратные узлы запрещены // y - значения функции в узлах сетки // n - количество узлов сетки public void BuildSpline(double[] x, double[] y, int n) { // Инициализация массива сплайнов splines = new SplineTuple[n]; for (int i = 0; i < n; ++i) { splines[i].x = x[i]; splines[i].a = y[i]; } splines[0].c = splines[n - 1].c = 0.0; // Решение СЛАУ относительно коэффициентов сплайнов c[i] методом прогонки для трехдиагональных матриц // Вычисление прогоночных коэффициентов - прямой ход метода прогонки double[] alpha = new double[n - 1]; double[] beta = new double[n - 1]; alpha[0] = beta[0] = 0.0; for (int i = 1; i < n - 1; ++i) { double hi = x[i] - x[i - 1]; double hi1 = x[i + 1] - x[i]; double A = hi; double C = 2.0 * (hi + hi1); double B = hi1; double F = 6.0 * ((y[i + 1] - y[i]) / hi1 - (y[i] - y[i - 1]) / hi); double z = (A * alpha[i - 1] + C); alpha[i] = -B / z; beta[i] = (F - A * beta[i - 1]) / z; } // Нахождение решения - обратный ход метода прогонки for (int i = n - 2; i > 0; --i) { splines[i].c = alpha[i] * splines[i + 1].c + beta[i]; } // По известным коэффициентам c[i] находим значения b[i] и d[i] for (int i = n - 1; i > 0; --i) { double hi = x[i] - x[i - 1]; splines[i].d = (splines[i].c - splines[i - 1].c) / hi; splines[i].b = hi * (2.0 * splines[i].c + splines[i - 1].c) / 6.0 + (y[i] - y[i - 1]) / hi; } } // Вычисление значения интерполированной функции в произвольной точке public double Interpolate(double x) { if (splines == null) { return double.NaN; // Если сплайны ещё не построены - возвращаем NaN } int n = splines.Length; SplineTuple s; if (x <= splines[0].x) // Если x меньше точки сетки x[0] - пользуемся первым эл-тов массива { s = splines[0]; } else if (x >= splines[n - 1].x) // Если x больше точки сетки x[n - 1] - пользуемся последним эл-том массива { s = splines[n - 1]; } else // Иначе x лежит между граничными точками сетки - производим бинарный поиск нужного эл-та массива { int i = 0; int j = n - 1; while (i + 1 < j) { int k = i + (j - i) / 2; if (x <= splines[k].x) { j = k; } else { i = k; } } s = splines[j]; } double dx = x - s.x; // Вычисляем значение сплайна в заданной точке по схеме Горнера (в принципе, "умный" компилятор применил бы схему Горнера сам, но ведь не все так умны, как кажутся) return s.a + (s.b + (s.c / 2.0 + s.d * dx / 6.0) * dx) * dx; }}
Реализация на Python 2.7
|
|
|
|
Квадратичный сплайн
Определение сплайна:
Сплайном Sm(x) называется функция определенная на [a,b] , p раз непрерывно дифференцируемая, и такая, что на каждом промежутке [xk-1,xk](k=1, 2, 3, ... ,n) это многочлен степени m
Разность d=m−p между степенью сплайна и показателем гладкости называется дефектом сплайна.
|
|
Простейшим случаем интерполяционных сплайнов является кусочно-линейная функция - сплайн степени 1 и дефекта 1.
Чем меньше дефект сплайна, тем выше показатель гладкости.
На отрезке [a, b] заданы (n+1) точка - узлы интерполяции.
x0,x1,x2, . . . ,xn
и известны значения функции y=f(x) в этих точках. Задана табличная функция:
f(x0)=y0, f(x1)=y1, f(x2)=y2, . . ., f(xn)=yn
Необходимо найти приближенное значение функции в точках, отличных от заданных.
3.1 Квадратичный сплайн дефекта 1:
Квадратичным сплайном дефекта 1 интерполирующем на отрезке [a,b] данную функцию f(x) называется функция S2(x) , такая что:
1) S2(xk)=fk - условие интерполяции.
2) S'2(k)(xk)=S'2(k+1)(xk) - равенство первых производных в узлах (гладкая стыковка)(k=1, 2, 3, ... ,n-2)
3) S'2(x0)=CилиS'2(xn)=C - краевое условие, С - произвольное число
Сформируем систему для 1-го условия:
a1x20+b1x0+c1=f0a1x21+b1x1+c1=f1a2x21+b2x1+c2=f1a2x22+b2x2+c2=f2. . . . .. . . . .anx2n-1+bnxn-1+cn=fn-1anx2n+bnxn+cn=fn
Для 2-го условия:
2a1x1+b1=2a2x1+b22a2x2+b2=2a3x2+b3. . . . . .2an-1xn-1+bn-1=2anxn-1+bn
Для 3-го условия: 2a1x0=C или 2anxn=C.
Объединив полученные системы в одну и решив её получим матрицу коефицентов ai,bi,ci,i=(1,2,. . .,n)
Формирование систем
|
|
Сформируем системы.
Для 1-го условия:
a1x20+b1x0+c1=f0a1x21+b1x1+c1=f1a2x21+b2x1+c2=f1a2x22+b2x2+c2=f2. . . . .. . . . .anx2n-1+bnxn-1+cn=fn-1anx2n+bnxn+cn=fn
Для 2-го условия:
2a1x1+b1=2a2x1+b22a2x2+b2=2a3x2+b3. . . . . .2an-1xn-1+bn-1=2anxn-1+bn
Для 3-го условия:
2a1x0=C или 2anxn=C
Объединив полученные системы в одну и решив её получим матрицу коефицентов
ai,bi,ci,i=(1,2,. . .,n)
Заключение
В вычислительной математике существенную роль играет интерполяция функций, т.е. построение по заданной функции другой (как правило, более простой), значения которой совпадают со значениями заданной функции в некотором числе точек. Причем интерполяция имеет как практическое, так и теоретическое значение. На практике часто возникает задача о восстановлении непрерывной функции по ее табличным значениям, например, полученным в ходе некоторого эксперимента. Для вычисления многих функций, оказывается, эффективно приблизить их полиномами или дробно-рациональными функциями. Теория интерполирования используется при построении и исследовании квадратурных формул для численного интегрирования, для получения методов решения дифференциальных и интегральных уравнений. Основным недостатком полиномиальной интерполяции является то, что она неустойчива на одной из самых удобных и часто используемых сеток - сетке с равноудаленными узлами. Если позволяет задача, эту проблему можно решить за счет выбора сетки с Чебышевскими узлами. Если же мы не можем свободно выбирать узлы интерполяции или нам просто нужен алгоритм, не слишком требовательный к выбору узлов, то рациональная интерполяция может оказаться подходящей альтернативой полиномиальной интерполяции.
К достоинствам сплайн-интерполяции следует отнести высокую скорость обработки вычислительного алгоритма, поскольку сплайн - это кусочно-полиномиальная функция и при интерполяции одновременно обрабатываются данные по небольшому количеству точек измерений, принадлежащих к фрагменту, который рассматривается в данный момент. Интерполированная поверхность описывает пространственную изменчивость различного масштаба и в то же время является гладкой. Последнее обстоятельство делает возможным прямой анализ геометрии и топологии поверхности с использованием аналитических процедур.
Список использованной литературы
1.Роджерс Д.,Адамс Дж. Математические основы машинной графики. — М.: Мир, 2001.
2.Завьялов Ю. С., Леус В. А., Скороспелов В. А. Сплайны в инженерной геометрии. — М.: Машиностроение, 1985.
3.Лившиц Е.Д. Непрерывные E-выборки для приближения полиномиальными и рациональными сплайнами : Дис. … канд. физ.-мат. наук : 01.01.01 Москва.
4.Алберг Дж., Нильсон Э., Уолш Дж. — Теория сплайнов и ее приложения.
5.Винниченко Л. Ф. Экспоненциальные гистосплайны: предпосылки введения // Publishing house Education and Science s.r.o., конференция «Европейская наука XXI века», 2009.
6.Корнейчук, Н. П., Бабенко, В. Ф., Лигун, А. А. Экстремальные свойства полиномов и сплайнов / отв. ред. А. И. Степанец; ред. С. Д. Кошис, О. Д. Мельник, АН Украины, Ин-т математики. — К.: Наукова думка 1992.
7.Вершинин В. В., Завьялов Ю. С, Павлов Н. Н. Экстремальные свойства сплайнов и задача сглаживания. — Новосибирск: Наука, 1988, УДК 519.651
8.Роженко Александр Иосифович. Теория и алгоритмы вариационной сплайн-аппроксимации : Дис. … д-ра физ.-мат. наук : 01.01.07 : Новосибирск, 2003 231 c. РГБ ОД, 71:05-1/136
9.Шикин Е. В., Плис Л. И. Кривые и поверхности на экране компьютера. Руководство по сплайнам для пользователей. — М.: ДИАЛОГ-МИФИ, 1996.
10.Хакимов Б.В. Моделирование корреляционных зависимостей сплайнами на примерах в геологии и экологии. — С-Пб.: НЕВА, 2003.
Дата добавления: 2018-02-15; просмотров: 2302; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!