Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / Лекции / Численные_методы.pdf
Скачиваний:
392
Добавлен:
09.06.2015
Размер:
1.99 Mб
Скачать

69

Глава_5.

Аппроксимация и интерполирование функций

Аппроксимация – это замена одной функции другой функцией, близкой к исходной и обладающей свойствами, позволяющими легко производить над ней различные операции.

Задача интерполирования заключается в следующем: на отрезке

[a;b] задана (n +1)

точка, называемая узлом интерполирования, и

(n +1)

значение функции

в этих точках. Надо построить функцию

F(x) ,

принимающую в узлах интерполирования те же значения, что и исходная функция f (x) .

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

Задача становится однозначной, если вместо произвольной функции строить полином Pn (x) степени n , такой, что:

Pn (xi ) = f (xi ), i = 0, 1,K, n ,

Тогда внутри промежутков (xi , xi+1 ) построенный полином будет приближенно описывать функцию f (x) .

1) Интерполяционный многочлен Лагранжа

Пусть на отрезке [a;b] заданы точки x0 , x1 ,K, xn и значения функции

f (x) в

этих точках.

Будем

строить

интерполяционный многочлен

вида

n

 

 

 

 

 

 

 

 

 

 

 

 

Pn (x) = f (x j )Фj (x) , где

Фj (x),

j = 0,1,K, n

- многочлены

 

n -ой степени,

j=0

 

 

 

 

 

 

 

 

 

 

 

 

удовлетворяющие условиям:

0,

i

j,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Фj (x) =

i = j.

 

 

 

 

 

 

 

 

 

1,

 

 

 

 

 

Эти условия следуют из того, что значения многочлена и значения

f (x) в

узлах интерполяции должны совпадать. Тогда Фj (x)

можно искать в виде:

Фj (x) = Aj (x x0 )K(x x j1 )(x x j+1 )K(x xn ) ,

где

Aj

-

константа,

определяемая из условия

Фj (x j ) =1 , таким образом:

 

 

 

 

 

 

 

(x x0 )K(x x j1 )(x x j+1 )K(x xn )

 

 

 

 

Фj (x) =

 

 

.

 

 

 

 

(x j x0 )K(x j x j1 )(x j x j+1 )K(x j xn )

 

 

 

Обозначим

ϖn = (x x0 )(x x1 )K(x xn )

и

продифференцируем

по x ,

полагая x = x j

: ϖ'n (x j ) = (x j x0 )(x j x1 )K(x j

xn ) . Тогда:

 

 

 

 

 

 

Фj (x) =

ϖn (x)

 

.

 

 

 

 

 

 

 

 

(x x j )ϖ'n (x j )

 

 

 

 

 

70

Таким образом, интерполяционный многочлен Лагранжа имеет вид:

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ϖn (x)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ln (x) = f (x j )

 

 

 

 

 

 

 

 

 

 

,

 

где ϖn

= (x x0 )(x x1 )K(x xn ) .

 

 

 

 

 

(x

x j )ϖ'n (x j )

 

 

 

 

 

 

 

 

 

 

 

 

j=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Примечание.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Оценка погрешности многочлена Лагранжа,

если функция

f (x)

имеет

 

на отрезке непрерывные производные

(n +1) -го порядка, имеет вид:

 

 

 

 

 

 

 

 

 

f (x) Ln (x) =

 

f (n+1) (ξ)

ϖn (x),

 

- где ξ

- некоторая точка из [a;b].

 

 

 

 

 

 

 

 

(n +1)!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример 5. 1.

 

Пусть в результате экспериментального изучения зависимости y = f (x)

получена таблица значений в пяти точках.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Xj

0.1

0.3

 

 

0.5

 

0.8

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Yj

0.3

0.55

0.65

0.4

0.25

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Найти интерполяционный полином Лагранжа второго порядка y = P (x) = a

0

+ a x + a

2

x2 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

1

 

 

Построение полинома Лагранжа.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

(x) = y

 

 

(x x1 )(x x4 )

 

 

+ y

 

(x x0 )(x x4 )

 

+ y

 

 

(x x1 )(x x0 )

 

 

 

 

 

 

 

 

 

 

)

 

 

 

 

 

 

 

 

 

 

2

 

 

0

 

