Интерполяция разрывных функций с помощью сплайнов
Рассмотрение общего понятия сплайна. Общие понятия и определения кубического сплайна дефекта, его построение и оценка погрешности интерполяции. Определение метода учета величины скачка функции или ее производных при построении кубического сплайна.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.02.2015 |
Размер файла | 1,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Міністерство освіти і науки України
Одеський Національний Університет ім. І.І. Мечникова
Кафедра математичного забезпечення комп'ютерних систем
Курсова робота
Iнтерполяція розривних функцій за допомогою сплайнів
студента III курсу групи ВТ
Свирипи Гліба Леонідовича
Науковий керівник:
Зверкова Т.С.
Доцент, кандидат фіз.-мат. наук
Одеса - 2013
Введение
сплайн кубический дефект интерполяция
Большинство численных методов решения задач математического анализа так или иначе связано с аппроксимацией функций. Типичной задачей аппроксимации является задача интерполяции: по заданной таблице чисел восстановить функцию с той или иной точностью на заданном отрезке действительной оси. Классический метод решения такой задачи состоит в построении интерполяционного многочлена Лагранжа. Хотя согласно теореме Вейерштрасса всякая непрерывная функция на заданном отрезке может быть как угодно хорошо приближена многочленами, практические возможности применения многочленов Лагранжа ограничены. В ряде случаев происходит быстрое накопление ошибок округления и весьма усложняется вычислительный процесс. Поэтому на практике для того, чтобы достаточно хорошо приблизить функцию, вместо построения интерполяционного многочлена высокой степени используют интерполяцию кусочными многочленами. Примером такого рода является кусочно-линейная интерполяция. В общем случае отрезок разбивается точками на промежутки, и на каждом промежутке строится свой интерполяционный многочлен. Полученные таким образом многочлены дают интерполяцию функции на всем отрезке, которая, вообще говоря, не обеспечивает гладкого перехода от одного звена к другому и может быть даже разрывной. Это допустимо, если не требуется восстанавливать функцию с заданной степенью гладкости. Для гладкого восстановления заданной функции нужно увеличить степень составляющих многочленов, а остающиеся свободными коэффициенты определять из условий гладкого сопряжения многочленов на соседних промежутках. Получающиеся при этом гладкие кусочно-многочленные функции с однородной структурой (составленные из многочленов одной и той же степени) называются сплайн-функциями или просто сплайнами.
Алгоритмы построения сплайнов являются довольно простыми и эффективно реализуются на ЭВМ, причем влияние ошибок округления при вычислениях оказывается незначительным.
Бурное развитие теории сплайн-функций одной переменной как аппарата численного анализа было обусловлено главным образом двумя причинами: 1) хорошей сходимостью сплайнов к аппроксимируемым объектам; 2) простотой в реализации алгоритмов построения сплайнов на ЭВМ.
Опыт применения сплайн-функций как аппарата приближения функций в численном анализе показывает, что во всех известных случаях удавалось добиться ощутимых результатов по сравнению с классическим аппаратом многочленов. В одних задачах переход к сплайнам приводит к повышению точности результатов, в других - к значительному сокращению вычислительных затрат, в третьих - достигаются оба эффекта одновременно. Наконец, с помощью сплайнов удалось решить и такие задачи, которые другим путем решить было бы невозможно. Среди них на первом месте стоит проблема представления и хранения геометрической информации в самых различных областях знания, будь то естественные науки, техника, архитектура, картография. Применение для данных целей сплайнов позволяет хранить геометрическую информацию в числовой форме и с любой точностью. Особенно широкое применение получили сплайны в технике как аппарат для математического моделирования поверхностей деталей и агрегатов сложной формы. Такие математические модели стали необходимыми при создании систем автоматизации проектирования изделий на основе ЭВМ, технологической подготовки их производства, включая разработку программ для оборудования с цифровым программным управлением. Область применения сплайнов непрерывно растет.
Общее понятие сплайна
Пусть на отрезке [a, b] задано разбиение Д; . Для целого k?0 через обозначим множество k раз непрерывно дифференцируемых на [a, b] функций, а через - множество кусочно-непрерывных функций с точками разрыва первого рода.
Определение: Функция называется сплайном степени n дефекта н (н - целое число, 0?н?n+1) с узлами на сетке Д, если
А) на каждом отрезке функция является многочленом степени n, то есть
для x , i=0, …, N-1 (1)
Б) .
Кубический сплайн дефекта 1
Общие понятия и определения
В данной работе будут рассмотрены кубические сплайны дефекта 1, являющиеся дважды непрерывно дифференцируемыми функциями. Хорошие аппроксимативные свойства в сочетании с простотой реализации на ЭВМ сделали их эффективным средством решения самых разнообразных прикладных задач. В дальнейшем в работе будем называть такие сплайны кубическими без указания дефекта.
Пусть некоторая функция f(x) задана на промежутке [a,b], разбитом на отрезки [xi ? 1,xi], a = x0 < x1 < ... < xN = b. Точки разбиения xi назовем узлами сетки разбиения. Кубическим сплайном дефекта 1 для функции f(x) называется функция S(x), которая:
на каждом отрезке [xi ? 1,xi] является многочленом степени не выше третьей;
имеет непрерывные первую и вторую производные на всём отрезке [a,b];
в точках xi выполняется равенство S(xi) = f(xi), т. е. сплайн S(x) интерполирует функцию f в точках xi , i = 0, 1, 2,…, N.
Сплайн S(x) на каждом из отрезков [xi ? 1,xi] определяется четырьмя коэффициентами, и поэтому для его построения на всем промежутке [a,b] необходимо определить 4N коэффициентов. Условие 2) эквивалентно требованию непрерывности сплайна и его производных до второго порядка включительно во всех внутренних узлах xi , i = 1, 2,…, N-1, что дает 3(N-1) равенств. Таким образом, вместе с равенствами 3) получается 4N - 2 соотношений. Для однозначного построения сплайна необходимы два дополнительных условия, которые обычно задаются в виде ограничений на значения сплайна и его производных на концах промежутка [a,b] (или вблизи концов) и называются краевыми условиями. Существует несколько различных видов краевых условий, наиболее употребительными из которых являются
Условия типа III носят название периодических. Естественно требовать их выполнения в том случае, когда интерполируемая функция периодическая с периодом
T = ( b-a).
Зачастую используют условие II, дополнительно требуя нулевой кривизны сплайна на концах отрезка, т. е.
S''(a) = S''(b) = 0.
Такой кубический сплайн называется естественным.
Построение
Обозначим: hi = xi ? xi ? 1
На каждом отрезке [xi ? 1,xi] функция S(x) есть полином третьей степени Si(x), коэффициенты которого надо определить. Запишем для удобства Si(x) в виде:
тогда
Условия непрерывности всех производных до второго порядка включительно записываются в виде
а условия интерполяции в виде
Отсюда получаем формулы для вычисления коэффициентов сплайна:
Если учесть, что c0 = cn = 0, то вычисление c можно провести с помощью метода прогонки для трёхдиагональной матрицы.
Оценка погрешности интерполяции
Пусть S(x) - интерполяционный сплайн, удовлетворяющий условиям 1) - 3). Если f(x) - периодическая, то естественно подчинить S(x) периодическим краевым условиям (тип III). При интерполяции непериодических функций на C[a,b] будем использовать разностный аналог краевых условий типа I:
(1)
Обозначим
Теорема 1. Если f(x) C[a,b] и S(x) удовлетворяет краевым условиям (1) или условиям типа III, то
(2)
Особенностью полученной оценки является зависимость коэффициента при от отношения максимального и минимального шагов сетки. Сформулируем другую оценку, в которой этот коэффициент зависит от величины
,
характеризующей соотношение соседних шагов сетки.
Теорема 2. Если f(x) C[a,b] и S(x) удовлетворяет краевым условиям (1) или условиям типа III, то
(5)
где n - положительное целое число, , - положительный корень уравнения
(6)
Полученная оценка (5) зависит от целочисленного параметра n. При n=1 уравнение (6) переходит в уравнение
,
откуда . С ростом n величина монотонно возрастает, и при из (6) имеем
что дает предельное значение
При практическом использовании оценки (5) простым перебором находим такое n, чтобы при выполнении условия дробь в коэффициенте при имела наименьшее значении. Например, при это будет n=1.
Теорема 3. Если f(x) [a,b] и S(x) удовлетворяет краевым условиям (1) или условиям типа III, то
Где
Примеры
Естественный кубический сплайн функции sin(x) с шагом h = 0.2
На графике сплайн полностью совпадает с функцией
Естественный кубический сплайн функции |sin(x)| с шагом h = 0.2
Как видно из графика, в случае с функцией sin(x) сплайн ведет себя так же как функция, однако в случае с |sin(x)| появляются расхождения в области точки разрыва производной.
Функция |sin(x)|, но уже с шагом h=0.025
С уменьшением шага расхождения тоже уменьшаются, но все же остаются.
Код решения на C#
class SplineBuilder : Builder
{
SplineSegment[] segments;
List<PointDouble> points;
int n;
/// <summary>
/// Конструктор SplineBuilder
/// </summary>
/// <param name="n">Количество узлов сетк</param>
/// <param name="_points">Значения в узлах</param>
public SplineBuilder(int _n, List<PointDouble> _points)
{
n = _n;
points = _points;
segments = new SplineSegment[n];
for (int i = 0; i < n; ++i)
{
segments[i].x = points[i].x;
segments[i].a = points[i].y;
}
segments[0].c = 0;
segments[n - 1].c = 0;
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 = points[i].x - points[i - 1].x;
double hi1 = points[i + 1].x - points[i].x;
double A = hi;
double C = 2.0 * (hi + hi1);
double B = hi1;
double F = 6.0 * ((points[i + 1].y - points[i].y) / hi1 - (points[i].y - points[i - 1].y) / 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)
{
segments[i].c = alpha[i] * segments[i + 1].c + beta[i];
}
// По известным коэффициентам c[i] находим значения b[i] и d[i]
for (int i = n - 1; i > 0; --i)
{
double hi = points[i].x - points[i - 1].x;
segments[i].d = (segments[i].c - segments[i - 1].c) / hi;
segments[i].b = hi * (2.0 * segments[i].c + segments[i - 1].c) / 6.0 + (points[i].y - points[i - 1].y) / hi;
}
}
public List<PointDouble> getPoints
{
get { return points; }
}
public SplineSegment[] getSpline
{
get { return segments; }
}
public double Interpolate(double x)
{
if (segments == null)
{
return double.NaN; // Если сплайны ещё не построены - возвращаем NaN
}
int n = segments.Length;
SplineSegment s;
if (x <= segments[0].x) // Если x меньше точки сетки x[0] - пользуемся первым эл-тов массива
{
s = segments[1];
}
else if (x >= segments[n - 1].x) // Если x больше точки сетки x[n - 1] - пользуемся последним эл-том массива
{
s = segments[n - 1];
}
else // Иначе x лежит между граничными точками сетки - производим бинарный поиск нужного эл-та массива
{
int i = 0;
int j = n - 1;
while (i + 1 < j)
{
int k = i + (j - i) / 2;
if (x <= segments[k].x)
{
j = k;
}
else
{
i = k;
}
}
s = segments[j];
}
double dx = x - s.x;
// Вычисляем значение сплайна в заданной точке по схеме Горнера (в принципе, "умный" компилятор применил бы схему Горнера сам, но ведь не все так умны, как кажутся)
return s.a + (s.b + (s.c / 2.0 + s.d * dx / 6.0) * dx) * dx;
}
}
Кубические сплайны с дополнительными узлами
Теория и построение
Если по условиям задачи, помимо значений функции, требуется интерполировать и ее производные до некоторого порядка, то для решения подобных задач приходится либо переходить к сплайнам с меньшей гладкостью (с большим дефектом), либо повышать из степень. Однако, существует способ, позволяющий избежать ряда затруднений путем введения узлов сплайна, не являющихся узлами интерполяции. Такие конструкции принято называть сплайнами с дополнительными узлами. Их использование не приводит к увеличению размерности решаемых алгебраических систем, а только к некоторому усложнению элементов матрицы правых частей.
Пусть на отрезке [a,b] требуется интерполировать некоторую функцию f(x) по известным значениям , r = 0,1,2 ,на сетке Д: a==b. Обычно для решения такой задачи используют сплайны пятой степени с узлами на сетке Д, но можно применить кубические сплайны с дополнительными узлами. Для этого введем на [a,b] еще одну сетку
д = {,
где .
Кубический сплайн S(x) дефекта 1 с узлами на сетке , удовлетворяющий условиям
для (1)
назовем локальным кубическим сплайном с дополнительными узлами.
Условия интерполяции (1) на концах промежутков [ ,дают N линейных систем, по 6 уравнений в каждой, для определения коэффициентов сплайна, решая которые получаем при
(2)
с коэффициентами
.
Оценка погрешности локальной интерполяции
Приведем оценку точности приближения функции f(x) сплайном S(x) в зависимости от ее дифференциальных свойств. В данном случае константы в оценках будут зависеть от параметра . В силу сложности получаемых выражений приведены результаты только для фиксированного .
Теорема 1. Если S(x) интерполирует на сетке Д функцию f(x), то имеют место оценки
(1)
где при даны в таблице 1
Класс функций |
|||
Класс функций |
|||
- |
|||
- |
|||
Придавая параметру различные конкретные значения можно выяснить характер зависимости констант в получающихся оценках от . Естественно было бы выбирать оптимальные значения , при котором константы принимают наименьшие значения, однако в большинстве случаев оптимальные константы в оценках мало отличаются от соответствующих констант при
Примеры
Функция |sin(x)|, h = 0.2
Как видно из графика, несмотря на теоретическое обоснование, график сплайна испытывает серьёзные осцилляции при подходе к точке разрыва производной слева, однако надо заметить, что справа осцилляции полностью отсутствуют. К таким результатам привели неточности вычисления чисел с плавающей запятой, потому при использовании этого метода надо учитывать подобные ошибки вычислений.
Та же функция, но с шагом h=0.025
На графике видно, что изменение порядка шага дало значительно лучшие результаты, хотя ошибки вычисления всё равно могут присутствовать
Код решения на C#
class ExtraSpline : Builder
{
public double a1;
public double a2;
ExtraSplineSegment[] segments;
List<PointDoubleWithDer> points;
int n;
public ExtraSpline(int _n, List<PointDoubleWithDer> _points, double _a1, double _a2)
{
n = _n;
a1 = _a1;
a2 = _a2;
points = _points;
segments = new ExtraSplineSegment[n-1];
for (int i = 0; i < n-1; ++i)
{
segments[i].x = points[i].x;
segments[i].f = points[i].y;
segments[i].f1 = points[i].y1;
segments[i].f2 = points[i].y2;
//находим h
segments[i].h = points[i + 1].x - points[i].x;
//находим c1 и с2
segments[i].c1 = c_function(a1, a2, segments[i].f, segments[i].f1, segments[i].f2, points[i + 1].y, points[i + 1].y1, points[i + 1].y2, segments[i].h);
segments[i].c2 = c_function(a2, a1, segments[i].f, segments[i].f1, segments[i].f2, points[i + 1].y, points[i + 1].y1, points[i + 1].y2, segments[i].h);
segments[i].a = a_function(segments[i].c1, segments[i].c2, points[i + 1].y2, segments[i].f2, segments[i].h);
}
}
public double Interpolate(double x)
{
if (segments == null)
{
return double.NaN; // Если сплайны ещё не построены - возвращаем NaN
}
int n = segments.Length;
ExtraSplineSegment s;
if (x <= segments[0].x) // Если x меньше точки сетки x[0] - пользуемся первым эл-тов массива
{
s = segments[1];
}
else if (x >= segments[n - 1].x) // Если x больше точки сетки x[n - 1] - пользуемся последним эл-том массива
{
s = segments[n - 1];
}
else // Иначе x лежит между граничными точками сетки - производим бинарный поиск нужного эл-та массива
{
int i = 0;
int j = n - 1;
while (i + 1 < j)
{
int k = i + (j - i) / 2;
if (x <= segments[k].x)
{
j = k;
}
else
{
i = k;
}
}
s = segments[j];
}
double dx = x - s.x;
double res = 0;
res = (s.a * dx * dx * dx) / 6 + (s.f2 * dx * dx) / 2 + (s.f1 * dx) + s.f + (s.c1 * (dx - a1 * s.h) * (dx - a1 * s.h) * (dx - a1 * s.h)) + (s.c2 * (dx - a2 * s.h) * (dx - a2 * s.h) * (dx - a2 * s.h));
return (double)res;
}
public double c_function(double a1, double a2, double fi, double fi1, double fi2, double fii, double fii1, double fii2, double hi)
{
double c = 0;
c = (1/(a1*a2*(a2-a1)*hi*hi)) * (((fi-fii)/hi)+(((1+a2)*fi1+(1+a1)*fii1)/3) +(((a2*fi2) - (a1*fii2))*hi/6));
Console.Write("h:");
Console.WriteLine(hi);
Console.Write("c:");
Console.WriteLine(c);
return c;
}
public double a_function(double c1, double c2, double fii2, double fi2, double h)
{
double a = 0;
a = ((fii2 - fi2)/h - 6*a2*c1 - 6*a1*c2);
return a;
}
}
Метод учета величины скачка функции и/или ее производных при построении кубического сплайна.
Теория и построение
Пусть кубический сплайн, обеспечивающий непрерывность функции и ее производных первого и второго порядков, имеет вид:
(1)
В узлах сетки
(2)
Коэффициенты определяются из условия непрерывности первой и второй производных во внутренних узлах и из граничных условий, предполагая нулевую кривизну сплайна на концах отрезка:
Коэффициенты находятся методом прогонки приведенной выше системы, так как матрица системы трехдиагональна:
(5)
При наличии разрывов производных интерполируемой функции выбор узлов помогает управлять свойствами сплайнов.
В частности, если третья производная функции терпит разрыв в некоторых точках отрезка [a,b], то для улучшения качества аппроксимации эти точки следует включить в число узлов интерполяции.
Если разрывна вторая производная , то для того, чтобы избежать осцилляции сплайна вблизи точек разрыва, необходимо принять специальные меры. Обычно узлы интерполяции выбирают так, чтобы точки разрыва второй производной попадали внутрь промежутка , такого, что , где
Если первая производная разрывна, следует разбить отрезок аппроксимации на промежутки, где производная непрерывна, и на каждом из этих промежутков построить сплайн.
Такие процедуры позволяют улучшить сходимость интерполяционной функции, однако они усложняют процедуру интерполяции за счет существенного увеличения числа узлов интерполяции.
Рассмотрим другую возможность учета разрывов как самой функции, таки и ее производных, которая заключается во введении величины скачка в систему уравнений (2-5) для определения коэффициентов кубического сплайна.
При наличии разрывов функции в некоторых точках отрезка [a,b] внесем следующие изменения в построение сплайна. Значение сплайна и/или его производных слева от точки разрыва принимаем равным значению интерполируемой функции в этом узле слева, а величину скачка относим к последующему сплайну. Таким образом, для нахождения коэффициентов в узлах, соответствующих разрывам, вместо (2-5) имеем следующую систему уравнений:
Такой метод учета разрывов позволяет интерполировать функции без увеличения количества узлов и с наименьшей осцилляцией возле разрыва, что значительно упрощает использование сплайнов.
Примеры
Для сравнения взята кусочно-заданная функция, которая при x<=2,4 y = x^2, а при x>2,4
y = -x^2
Это естественный кубический сплайн h = 0.2
А это уже сплайн, с учетом скачка, по графикам видно, что осцилляции, хоть и не ушли, но заметно уменьшились.
Та же функция, но с шагом h = 0.025
Естественный кубический сплайн
Сплайн с учетом скачка, с таким шагом осцилляции слева от точки разрыва практически отсутствуют, а справа хоть и остались, но стали заметно меньше.
Код решения на C#
class SplineD : Builder
{
SplineSegment[] segments;
List<PointDouble> points;
int n;
/// <summary>
/// Конструктор SplineBuilder
/// </summary>
/// <param name="n">Количество узлов сетк</param>
/// <param name="_points">Значения в узлах</param>
public SplineD(int _n, List<PointDouble> _points, List<PointExtremum> _extremums)
{
double D = 0;
n = _n;
points = _points;
foreach (PointExtremum p in _extremums)
{
int k = n - 1;
for (int i = 0; i < k; ++i)
{
if (p.p.x > points[i].x && p.p.x < points[i + 1].x)
{
points.Insert(i+1,p.p);
k++;
break;
}
}
}
n = points.Count;
segments = new SplineSegment[n];
for (int i = 0; i < n; ++i)
{
segments[i].x = points[i].x;
segments[i].a = points[i].y + D;
}
segments[0].c = 0;
segments[n - 1].c = 0;
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)
{
foreach (PointExtremum pex in _extremums)
{
if (pex.p.x == points[i].x)
{
D = pex.D;
}
else
{
D = 0;
}
}
double hi = points[i].x - points[i - 1].x;
double hi1 = points[i + 1].x - points[i].x;
double A = hi;
double C = 2.0 * (hi + hi1);
double B = hi1;
double F = 6.0 * ((points[i + 1].y - points[i].y + D) / hi1 - (points[i].y - points[i - 1].y) / 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)
{
segments[i].c = alpha[i] * segments[i + 1].c + beta[i];
}
for (int i = n - 1; i > 0; --i)
{
double hi = points[i].x - points[i - 1].x;
segments[i].d = (segments[i].c - segments[i - 1].c) / hi;
segments[i].b = hi * (2.0 * segments[i].c + segments[i - 1].c) / 6.0 + (points[i].y - points[i - 1].y + D) / hi;
}
}
public List<PointDouble> getPoints
{
get { return points; }
}
public SplineSegment[] getSpline
{
get { return segments; }
}
public double Interpolate(double x)
{
if (segments == null)
{
return double.NaN; // Если сплайны ещё не построены - возвращаем NaN
}
int n = segments.Length;
SplineSegment s;
if (x <= segments[0].x) {
s = segments[1];
}
else if (x >= segments[n - 1].x) {
s = segments[n - 1];
}
else
{
int i = 0;
int j = n - 1;
while (i + 1 < j)
{
int k = i + (j - i) / 2;
if (x <= segments[k].x)
{
j = k;
}
else
{
i = k;
}
}
s = segments[j];
}
double dx = x - s.x;
return s.a + (s.b + (s.c / 2.0 + s.d * dx / 6.0) * dx) * dx;
}
}
Эффект Гиббса для сплайн - интерполяции
Пусть - функция вида
Рассмотрим кубический интерполяционный сплайн для . Пусть и - кубический сплайн с узлами ), интерполирующий в точках , т.е. ; в каждом является алгебраическим многочленом третей степени, удовлетворяющим краевым условиям или и (. Тогда в окрестности точки a имеет место эффект Гиббса, точнее
Теорема. Для
Следствие. Для имеемпри (число узлов)
Обозначим через Q класс функций , кусочно-непрерывных на промежутке , которые имеют на нем конечное число разрывов I рода, . Для любой справедливо
Так как интерполяционный оператор является линейным оператором, то из сходимости интерполяционных кубических и параболических сплайнов при равномерной сетке для любой непрерывной функции получаем:
Теорема. Пусть , тогда для параболической и кубической сплайн-интерполяции при равномерной сетке и при нулевых краевых условиях для вторых производных сплайна в концах интервала имеем сходимость интерполяционного сплайна к функции ( - число узлов интерполяции)
В точках разрывов функции имеет место эффект Гиббса величиной скачка для параболического и для кубического сплайнов.
При интерполяции функции со скачками кубическим сплайном класса возникают вблизи точки разрыва осцилляции, амплитуда которых при не затухает, а стремится к константе. Это явление называется эффектом Гиббса.
Для кубического сплайна с дополнительными узлами эффект Гиббса отсутствует
точка разрыва в середине интервала.
Осцилляция ослабляется при уменьшении . При имеем эрмитов кубический сплайн, который не имеет осцилляций.
Примеры
Естественный сплайн для параметрической функции, описанной выше, h=0.2
А это сплайн с дополнительными узлами для той же функции.
Из графиков видно, что у сплайна с дополнительными узлами отсутствуют осцилляции в области точки разрыва, однако видны ошибки вызванные вычислениями при подходе слева к точке разрыва.
Заключение
Целью данной работы был анализ методов интерполяции разрывных функций, а также функций, имеющих разрыв производных до второго порядка включительно, с помощью кубических сплайнов дефекта 1.
Были рассмотрены следующие варианты:
Естественный кубический сплайн;
Кубический сплайн с дополнительными узлами;
Метод введения величины скачка в построение кубического сплайна.
Для некоторых случаев приведена теоретическая оценка погрешностей интерполяции.
Кроме того, были проанализированы практические реализации вышеуказанных методов, разработанные с помощью языка С# и платформы .NET.
Для каждого метода были разработаны соответствующие алгоритмы, собранные в единый проект. Однако, следует заметить, что каждый разработанный алгоритм является полностью самостоятельным и может быть использован в любой другой программе. Также, для наглядности в проект была включена графическая составляющая, представляющая собой график интерполируемой функции и график соответствующего сплайна. Для графического представления в проекте была использована библиотека ZedGraph.
Реализованные методы применимы для решения задач интерполяции, где требуется высокая скорость вычислительных процессов и/или низкая затратность ресурсов ЭВМ.
Однако, следует учитывать, что для некоторых задач, где требуется высокая точность вычислений представленные реализации следует использовать с осторожностью, в силу возможных ошибок вычисления, связанных с реализацией компилятора и чисел с плавающей запятой. Такими задачами, например, могут быть задачи анализа экономических процессов или каких-либо финансовых вычислений.
В ходе практического анализа было выведено: для разрывных функций лучше всего применять метод введения скачка, однако в случае с разрывами производных его применение является не очень целесообразным, т.к. при достаточно малом шаге, при выборе узлов сетки, работа метода мало отличается от естественного кубического сплайна. Что касается метода с дополнительными узлами, то, несмотря на теоретическое обоснование, его реализация на ЭВМ порождает дополнительные погрешности, которые в некоторых случаях сводят на нет суть метода, а в отдельных заметно ухудшают результаты. Хотя метод с дополнительными узлами можно использовать, если проводить интерполирование не всего интересующего промежутка, а частей, на которых интерполируемая функция непрерывная вплоть до второй производной. Также возможна реализация метода с дополнительными узлами с помощью других стандартов представления чисел с плавающей запятой, которая, возможно, даст лучшие результаты.
Литература
1.Завьялов Ю.С., Квасов Б.И., Мирошниченко В.Л. Методы сплайн-функций -- Москва: Наука 1980
2. Е.С. Полубояринова, Г.З. Шарафутдинов Об интерполяции разрывных функций при помощи сплайнов --Москва: Информационные технологии и программирование, межвузовский сборник статей, выпуск 2(11). 2004
3. Роджерс Д., Адамс Дж. Математические основы машинной графики. --М.: Мир, 2001
4. Е. П. Жидков, А. С. Андреев, В. А. Попов Эффект Гиббса для сплайн-интерполяции и для численного решения интегральных уравнений методом сплайн-коллокации -- Дубна: ОИЯИ 1983
Размещено на Allbest.ru
...Подобные документы
Обзор методов вычисления кубического корня: численные, метод интеграций и другие. Оценка их преимуществ и недостатков Математическое представление задачи вычисления значений кубического корня, описание системы реализации. Примеры работы программы.
курсовая работа [486,3 K], добавлен 14.12.2012Интерполирование рабочих точек в пакете Mathcad с помощью полиномов (канонического, Лагранжа и Ньютона) и сплайнов (линейного, квадратичного, кубического). Реализация программы для решения системы линейных алгебраических уравнений на языке Pascal.
лабораторная работа [202,8 K], добавлен 15.11.2012Интерполяция данных с использованием значений функции, заданной множеством точек, для предсказания значения функции между ними. Результаты линейной интерполяции в графическом виде. Кубическая сплайн-интерполяция. Функции для поиска вторых производных.
презентация [2,7 M], добавлен 29.09.2013Сущность теории приближений и характеристика интерполяции как процесса получения последовательности интерполирующих функций. Полиномы Эрмита и интерполирование с кратными узлами. Программная разработка приложения по оценке погрешности интерполирования.
курсовая работа [1,1 M], добавлен 05.06.2014Понятие и характеристика некоторых методов интерполяции. Вычисление значения функции между заданными точками несколькими методами. Алгоритм линейной интерполяции. Алгоритм локальной интерполяции по формуле Лагранже. Инструкция пользования программой.
курсовая работа [186,5 K], добавлен 30.05.2015Получение навыков работы в Mathcad при использовании интерполяции и регрессии. Постройте функции сглаживания и предсказания данных с помощью различных встроенных функций. Применение операций как калькулятор, математический анализ, матрица и вычисление.
лабораторная работа [205,1 K], добавлен 23.12.2014Разработка программы AutoCAD как двух- и трёхмерная система автоматизированного проектирования и черчения. Использование элементарных графических примитивов: точки, отрезка, круга, дуги, прямой, эллипса, сплайна, полилинии, мультилинии и мультитекста.
реферат [147,7 K], добавлен 22.11.2011Роль интерполяции функций в вычислительной математике. Реализация интерполирования функций полиномом Лагранжа в программном продукте MatLab. Интерполяционная формула Лагранжа. Интерполяция по соседним элементам, кубическими сплайнами. Анализ результатов.
курсовая работа [1,4 M], добавлен 10.06.2012Алгоритм решения систем линейных уравнений методом Гаусса, его этапы. Система уравнений для определения коэффициентов сплайна, представляющая собой частный случай систем линейных алгебраических уравнений. Программная реализация, тестовый пример.
курсовая работа [431,8 K], добавлен 15.06.2013Исследование методов интерполяции функции и разработка программного продукта для автоматизации расчётов, выполняемых в данных методах. Обоснование выбора языка программирования. Требования к программе и программному изделию. Организация работы с ПЭВМ.
дипломная работа [2,1 M], добавлен 16.06.2017Назначение и возможности пакета MATLAB. Цель интерполирования. Компьютерная реализация решения инженерной задачи по интерполяции табличной функции различными методами: кусочно-линейной интерполяцией и кубическим сплайном, а также построение их графиков.
контрольная работа [388,3 K], добавлен 25.10.2012Написание программы решения технических задач языком высокого уровня Си: определение мольной теплоемкости кислорода методом интерполяции. Построение математических моделей, графиков и таблиц по результатам расчетов, составление текста программы.
курсовая работа [382,9 K], добавлен 19.05.2011Составление алгоритма и программного обеспечения для реализации конечноразностных интерполяционных формул Ньютона, Гаусса и Стирлинга. Описание метода полиномиальной интерполяции. Изучение метода оптимального исключения для решения линейных уравнений.
курсовая работа [19,8 K], добавлен 25.12.2013Интерполяция методом наименьших квадратов. Построение функции с применением интерполяционного многочленов Лагранжа и Ньютона, кубических сплайнов. Моделирование преобразователя давления в частоту в пакете LabVIEW. Алгоритм стандартного ПИД-регулятора.
курсовая работа [2,7 M], добавлен 20.04.2011Назначение и возможности пакета MATLAB, его основные составляющие. Набор вычислительных функций. Роль интерполяции функций в вычислительной математике. Пример интерполяции с четырьмя узлами. Интерполирование и сглаживание, схемы решения задач в MATLAB.
курсовая работа [594,5 K], добавлен 28.12.2012Поиск коэффициентов кубического уравнения. Расчет количества итераций для заданной погрешности по реккурентному соотношению. Заполнение матрицы по условию. Поиск наибольшего целочисленного элемента массива, не имеющего себе равных в другом массиве.
контрольная работа [52,7 K], добавлен 20.12.2012Решение нелинейного уравнения вида f(x)=0 с помощью программы Excel. Построение графика данной функции и ее табулирование. Расчет матрицы по исходным данным. Проведение кусочно-линейной интерполяции таблично заданной функции с помощью программы Mathcad.
контрольная работа [1,8 M], добавлен 29.07.2013Выбор наиболее эффективного метода поиска экстремума для функции. Оценка погрешности определения точки минимума. Проверка унимодальности уравнения аналитическим методом и по графику. Сравнение алгоритмов по количеству обращений к функции и по точности.
контрольная работа [909,0 K], добавлен 14.08.2019Математический набор. Запуск Equation Editor. Построение образца формулы. Создание кубического корня. Вставка формулы в подкоренное выражение. Построение формулы в знаменателе. Текстовые эффекты. Печать документов.
лабораторная работа [320,9 K], добавлен 10.03.2007Разработка программы нахождения значения определенного интеграла с помощью метода трапеций. Оценка абсолютной погрешности метода. Использование среды программирования Visual Studio Community 2015 для написания программы. Работа с графическим интерфейсом.
курсовая работа [573,8 K], добавлен 17.03.2016