Титульный лист

Лабораторная работа по теме "Построение интерполяционных многочленов Эрмита "

Оглавление

Задание. 3

Постановка задачи. 3

Анализ задания. 3

Текст программы.. 4

скрипт lb5.m.. 4

скрипт Hpoly. m.. 5

Формулы найденных полиномов. 6

График функций. 6

Анализ результатов. 6

Задание

Построить таблицу разделенных разностей и интерполяционные многочлены Эрмита для функции

взяв в качестве узлов интерполяции x0=0 и x1=10.

Интерполяционные многочлены построить для следующих трех случаев:

1)  Узел x0 двухкратный, узел x1 однократный;

2)  Узел x0 однократный, узел x1 двухкратный;

3)  Узел x0 двухкратный, узел x1 двухкратный;

В отчет включить постановку задачи, таблицы разделенных разностей, формулы полиномов, для каждого случая, графики исходной и интерполирующих функций. Для каждого из3 случаев оценить погрешность аппроксимации.

Постановка задачи

Согласно известным алгоритмам строим полиномы Эрмита, оцениваем погрешность и строим соответствующие графики.

Анализ задания

Функцию исходную задаем при помощи скрипт-файла f. m. График исходной функции строится с ее использованием – задается вектор x и вектор y абсцисс и ординат исходной функции.

В качестве вектора узлов интерполяции сначала задаем вектор ksi1 [0 0 10]. Для этого вектора находим ему соответствующий вектор y1, значения которого – значения функции f(x) в точках ksi1. Также задаем вектор значений первой производной в них, dy1. Затем пользуемся отдельной функцией Hpoly строим на базе значений функции и производной полином Эрмита третей степени. Сама функция написана так, чтобы работала не на интервале из двух точек, а на интервале, разбитом на большее число точек, для примера график такой интерполяции приведен в конце отчета. Здесь же в функции строится кривая, задаваемая полиномом, и выводятся значения коэффициентов полинома на график:

НЕ нашли? Не то? Что вы ищете?

http://matlab.exponenta.ru/spline/book1/12_files/002.gif

Погрешность оценивается как максимальное абсолютное отклонение найденного полинома от исходной функции.

Аналогичные действия повторяем и для других случаев.

Графики строим обычным способом, задавая несколько линий на одном объекте figure, а также оформляя график с использованием операндов legend, xlabel, ylabel, title.

Также в программе приведен пример построения многочлена Эрмита встроенной функцией Pchip.

Текст программы

скрипт lb5.m

% создание графического окна и осей

figure('Color','w')

axes

title('Интерполяция Эрмита при разной кратности узлов')

ksi1=[0 0 10];

y1 = f(ksi1);

disp('Интерполяция встроенной функцией pchip по узлам 0 5 10')

% вывод данных маркерами

subplot(2,2,1);

plot(ksi1,y1,'ro')

hold on;

x=0:0.1:10;

y=f(x);

plot(x, y,'-b');

hold on

yy = pchip([0 5 10], f([0 5 10]), x);

plot(x, yy,'--g');

disp('максимальная абсолютная погрешность')

e0=max(yy-y)

legend('точки интерполяции','исходная f(x)','интерполяция Эрмита pchip',4)

subplot(2,2,2);

disp('Интерполяция по узлам 0 0 10')

dy1=12.5*exp(-0.5*ksi1)./(5*exp(-0.5*ksi1)+1).^2;

plot(ksi1,y1,'ro')

hold on;

Hpoly(ksi1,y1,dy1)

hold on;

legend('исходная f(x)','x_0 ^(^2^) x_1 ^(^1^)', 4)

subplot(2,2,3);

disp('Интерполяция по узлам 0 10 10')

ksi2=[0 10 10];

y2 = f(ksi2);

plot(ksi2,y2,'ro')

hold on;

dy2=12.5*exp(-0.5*ksi2)./(5*exp(-0.5*ksi2)+1).^2;

Hpoly(ksi2,y2,dy2)

hold on;

legend('исходная f(x)','x_0 ^(^1^) x_1 ^(^2^) ', 4)

subplot(2,2,4);

disp('Интерполяция по узлам 0 0 10 10')

ksi3=[0 0 10 10];

y3 = f(ksi3);

plot(ksi3,y3,'ro')

hold on;

dy3=12.5*exp(-0.5*ksi3)./(5*exp(-0.5*ksi3)+1).^2;

Hpoly(ksi3,y3,dy3)

hold on;

legend('исходная f(x)','x_0 ^(^2^) x_1 ^(^2^)', 4)

скрипт Hpoly. m

function Hpoly(x, y,y1)

% определение числа узлов

n=length(x);

% нахождение всех коэффициентов a(k) и b(k)

a = y;

b = y1;

% вычисление разделенных разностей

DivDif = diff(y)./diff(x);

d=diff(x);

for i=1:length(DivDif)

if d(i)==0

DivDif(i)=y1(i)/1;

end

end

disp('вектор значений x');

x

disp('Таблица разделенных разностей')

DivDif

% вычисление всех коэффициентов c(k) и d(k)