(x

0

x

)(x

0

x

 

1

 

(x

x

)(x

 

x

4

)

 

 

 

4

 

(x

4

x

)(x

4

x )

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

4

 

 

 

 

1

0

 

1

 

 

 

 

 

 

 

 

0

 

1

 

 

 

 

 

 

 

 

P (x) = 0.3

(x 0.3)(x 1)

 

 

+0.55

 

(x 0.1)(x 1)

 

+0.25

(x 0.3)(x 0.1)

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

(0.10.3)(0.11)

 

 

 

 

(0.3 0.1)(0.3 1)

 

 

 

 

(10.3)(10.1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P2 (x) = −1.865x2 +1.996x +0.119

Приведем теперь реализацию данного метода интерполирования в системе Scilab. Найдем приближенное значение функции f (x) = sin x в точке x = 0.6 .

Листинг 5.1.

//Интерполяционный многочлен Лагранжа

function y=interpolateLagrange(x, xx, f, n) eps = 1e-8;

Pn = 1.0; for i=1:n do

if (abs(x-xx(i)) < eps) then y = f(i);

return;

end;

Pn =Pn*(x-xx(i));

end;

y = 0.0;

for i = 1:n do s = 1.0;

for j = 1:n do

if (i == j) then

71

s = s*(x-xx(i));

else

s = s*(xx(i)-xx(j));

end;

end;

y = y+(Pn * f(i)/s);

end; endfunction

xx = [0, 0.25, 0.5, 0.75, 1];

//узлы интерполирования

f = sin(xx);

//наша функция

d = 0.6;

printf("Lagrange: %g %g\n", interpolateLagrange(d, xx, f, 5), sin(d)); //вывод результатов – первое число – приближенное значение

Рис. 1. Результат работы Листинга_5.1

2) Интерполяционная формула Ньютона

Запишем интерполяционный многочлен Лагранжа Ln (x) другой форме:

 

Ln (x) = L0 (x) +[L1 (x) L0 (x)] +K+[Ln (x) Ln1 (x)],

 

 

где разность Lk (x) Lk 1 (x), k =1, 2,K, n

 

- есть

многочлен

степени

k ,

обращающийся в нуль в точках x0 ,K, xk 1 . Поэтому можно записать:

 

Lk (x) Lk 1 (x) = B(x x0 )(x x1 )K(x xk 1 ) . Константу

B найдем,

полагая,

что

x = xk :

f (xk ) Lk 1 (x) = B(xk x0 )(xk x1 )K(xk xk 1 ) , отсюда:

 

 

 

k

f (x j )

 

 

 

 

 

B =

 

 

= f (x0 , x1 ,K, xk ) , где

f (x0 , x1 ,K, xk ) -

(x j x0 )K(x j x j1 )(x j x j+1 )K(x j xk

)

j=0

 

 

 

 

есть разностное отношение k -го порядка.

Учитывая выражение для B , интерполяционный многочлен можно представить в виде:

Pn (x) = f (x0 ) + (x x0 ) f (x0 , x1 ) +K+ (x x0 )(x x1 )K(x xn1 ) f (x0 , x1 ,K, xn ) .

Это и есть интерполяционный многочлен Ньютона.

72

Примечание.

Остаточный член формулы Ньютона совпадает с остаточным членом формулы Лагранжа:

Rn (x) = f (x) Ln (x) =

f (n+1) (ξ)

ϖn (x) ,

где ξ - тока отрезка,

(n +1)!

 

 

 

содержащего узлы интерполирования.

Пример 5. 2. Пусть в результате экспериментального изучения зависимости y = f (x) получена таблица значений в пяти точках.

 

Xj

0.1

 

0.3

 

 

0.5

0.8

 

1

 

 

 

 

 

 

 

 

 

 

Yj

0.3

0.55

 

0.65

0.4

0.25

 

 

 

 

 

 

 

 

 

Найти интерполяционный полином Ньютона второго порядка

y = P (x) = a

0

+ a x + a

2

x2 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

1

 

 

 

Построение полинома Лагранжа.

 

 

 

 

 

P (x) = y

0

+

 

1

(x x

0

) +

 

2

(x x

0

)(x

x )

 

 

 

 

 

2

 

 

 

 

 

 

 

1

 

 

 

 

 

 

1

 

 

 

 

1

 

 

 

 

 

11

=

 

 

y1 y0

 

=

0.55 0.3

 

=1,25;

 

 

 

 

 

 

 

 

 

 

 

x1 x0

 

0.3 0.1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

12

=

 

 

y4

y1

=

 

0.25 0.55

= −0,43

 

 

 

 

 

 

 

 

x4

x1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10.3

 

 

 

 

 

 

 

 

 

 

 

 

 

21

=

12

11

=

 

0,43 1,25 = −1.865

 

 

 

 

 

 

 

 

 

 

 

x4

x0

 

 

 

10,1

 

 

 

 

 

 

 

 

 

 

 

 

 

P2 (x) = 0.3 +1.25(x 0.1) 1.865(x 0.1)(x 0.3)

P2 (x) = −1.865x2 +1.996x + 0.119.

Приведем теперь реализацию данного метода интерполирования в системе Scilab. Найдем приближенное значение функции f (x) = sin x в точке x = 0.6 .

Листинг 5.2.

//Интерполяционная формула Ньютона

function y=diffN(xx, f, i, k) select (k),

//используем конструкцию select (<выражение>), case <значение> then //<последовательность действий> - аналог оператора многовариантного ветвления SWITCH, используемого в C++

case 0 then

y = f(i)

case 1 then y = (f(i+k)-f(i))/(xx(i+k)-xx(i))

else y=(diffN(xx, f, i+1, k-1)-diffN(xx, f, i, k-1))/(xx(i+k)-xx(i)) end

endfunction

function y=interpolateNewton(x, xx, f, n) y = 0; Pn = 1.0;