
chisl_methods_lab3
.docxЛабораторная работа №3
Интерполяция функций. Интерполяционные полиномы Лагранжа, Ньютона.
Пусть
есть прибор, который в дискретные моменты
времени выдает сигнал по закону
.
Допустим, наблюдатель зарегистрировал
пять отсчетов в моменты времени
.
Задачей наблюдателя (который не знает
закона выдачи сигнала) яsвляется
получение приближенного значения
функции на отрезке [0,1] в любой момент
времени.
Используя линейную интерполяцию, найдите
значения функции в точках:
и сравните с реальным значением синуса
в этих точках. Постройте графики синуса
и ломаной, проходящей через пять заданных
точек. Отметьте, насколько сильно они
различаются в разных частях графика.
Чем это обусловлено?
function y = interpol( X, Y, x)
for i=1:length(X-1)
if (x>=X(i) && x<=X(i+1))
k=(Y(i+1)-Y(i))/(X(i+1)-X(i));
y=Y(i)+k*(x-X(i));
return; end; end; end
f=@(t)sin(pi*t); i=0:4; Ti=i./4; Fi=f(Ti);
intf=@(x)(interpol(Ti, Fi, x));
X=[0 1/6 1/3 1/2];
Y=zeros(size(X));
YR=zeros(size(X));
for i=1:length(X)
Y(i)=intf(X(i));
YR(i)=f(X(i));
end
[X; Y; YR; abs(Y-YR)]
hold on; grid on;
fplot(f, [0 1]);
fplot(intf, [0 1], 'r');
plot(Ti, Fi, '*');
Постройте по заданным пяти точкам интерполяционный многочлен Лагранжа или Ньютона и, используя его, найдите значения функции в точках . Сравните результаты со значениями, полученными при линейной интерполяции, и значениями синуса в этих точках. Постройте графики синуса и интерполяционного многочлена. Какую максимальную ошибку мы допускаем при аппроксимации синуса данным полиномом? Сравните экспериментальную погрешность с теоретической.
function y = interpol2( X, Y, x )
A=repmat(X.', 1, length(X)).^repmat([0:length(X)-1], length(X), 1);
M=A\Y.';
y=(repmat(x', 1, length(X)).^repmat([0:length(X)-1], length(x), 1))*M;
end
f=@(t)sin(pi*t);
i=0:4;
Ti=i./4;
Fi=f(Ti);
X=[0:0.05:1];
Y=interpol2(Ti, Fi, X);
hold on; grid on;
plot(X, Y, 'r');
fplot(f, [0 1]);
plot(Ti, Fi, '*');
Найдите
значение интерполяционного полинома
при
.
Почему оно так сильно отличается от
значения синуса в этой точке?
function yy = newton(x, y, xx)
N = length(x);
DIFF = y;
for k = 1 : N-1
for i = 1: N - k
DIFF(i) = (DIFF(i+1) - DIFF(i)) / (x(i+k) - x(i));
end
end
yy = DIFF(1) * ones(size(xx));
for k = 2 : N
yy = DIFF(k) + (xx - x(k)) .* yy;
end
>> newton(x,y,2)
ans =
8.4710
>> sin(pi*2)
ans =
-2.4493e-016
Задайте
функцию
на отрезке [-1, 1] в десяти равноотстоящих
точках. Сравните значения функции и
интерполяционного полинома при x=0.95.
Постройте графики функции и полинома
на заданном отрезке и объясните поведение
интерполяционного полинома. Посмотрите,
что будет происходить при постепенном
увеличении числа узлов интерполяции и
подумайте, как можно избавиться от
получившегося эффекта.
syms z
x = -1:.2:1;
f=1/(1+25*z^2);
y = 1./(1+25*x.^2) ;
xi = .95;
yi = newton(x,y,xi);
plot(x,y,'o','linewidth',2);
hold on;
plot(xi,yi,'*k','linewidth',3);
hold on;
xi=x(1):0.01:x(length(x));
yi = newton(x,y,xi);
plot(xi,yi,'k-');
plot(xi,abs(subs(f,xi)-yi),'g-');
grid on;
plot([min(x) max(x)],[0 0],'-k');
max(abs(subs(f,xi)-yi))
xlabel('x');
ylabel('y');
ezplot('1/(1+25*x^2)',[-2 2]);
axis equal
Шаг 0.2
ans =
1.9156
Шаг 0.1
ans =
58.5855
Шаг 0.05
ans =
1.0437e+005
Для одной половины с шагом 0.1