Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решение математических задач.pdf
Скачиваний:
28
Добавлен:
13.02.2015
Размер:
858.1 Кб
Скачать
x1,x2,…xn,

Рис. 2.9. Результаты работы программы аппроксимации функции методом наименьших квадратов

2.6.Интерполяция функции

Впрактической деятельности часто приходится работать с функциями,

заданными таблично, когда для ряда значений аргумента x1,x2,…xn известны значения функции y1=f(x1), y2=f(x2),…,yn=f(xn). Для того чтобы определить

значение функции f в какой-либо точке x, отличной от заданных действуют следующим образом: строят функцию F, которая в заданных

точках x1,x2,…xn совпадает с заданными значениями y1,y2,…yn, то есть

F(xi)=yi, где i=1,2,…n,

(2.18)

а при остальных x приближенно представляет функцию f(x). Такая функция

F называется интерполирующей, а точки x1,x2,…xn называются узлами интерполяции.

Чаще всего функцию F задают в виде полинома, который называется интерполяционным полиномом Лагранжа и обозначается Ln(x).

Интерполяционный полином Лагранжа, построенный по таблице (x1,y1), (x2,y2),…(xn,yn), имеет следующий вид:

n

n

x - x j

 

j ≠ i

 

Ln (x) = åyi × Õ

 

 

, где

(2.19)

x - x

j

i=1

j=1

i

 

 

 

В большинстве случаев интерполяционный полином строится не по всем заданным узлам x1,x2,…xn, а по некоторым выбранным узлам x1,x2,…

xm. Здесь m — количество выбранных узлов, которое меньше, чем заданное n. При этом, как правило, в качестве узлов интерполяции выбираются

57

ближайшие к x узлы, где x — это точка, в которой отыскивается

приближенное значение функции f(x).

На практике чаще всего применяются линейная интерполяция и квадратичная интерполяция. Для линейной интерполяции количество узлов берут равным 2, а для квадратичной — 3.

Вначале рассмотрим линейную интерполяцию для таблицы (x1,y1), (x2,y2),…,(xn,yn), в которой все xi различны. В этом случае приближенное

значение функции f(x) в точке x вычисляется по формуле

y = yi1 + ( yi2

- yi1)×

x xi1

,

(2.20)

xi2

- xi1

 

 

 

 

где xi1 и xi2 — ближайшие к x узлы из набора x1,x2,…xn. Ниже приводится текст программы линейной интерполяции функции:

program linint; uses crt;

var i,n:integer; x:array[0..2] of real; y:array[0..2] of real;

function lin(x0,x1,x2,y1,y2:real):real; var y0:real;

begin y0:=y1+(y2-y1)*(x0-x1)/(x2-x1); lin:=y0;

end; begin repeat clrscr;

for i:=1 to 2 do begin

writeln('Введите значение аргумента в точке ',i); readln(x[i]);

writeln('Введите значение функции в точке ',i); readln(y[i]);

end;

writeln('Введите аргумент, для которого'); writeln('нужно вычислить значение функции'); readln(x[0]); y[0]:=lin(x[0],x[1],x[2],y[1],y[2]); writeln;

writeln('Значение функции в точке ',x[0]:8:2,' равно ',y[0]:8:2);

writeln;

writeln('Для продолжения вычислений введите 0');

58

writeln('для завершения вычислений введите 1'); readln(n);

until n=1; end.

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

массива заполняются данными с помощью цикла с заранее известным числом повторений.

Для массива, содержащего аргументы, известны все три значения. Элементы массива x[1] и x[2] содержат значения аргумента в узлах

интерполяции, а значение x[0] – в той точке, для которой нужно определить

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

Для массива, содержащего значения функции, известны только значения элементов y[1] и y[2]. Эти элементы содержат значения функции

в узлах интерполяции. Неизвестной величиной является элемент массива y[0] – значение функции в заданной точке x. Для определения этой

неизвестной величины в основной части программы производится обращение к функции lin, которая по указанной выше формуле и

вычисляет искомую величину, которая затем выводится на экран компьютера.

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

На рис. 2.10 показан результат работы программы линейной интерполяции.

59

(x1,y1),

Рис. 2.10. Результаты работы программы линейной интерполяции функции

При квадратичном интерполировании функции для таблицы (x2,y2),…,(xn,yn), в которой все xi различны, приближенное значение функции f(x) в точке x вычисляется по следующей формуле:

y = yi1 + ( yi1 - yi2 )×

 

x xi1

 

+ ( yi1

- yi2 )×

xi1

 

 

 

 

 

- xi2

 

 

×

(x - xi2 )(x - xi1)

 

-

( yi2

- yi3 )×

 

(x - xi2 )(x - xi1 )

(xi1 - xi2 )(xi1

- xi3 )

(xi2 - xi3 )(xi1 - xi3 )

 

 

 

 

 

где xi1,xi2 и xi3 – ближайшие к x узлы из набора x1,x2,…xn. текст программы квадратичной интерполяции функции.

, (2.21) Ниже приводится

program kvadrint; uses crt;

var i,n:integer; x:array[0..3] of real; y:array[0..3] of real;

function kvadr(x0,x1,x2,x3,y1,y2,y3:real):real; var y0:real;

begin y0:=-(y2-y3)*(x0-x2)*(x0-x1)/((x2-x3)*(x1-x3)); y0:=y0+(y1-y2)*(x0-x2)*(x0-x1)/((x1-x2)*(x1-x3)); y0:=y0+y1+(y1-y2)*(x0-x1)/(x1-x2);

kvadr:=y0;

end;

60

begin repeat clrscr;

for i:=1 to 3 do begin

writeln('Введите значение аргумента в точке ',i); readln(x[i]);

writeln('Введите значение функции в точке ',i); readln(y[i]);

end;

writeln('Введите аргумент, для которого'); writeln('нужно вычислить значение функции'); readln(x[0]); y[0]:=kvadr(x[0],x[1],x[2],x[3],y[1],y[2],y[3]); writeln;

writeln('Значение функции в точке ',x[0]:8:2,' равно ',y[0]:8:2);

writeln;

writeln('Для продолжения вычислений введите 0'); writeln('для завершения вычислений введите 1'); readln(n);

until n=1; end.

Программа квадратичной интерполяции во многом аналогична программе линейной интерполяции, но имеются и некоторые отличия. Эти отличия связаны, в частности, с тем, что для корректного выполнения квадратичной интерполяции требуется, как минимум, три точки.

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

количество элементов увеличивается до четырех. В массиве x содержатся значения аргумента в трех узлах (элементы x[1],x[2] и x[3]), а также

значение аргумента в заданной пользователем точке x[0]. В массиве y элементы y[1], y[2] и y[3] содержат известные значения функции y в указанных узлах, а элемент массива y[0] – это и есть искомая величина.

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

данным вычисляет искомое значение величины y0 и аналогична функции lin в предыдущей программе. Однако, ввиду большей громоздкости формулы для вычисления искомого значения y0, это вычисление в функции kvadr производится в несколько этапов.

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

выполнения вычислений используется цикл с постусловием. Результат работы программы квадратичной интерполяции показан на рис.2.11.

61

Рис.2.11. Результаты работы программы квадратичной интерполяции функции

62