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

73

for k = 1:n do

y = y+diffN(xx, f, 1, k-1)*Pn; Pn = Pn*(x-xx(k));

end endfunction

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

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

f = sin(xx);

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

d = 0.6;

printf("Newton: %g %g\n", interpolateNewton(d, xx, f, 5), sin(d)); //вывод результатов

– первое число – приближенное значение

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

3) Интерполяционные формулы Гаусса

Пусть узлы

интерполирования

x0 , x1 ,K, xn

-

равноотстоящие

и точка

интерполирования x

находится в середине отрезка [a;b]

“вблизи” узла xk ,

причем

x > xk . Для

построения

интерполяционной

формулы необходимо

привлекать

узлы

интерполирования

в

следующем

порядке:

xk , xk + h,

xk

h,K, xk +ih,

xk ih .

Обозначим

t =

x xk

 

и

введем конечные

h

 

разности по формулам:

 

 

 

 

 

 

 

yk , f (xk h, xk , xk + h) =

2 yk 1

 

 

 

 

f (xk ) = yk ,

f (xk , xk + h) =

 

и т.д.

 

 

 

 

 

h

 

 

2! h2

 

 

 

 

Формула Гаусса для интерполирования вперед имеет вид:

P(xk +th) = yk +

t

yk +

t(t 1)

2 yk 1

+

t(t 2 12 )

3 yk 1 +K+

 

 

 

1!

2!

 

3!

 

+

t(t 2 12 )(t 2 22 )K(t 2 (i 1)2 )

2i1 yk i+1 +

t(t 2 12 )(t 2 22 )K(t 2 (i 1)2 )(t i)

2i yk i .

 

 

 

(2i 1)!

 

 

 

(2i)!

 

 

Если точка интерполирования

x < xk ,

то

узлы для

построения следует

привлекать в следующем порядке:

xk , xk

h,

xk + h,K, xk

ih, xk +ih . Формула

Гаусса для интерполирования назад имеет вид:

74

P(xk +th) = yk +

t

 

yk 1

+

t(t +1)

2 yk 1

+

t(t 2 12 )

3 yk 2 +K+

 

 

 

1!

 

2!

 

3!

 

+ t(t 2 12 )(t 2 22 )K(t 2 (i 1)2 ) 2i1 yk i + t(t 2 12 )(t 2 22 )K(t 2 (i 1)2 )(t +i) 2i yk i .

(2i 1)!

(2i)!

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

Листинг 5.3.

//Интерполяционная формула Гаусса

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

case 0 then

y = f(i)

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

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

endfunction

function y = interpolateGauss(x, xx, f, n) k = -1;

for i = 1:n-1 do

if (x >= xx(i) & x <= xx(i+1)) then k = i;

end;

end;

if (k < 0) then

y = "nan"; return;

end;

t = (x - xx(k))/(xx(k+1)-xx(k)); y = 0;

Pn = 1.0; fac = 0; i = 0;

while(2*i+k+1 < n & k-i >= 0) do

y = y + diffG(xx, f, k-i, 2*i)*Pn; fac = fac+1;

Pn = Pn*(t+i)/(fac);

y = y + diffG(xx, f, k-i, 2*i+1)*Pn; fac = fac+1;

Pn = Pn*(t-i)/(fac); i = i+1;

end endfunction

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

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

f = sin(xx);

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

 

75

d = 0.6;

 

printf("Gauss: %g %g\n", interpolateGauss(d, xx, f, 5), sin(d));

//вывод результатов –

первое число – приближенное значение

 

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

4)Линейная аппроксимация по методу наименьших квадратов

Данный метод применяется для решения следующих задач:

Необходимо определить величины x1 , x2 ,K, xN , которые нельзя

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

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

Для того чтобы определить, насколько далеко от данных лежит кривая

y= f (x) , можно воспользоваться следующими нормами:

¾E1 ( f ) = max f (xk ) yk - максимальная ошибка,

1k N

 

 

1

N

 

 

¾

E2 ( f ) =

 

f (xk ) yk

 

- средняя ошибка,

 

 

 

 

 

 

 

N k =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

76

 

 

 

 

 

 

 

 

 

 

 

1

 

N

 

 

 

 

 

 

 

 

 

 

 

 

 

¾ E3 ( f ) = (

 

 

 

f (xk ) y k

 

2 )1/ 2 - среднеквадратичная ошибка.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пусть

заданы

 

 

 

 

N k =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

точек

 

с

