Интерполирование таблично заданных функций полиномами и сплайнами
Интерполирование рабочих точек в пакете Mathcad с помощью полиномов (канонического, Лагранжа и Ньютона) и сплайнов (линейного, квадратичного, кубического). Реализация программы для решения системы линейных алгебраических уравнений на языке Pascal.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 15.11.2012 |
Размер файла | 202,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Введение
Цель работы
Освоить интерполирование таблично заданных функций полиномами и сплайнами.
Задание
Дан массив A[0..30].
1. Рабочие точки интерполировать в пакете Mathcad с помощью канонического полинома, полинома Лагранжа, Ньютона. Оценить близость интерполяционной функции к контрольным точкам с помощью СКО:
,
где - разность между ординатами контрольной точки и интерполяционного полинома, n=15.
2. Рабочие точки интерполировать в пакете Mathcad с помощью линейного, квадратичного, кубического сплайнов. Оценить близость интерполяционного сплайна к контрольным точкам, рассчитав значение среднеквадратического отклонения (СКО). Выбрать наилучший с этой точки зрения сплайн.
3. Реализовать на языке высокого уровня интерполяцию линейным сплайном массива рабочих точек.
Теория
Интерполяция - операция приближения функции, заданной в отдельных точках внутри некоторого заданного промежутка.
Простейшая задача интерполяции заключается в следующем: на отрезке [a;b] заданы (n+1) точек которые называются узлами интерполяции, а также заданы значения некоторой функции f(x) в этих точках:
Требуется построить интерполирующую функцию F(x), принимающую в узлах интерполяции те же значения, что и f(x) т.е. :
Геометрически это означает, что нужно найти некоторую кривую y=F(x) определённого типа, проходящую через заданную систему точек , где .
В такой постановке задача интерполяции, может иметь бесчисленное множество решений, однако задача становится однозначной, если вместо произвольной функции F(x) искать полином Pn(x) степени n, удовлетворяющий условиям:
Полученную интерполяционную формулу обычно используют для приближенного вычисления значений данной функции f(x) в точках х, которые отличны от узлов интерполирования. Такая операция называется интерполяцией функции.
Наиболее часто используемые интерполяционные полиномы:
1. Канонический полином;
2. Полином Лагранжа;
3. Полином Ньютона.
Канонический полином
Будем искать интерполирующую функцию F(x) в виде канонического полинома степени n:
Выбор многочлена степени n основан на том факте, что через (n+1) точку проходит единственная кривая степени n. Подставив в , получим СЛАУ:
Решая эту систему относительно переменных , найдём коэффициенты интерполяционного полинома.
Полином Лагранжа
Будем искать его в виде:
где ) - функция, удовлетворяющая в узлах следующему свойству:
Таким образом, полином Лагранжа выражается следующей формулой:
Полином Ньютона
Ньютон предложил записать интерполирующую функцию в виде следующего полинома n-1 степени:
Нам известно, что . Подставим это значение в полином, вычислив тем самым значение коэффициента
Подставим в полином, для вычисления воспользуемся следующим соотношением:
, отсюда
где - разделенная разность первого порядка, которая стремится к первой производной функции при . Аналогичным образом можно найти остальные разделённые разности первого порядка.
Все полученные результаты более наглядно можно представить в виде таблицы:
x |
F(x) |
1 |
… |
n |
|
… |
… |
… |
|||
… |
… |
||||
… |
… |
… |
… |
… |
|
… |
Основную роль в данной таблице играют диагональные элементы, которыми являются коэффициенты A0, A1,…,An. Остальные являются вспомогательными.
Все три рассмотренных полинома - это три различных способа построения одной и той же кривой:
Полином Лагранжа считается целесообразным использовать в тех случаях, когда задано небольшое количество точек. В остальных случаях рекомендуется использовать полином Ньютона.
Интерполяция сплайнами
Сплайн-функция- специальным образом построенная гладкая кусочно-полиномиальная функция, средство интерполяции сложных кривых.
Пусть дан отрезок [a,b], который разбит точками на n частичных отрезков . Тогда сплайном степени m называется функция , обладающая следующими свойствами:
1) Функция , непрерывна на отрезке [a,b] вместе со всеми своими производными до некоторого порядка p:
2) На каждом частичном отрезке функция совпадает с некоторым полиномом
Разность (m-p) между степенью сплайна и наивысшим порядком производной называется дефектом сплайна.
Линейная интерполяция
В случае линейной интерполяции сплайном является линейная функция для отрезков .
Коэффициенты a и b в этом случае рассчитываем по формулам:
Найдя коэффициенты, можно рассчитать значения функции в любой точке интервала .
Решение СЛАУ в математическом пакете Mathcad
Задаем массивы:
Точки массива:
Выделим рабочие точки:
Сформируем матрицу А путём создания СЛАУ и решением её методом LU разложения. Получившиеся ответы и будут значениями матрицы.
Получим интерполяционный полином:
Оценим близость интерполяционной функции к контрольным точкам с помощью СКО:
Посчитаем коэффициент r:
и подставим его:
Вычисляем коэффициенты с помощью линейного сплайна:
Вычислим значения в точках, выполнив интерполирование:
Снова оценим близость интерполяционной функции к контрольным точкам с помощью СКО:
Вычисляем коэффициенты с помощью квадратичного сплайна:
Оцениваем близость интерполяционной функции к контрольным точкам с помощью СКО:
Вычисляем коэффициенты с помощью кубического сплайна:
Оцениваем близость интерполяционной функции к контрольным точкам с помощью СКО:
- ближе всех интерполяция к контрольным точкам получилась при использовании метода кубических сплайнов.
Листинг и результат работы программы
интерполирование полином сплайн уравнение
Для решения системы линейных алгебраических уравнений я использовал алгоритмический язык Паскаль.
program Spline;
uses Crt, Graph;
{Структура, описывающая сплайн на каждом сегменте сетки}
type SplineTuple=record
a, b, c, d, x:real;
end;
const
n_max=100; {Максимальный размер массива}
var
Gd,Gm: integer; {Графические драйвер и мод}
PathToDriver: string;
splines: array[0..n_max-1] of SplineTuple; {Сплайн}
x,y: array[0..n_max-1] of real;
cur_x: real;
n:integer;
{Построение сплайна}
{x - узлы сетки, упорядоченные по возрастанию}
{y - значения функции в узлах сетки}
{n - количество узлов сетки}
Procedure BuildSpline;
var i:integer;
alpha:array[0..n_max-1] of real;
beta:array[0..n_max-1] of real;
h_i:real;
h_i1:real;
A:real;
C:real;
B:real;
F:real;
z :real;
begin
{Инициализация массива сплайнов}
for i:=0 to n-1 do
begin
splines[i].x := x[i];
splines[i].a := y[i];
end;
splines[0].c:=0;
splines[n - 1].c:=0;
{Решение системы линейных уравнений относительно коэффициентов сплайнов}
{Вычисление прогоночных коэффициентов - прямой ход метода}
alpha[0]:=0;
beta[0] :=0;
for i:=1 to n-2 do
begin
h_i := x[i] - x[i - 1];
h_i1:= x[i + 1] - x[i];
A:= h_i;
C:= 2.0 * (h_i + h_i1);
B:= h_i1;
F:= 6.0 * ((y[i + 1] - y[i]) / h_i1 - (y[i] - y[i - 1]) / h_i);
z:= (A * alpha[i - 1] + C);
alpha[i]:= -B / z;
beta[i]:= (F - A * beta[i - 1]) / z;
end;
{Нахождение решения - обратный ход метода прогонки}
for i:=n-2 downto 1 do
splines[i].c := alpha[i] * splines[i + 1].c + beta[i];
{По известным коэффициентам c[i] находим значения b[i] i d[i]}
for i:=n-1 downto 1 do
begin
h_i:= x[i] - x[i - 1];
splines[i].d:= (splines[i].c - splines[i - 1].c) / h_i;
splines[i].b:= h_i * (2.0 * splines[i].c + splines[i - 1].c) / 6.0 + (y[i] - y[i - 1]) / h_i;
end;
end;
{Вычисление значения интерполяционной функции в произвольной точке}
function Func(x:real):real;
var
s:SplineTuple;
i,j,k:Integer;
dx:real;
begin
if (x <= splines[0].x) then
{Если x меньше точки сетки x[0]}
s := splines[1]
else if (x >= splines[n - 1].x) then
{Если x больше точки сетки x[n - 1] - пользуемся последним элементом массива}
s := splines[n - 1]
else {Иначе x лежит между граничными точками сетки, то производим бинарный поиск нужного элемента массива}
begin
i:= 0;
j:= n - 1;
while (i + 1 < j) do
begin
k:= i + (j - i) div 2;
if (x <= splines[k].x) then
j:= k
else
i:= k;
end;
s := splines[j];
end;
dx:= (x - s.x);
{Вычисление значения сплайна в заданной точке по схеме Горнера}
Func:=s.a + (s.b + (s.c / 2.0 + s.d * dx / 6.0) * dx) * dx;
end;
begin
ClrScr;
Gd:=Detect;
Gm:=0;
PathToDriver:='';
InitGraph(gd,gm,PathToDriver); {Инициализируем графику}
if GraphResult<>grok then halt;
n:=16;
x[0]:=0;y[0]:=260;
x[1]:=20;y[1]:=260;
x[2]:=40;y[2]:=300;
x[3]:=60;y[3]:=270;
x[4]:=80;y[4]:=330;
x[5]:=100;y[5]:=230;
x[6]:=120;y[6]:=250;
x[7]:=140;y[7]:=220;
x[8]:=160;y[8]:=210;
x[9]:=180;y[9]:=170;
x[10]:=200;y[10]:=150;
x[11]:=220;y[11]:=230;
x[12]:=240;y[12]:=180;
x[13]:=260;y[13]:=190;
x[14]:=280;y[14]:=220;
x[15]:=300;y[15]:=150;
BuildSpline;
cur_x:=100;
MoveTo(Round(cur_x),Round(Func(cur_x)));
while (cur_x<300) do
begin
cur_x:=cur_x+0.1;
LineTo(Round(cur_x),Round(Func(cur_x)));
MoveTo(Round(cur_x),Round(Func(cur_x)));
end;
ReadKey;
CloseGraph;
END.
Результат работы программы
Вывод
В результате выполнения данной лабораторной работы были исследованы различные методы интерполяции функции, которые были заданы табличным путем. Согласно алгоритму, изложенному в книге Мудрова А.Е. «Численные методы для ПВЭМ на языках высокого уровня», написана программа на языке высокого уровня Pascal. Реализовано решение в математическом пакете Mathcad. Наиболее точным был результат, который получен при выполнении интерполяции линейным сплайном, по причине наименьшей величины СКО.
Литература
1. Мудров А.Е., «Численные методы для ПЭВМ на языках Бейсик, Фортран и Паскаль».- Томск: МП «РАСКО», 1991.-272 с.: ил.
Размещено на Allbest.ru
Подобные документы
Общие сведения о системе Mathcad. Окно программы Mathcad и панели инструментов. Вычисление алгебраических функций. Интерполирование функций кубическими сплайнами. Вычисление квадратного корня. Анализ численного дифференцирования и интегрирования.
курсовая работа [522,7 K], добавлен 25.12.2014Метод Гаусса-Зейделя как модификация метода Якоби, его сущность и применение. Разработка программы решения системы линейных алгебраических уравнений на языке VB, проверка правильности работы программы в MS Excel и математических пакетах MathCad и MatLab.
курсовая работа [325,5 K], добавлен 27.10.2013Возможности математического пакета MathCad в среде Windows 98 для использования матричной алгебры и решения системы линейных алгебраических уравнений. Методы решения систем линейных алгебраических уравнений. Сравнение метода Гаусса с методом MathCad.
практическая работа [62,6 K], добавлен 05.12.2009Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.
лабораторная работа [23,5 K], добавлен 23.09.2014Преобразование матрицы системы линейных алгебраических уравнений (СЛАУ) с помощью алгоритма Гаусса. Решение задачи методом простой итерации. Создание блок-схемы и текста программы для решения СЛАУ, реализованной на языке программирования Turbo Pascal.
курсовая работа [1,2 M], добавлен 15.06.2013Интерполирование функций методом Лагранжа. Получение функциональной зависимости по экспериментальным данным. Близость интерполяционного многочлена к заданной функции. Интерполяционный полином в форме Лагранжа. Построение интерполяционных графиков.
лабораторная работа [315,8 K], добавлен 24.05.2014Сущность и особенности языка программирования Си. Основные этапы алгоритма решения системы линейных алгебраических уравнений методом Гаусса, реализация программы для их расчета. Инструкции пользователя и программиста. Тестирование функции решения.
курсовая работа [153,9 K], добавлен 18.02.2013Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Способы решения системы дифференциальных, нелинейный и линейных уравнений. Понятие интерполирования и аппроксимации. Основные принципы линейного программирования. Сущность и условия применения трендового анализа. Алгоритм создания электронной таблицы.
курсовая работа [2,0 M], добавлен 02.01.2012Особенности решения уравнений с одной переменной методом половинного деления. Оценка погрешности метода простой итерации. Суть решения уравнений в пакете Mathcad. Векторная запись нелинейных систем. Метод Ньютона решения систем нелинейных уравнений.
курсовая работа [2,1 M], добавлен 12.12.2013