for k = 1:n-1

c(k) = (3*DivDif(k) - 2*y1(k) - y1(k+1))/(x(k+1)-x(k));

d(k) = (y1(k) - 2*DivDif(k) + y1(k+1))/(x(k+1)-x(k))^2;

end

% построение графиков каждого из полиномов

for k=1:n-1

% вычисление k-го полинома в 30 точках между x(k) и x(k+1)

xx=linspace(x(k),x(k+1),30);

yy=a(k) + b(k)*(xx-x(k)) + c(k)*(xx-x(k)).^2 + d(k)*(xx-x(k)).^3;

err(k)=max(abs(yy-f(xx)));

% выбор случайного цвета

rgbcolor = [rand rand rand];

% построение графика k-го полинома

plot(xx, yy,'Color', rgbcolor,'Linestyle','-')

% вывод коэффициентов k-го полинома

text('Position',[xx(15) yy(15)],...

'String',num2str([a(k); b(k); c(k); d(k)]), 'Color', rgbcolor,...

'VerticalAlignment','middle','HorizontalAlignment','center')

end

disp('максимальная абсолютная погрешность')

max(err)

Формулы найденных полиномов

Ниже приведены найденные программой таблицы разделенных разностей и погрешности интерполяционных полиномов для каждого случая.

Интерполяция встроенной функцией pchip по узлам 0 5 10

максимальная абсолютная погрешность

e0 =

0.3525

Интерполяция по узлам 0 0 10

вектор значений x

x =

0 0 10

Таблица разделенных разностей

DivDif =

0.3472 0.4004

максимальная абсолютная погрешность

ans =

0.3769

Интерполяция по узлам 0 10 10

вектор значений x

x =

0 10 10

Таблица разделенных разностей

DivDif =

0.4004 0.0788

максимальная абсолютная погрешность

ans =

0.3769

Интерполяция по узлам 0 0 10 10

вектор значений x

x =

0 0 10 10

Таблица разделенных разностей

DivDif =

0.3472 0.4004 0.0788

максимальная абсолютная погрешность

ans =

0.3769

Коэффициенты полиномов приведены на графике.

Таким образом, сведем найденную информацию в таблицу

Разделенная разность

Полином

узлы

1 случай

2случай

3 случай


1-2

0.3472

0.4004

0.3472

2-3

0.4004

0.0788

0.4004

3-4

0.0788

погрешность

0.3769

0.3769

0.3769

График функций

Графики исходной заданной функции, и построенных полиномов для разных случаев. Впрочем из графиков видно, что полиномы совпадают.

Пример работы программы если диапазон от 0 до 10 разбить с шагом 2. Каждые две точки соединены интерполяционным полиномом Эрмита третей степени.

Анализ результатов

Согласно примеру можно построить полиномы Эрмитапо несколько другой схеме.

Результат второго расчета:

Интерполяция встроенной функцией pchip по узлам 0 5 10

максимальная абсолютная погрешность

e0 =

0.3525

Интерполяция по узлам 0 0 10

вектор значений ksi1

ksi1 =

0 0 10

Таблица разделенных разностей

DivDif =

0.3472 0.4004

DivDif2 =

0.0053

максимальная абсолютная погрешность

Коэффициенты полинома: 0.83333

Коэффициенты полинома: 0.34722

Коэффициенты полинома:0.0053149

Интерполяция по узлам 0 10 10

вектор значений ksi2

ksi2 =

0 10 10

Таблица разделенных разностей

DivDif =

0.4004 0.0788

DivDif2 =

-0.0322

максимальная абсолютная погрешность

Коэффициенты полинома: 0.83333

Коэффициенты полинома: 0.40037

Коэффициенты полинома:-0.032155

Интерполяция по узлам 0 0 10 10

вектор значений ksi3

ksi3 =

0 0 10 10

Таблица разделенных разностей

DivDif =

0.3472 0.4004 0.0788

DivDif2 =

0.0053 -0.0322

DivDif3 =

-0.0037

максимальная абсолютная погрешность

Коэффициенты полинома: 0.83333

Коэффициенты полинома: 0.34722

Коэффициенты полинома:0.0053149

Коэффициенты полинома:-0.003747

По этим данным можно построить таблицы разделенных разностей, полиномы и указать погрешности

узлы

Разности

Полином

Погрешность

1 порядка

2 порядка

3 порядка

1 случай

1-2

0.3472

0.0053


0.8958

2-3

0.4004

2 случай

1-2

0.4004

-0.0322

3.2155

2-3

0.0788

2 случай

1-2

0.3472

0.0053

3.7470

2-3

0.4004

-0.0322

3-4

0.0788

Графики показаны на рисунке ниже. Видно, что такой подход имеет меньшую точность, чем предложенный выше. Вторая схема представлена в скрипте lb52.m.

Скрипт

% создание графического окна и осей

figure('Color','w')

axes

title('Интерполяция Эрмита при разной кратности узлов')

ksi1=[0 0 10];

y1 = f(ksi1);

disp('Интерполяция встроенной функцией pchip по узлам 0 5 10')

% вывод данных маркерами