различными абсциссами

{xk }. Величина

 

среднеквадратичной

ошибки

будет

минимальной, когда

каждая

частная

 

 

 

 

 

 

 

 

 

1

 

 

 

N

 

 

 

 

 

 

 

 

 

производная

(E3 ( f ))2 = (

 

 

f (xk ) yk

 

2 )

по неизвестным (в данном случае

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N k =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

неизвестные A и B ) будет обращаться в нуль, т.е.

A и B являются решением

 

нормальной системы уравнений вида:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

 

 

 

N

 

 

 

 

 

 

 

 

 

 

 

 

(xk )A + NB = (yk ),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k =1

 

 

 

k =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

N

 

 

 

N

 

 

 

 

 

 

 

 

 

 

 

 

(xk2 )A + (xk )B = (xk yk ).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k =1

k =1

 

 

 

k =1

 

 

 

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

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

 

 

 

 

 

 

 

 

xi

0.1

0.3

 

0.5

 

0.8

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

yi

0.3

0.55

0.65

0.4

0.25

 

 

 

 

 

 

 

 

 

 

 

 

 

y = P1 (x) = b0 +b1 x

 

Найти аппроксимирующий

полином первого

порядка

методом

наименьших квадратов.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y = Ax + B - полинома первой степени:

 

Записываем матрицы нормальной системы для

n

С= n

xi

i=1

n=5

n xi

i=1 n xi2

i=1

 

n

 

 

yi

 

B =

i=1

 

 

n

 

 

yi xi

i=1

 

n

xi = 0.1 + 0.3 + +0.5 + 0.8 +1 = 2.7

i=1

n

xi2 = 0.01+0.09 +0.25 +0.64 +1 =1.99

i=1

n

yi = 0.3 +0.55 +0.65 +0.4 +0.25 = 2.15

i=1

n

 

 

 

 

 

 

 

 

 

 

 

 

xi yi = 0.1*0.3 +0.3*0.55 +0.5*0.65 +0.8*0.4 +1*0.25 =1.09

i=1

 

 

 

 

 

 

 

 

 

 

 

 

т.е. расчетная система имеет вид

 

a

 

 

 

 

5

2.7

 

 

2.15

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

C =

2.7

1.99

 

B =

 

A =

 

 

 

 

 

1.09

 

a2

 

 

5a

 

+2.7a

 

=

2.15

a2 = −0.13

a1 = 0.5

 

1

 

 

2

 

=1.09

2.7a1 +1.99a2

 

 

 

 

тогда искомый полином примет вид

P1 (x) = 0.5 0.13x

77

5)Интерполирование сплайнами (кусочно-линейное интерполирование)

Иногда интерполирование по всей совокупности точек бывает недостаточным. В этих случаях можно воспользоваться объединением фрагментов графиков полиномов низкой степени и интерполированием между последовательными узлами. Самый простой в использовании – полином первой степени. Он создает ломаную, состоящую из отрезков, которые проходят через две точки. Для представления этой кусочнолинейной кривой используется формула угла наклона отрезка линии в точке:

Sk (x) = yk +

( yk +1

yk )

(x xk ) ,

(*)

(xk +1

xk )

 

 

 

где yk - заданное значение функции, полученное экспериментально в узлах

xk .

Функция

Sk (x) называется линейным сплайном на отрезке [xk +1 , xk ].

Пример

5.3.

Для функции

y = f (x) ,

заданной

таблично,

осуществим

кусочно-линейное интерполирование.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

0

 

0.5

1

 

2

 

3

 

4

 

5

f (x)

1.5

 

0

0

 

2

 

2

 

1

 

2

Осуществим кусочно-линейное интерполирование. Разобьем данную функцию на промежутки, определяемые соседними числами верхней строки таблицы, и на каждом из участков строим линейный сплайн (полином первой степени) по формуле (*):

 

3x +1.5

при

0 х 0.5,

 

0

при

0.5 х 1,

S1

(x) = 2х2

при

1 х 2,

 

2

при

2 х 3,

 

х+5

при

3 х 4,

 

 

 

 

 

 

при

4 х 5.

 

х3

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

Листинг 5.4.

//Кусочно-линейное интерполирование

function y=interpolateLinear(x, xx, f, n) y = "nan";

for i = 1:n-1 do

if (x >= xx(i) & x <= xx(i+1)) then

y = f(i) + (f(i+1) - f(i))/(xx(i+1)-xx(i))*(x-xx(i));