subplot(2,2,1);

plot(ksi1,y1,'ro')

hold on;

x=0:0.1:10;

y=f(x);

plot(x, y,'-b');

hold on

yy = pchip([0 5 10], f([0 5 10]), x);

plot(x, yy,'--g');

disp('максимальная абсолютная погрешность')

e0=max(yy-y)

legend('точки интерполяции','исходная f(x)','интерполяция Эрмита pchip',4)

subplot(2,2,2);

disp('Интерполяция по узлам 0 0 10')

dy1=12.5*exp(-0.5*ksi1)./(5*exp(-0.5*ksi1)+1).^2;

plot(ksi1,y1,'ro')

hold on;

%построение полинома

% определение числа узлов

n=length(ksi1);

% нахождение всех коэффициентов

a = y1(1);

% вычисление разделенных разностей

DivDif = diff(y1)./diff(ksi1);

d=diff(ksi1);

for i=1:length(DivDif)

if d(i)==0

DivDif(i)=dy1(i)/1;

end

end

disp('вектор значений ksi1');

ksi1

disp('Таблица разделенных разностей')

DivDif

DivDif2=diff(DivDif)./diff([0 10])

b=DivDif(1);

c=DivDif2(1);

xx=linspace(ksi1(1),ksi1(n),30);

yy=a + b*(xx-ksi1(1)) + c*(xx-ksi1(1)).^2;

disp('максимальная абсолютная погрешность')

err=max(abs(yy-f(xx)))

% выбор случайного цвета

rgbcolor = [rand rand rand];

% построение графика k-го полинома

plot(xx, yy,'Color', rgbcolor,'Linestyle','-')

% вывод коэффициентов k-го полинома

disp(strcat('Коэффициенты полинома:',num2str([a; b; c])))

%полином построен

hold on;

legend('исходная f(x)','x_0 ^(^2^) x_1 ^(^1^)', 4)

subplot(2,2,3);

disp('Интерполяция по узлам 0 10 10')

ksi2=[0 10 10];

y2 = f(ksi2);

plot(ksi2,y2,'ro')

hold on;

dy2=12.5*exp(-0.5*ksi2)./(5*exp(-0.5*ksi2)+1).^2;

%построение полинома

% определение числа узлов

n=length(ksi2);

% нахождение всех коэффициентов

a = y2(1);

% вычисление разделенных разностей

DivDif = diff(y2)./diff(ksi2);

d=diff(ksi2);

for i=1:length(DivDif)

if d(i)==0

DivDif(i)=dy2(i)/1;

end

end

disp('вектор значений ksi2');

ksi2

disp('Таблица разделенных разностей')

DivDif

DivDif2=diff(DivDif)./diff([0 10])

b=DivDif(1);

c=DivDif2(1);

xx=linspace(ksi2(1),ksi2(n),30);

yy=a + b*(xx-ksi2(1)) + c*(xx-ksi2(1)).^2;

disp('максимальная абсолютная погрешность')

err=max(abs(yy-f(xx)))

% выбор случайного цвета

rgbcolor = [rand rand rand];

% построение графика k-го полинома

plot(xx, yy,'Color', rgbcolor,'Linestyle','-')

% вывод коэффициентов k-го полинома

disp(strcat('Коэффициенты полинома:',num2str([a; b; c])))

%полином построен

hold on;

legend('исходная f(x)','x_0 ^(^1^) x_1 ^(^2^) ', 4)

subplot(2,2,4);

disp('Интерполяция по узлам 0 0 10 10')

ksi3=[0 0 10 10];

y3 = f(ksi3);

plot(ksi3,y3,'ro')

hold on;

dy3=12.5*exp(-0.5*ksi3)./(5*exp(-0.5*ksi3)+1).^2;

%построение полинома

% определение числа узлов

n=length(ksi3);

% нахождение всех коэффициентов

a = y3(1);

% вычисление разделенных разностей

DivDif = diff(y3)./diff(ksi3);

d=diff(ksi3);

for i=1:length(DivDif)

if d(i)==0

DivDif(i)=dy3(i)/1;

end

end

disp('вектор значений ksi3');

ksi3

disp('Таблица разделенных разностей')

DivDif

DivDif2=diff(DivDif)./diff([0 10])

DivDif3=diff(DivDif2)./diff([0 10])

b=DivDif(1);

c=DivDif2(1);

dc=DivDif3(1);

xx=linspace(ksi3(1),ksi3(n),30);

yy=a + b*(xx-ksi3(1)) + c*(xx-ksi3(1)).^2+dc*(xx-ksi3(1)).^3;

disp('максимальная абсолютная погрешность')

err=max(abs(yy-f(xx)))

% выбор случайного цвета

rgbcolor = [rand rand rand];

% построение графика k-го полинома

plot(xx, yy,'Color', rgbcolor,'Linestyle','-')

% вывод коэффициентов k-го полинома

disp(strcat('Коэффициенты полинома:',num2str([a; b; c; dc])))

%полином построен

hold on;

legend('исходная f(x)','x_0 ^(^2^) x_1 ^(^2^)', 0)