Файл: Простейшие способы интерполяции и экстраполяции данных.doc

Добавлен: 29.10.2018

Просмотров: 420

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Простейшие способы интерполяции и экстраполяции данных


Рассмотрим функцию y=f(x) непрерывную на некотором интервале [a,b] и заданную некоторыми своими значениями yi=f(xi), i=1,2,…,n для соответствующих значений аргумента a≤x0<x1<. . . <xn ≤b. Необходимо найти значение этой функции в точке x* принадлежащей интервалу [a,b], при этом x*≠xi и оценить погрешность полученного приближенного значения.

Один из возможных путей решения поставленной задачи состоит в следующем. Для функции y=f(x) по значениям yi в узлах xi, i=1,2,…,n строится многочлен степени не выше n

(1)

принимающий в точках xi значения yi, т.е. значения коэффициентов многочлена – ai – находятся из условия:

. (2)

Этот многочлен называется интерполяционным, он всегда существует и единственен.

В простейшем случае можно воспользоваться многочленом 1-ой степени, т.е. интерполирование будет линейным:

. (3)

В этом случае для интерполяции необходимо построить прямую, соединяющую две точки (xj,yj) и (xj+1,yj+1), 1j+1n. Коэффициенты a и b вычисляются следующим образом:

;

. (4)


Пример алгоритма линейной интерполяции на естественном языке:

  1. Задаем начальные данные для интерполяции: границы интерполируемого отрезка a и b, количество узлов координатной сетки n, шаг сетки h, массив значений координат сетки z(n) и массив значений интерполируемой функции f(n).

  2. Задаем шаг графического изображения sh интерполируемой функции f(x) и интерполяционной функции g(x).

  3. Задаем цикл по х от a до b-sh с шагом sh*2.

  4. Задаем x1=x и x2=x+sh.

  5. Вычисляем значения интерполируемой функции в точках x1 и x2: f(x1) и f(x2).

  6. Выводим на экран изображение интерполируемой функции в точках x1 и x2: f(x1) и f(x2).

  7. Вычисляем значения интерполяционной функции в точках x1 и x2: g(x1) и g(x2):

    1. Задаем цикл по k от 1 до n-1.

    2. Находим номера узлов интерполяционной сетки, между которыми находится значение x1. Задаем ветвление: если x>=z(k) и x<=z(k+1), то k1=k и k2=k+1; если x>z(n), то k1=n-1 и k2=n.

    3. По формулам метода линейной интерполяции находим коэффициенты интерполяционной прямой: a=(f(k1)-f(k2))/(z(k1)-z(k2)) и b=f(k2)-a*z(k2).

    4. Вычисляем значение интерполяционной функции в точке x1: g(x1).

    5. Пункты 7.1 – 7.4 повторяем для нахождения значения интерполяционной функции в точке x2: g(x2).

  8. Выводим на экран интерполяционной функции в точках x1 и x2: g(x1) и g(x2).

  9. Конец цикла по x.

  10. Конец программы.


Реализация алгоритма линейной интерполяции функции f(x)=sin(5*x) на отрезке от 0,05 до 5 с шагом 0,005 на языке VFP:

SET DECIMALS TO 10

n=10

DIMENSION f(n),z(n)

h=0.1

FOR i=1 TO n

z(i)=(i-1)*h

x=z(i)

f(i)= SIN(5*x)

ENDFOR


a=0.05

b=2

sh = 0.005


x1=0.05

_screen.Cls

FOR x=a TO b-sh STEP sh*2


x1=x

x2=x+sh


f1 = SIN(5*x1)

f2 = SIN(5*x2)

_screen.Line(xe(x1),ye(f1),xe(x2),ye(f2))


g1=интерполяция(x1,@f,@z,n)

g2=интерполяция(x2,@f,@z,n)

_screen.line(xe(x1),ye(g1),xe(x2),ye(g2))


WAIT WINDOW 1


ENDFOR


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

PARAMETERS x,f,z,n

DIMENSION f(n),z(n)

LOCAL k,a,b

FOR k=1 TO n-1

DO CASE

CASE x>=z(k) and x<=z(k+1)

k1=k

k2=k+1

EXIT

CASE x>z(n)

k1=n-1

k2=n

EXIT

ENDCASE

ENDFOR

a=(f(k1)-f(k2))/(z(k1)-z(k2))


b=f(k2)-a*z(k2)

RETURN a*x+b


FUNCTION xe

PARAMETERS x

RETURN 50 + x*400

ENDFUNC


FUNCTION ye

PARAMETERS y

RETURN 200 - y*150

ENDFUNC


Данная реализация алгоритма для графического изображения интерполируемой функции f(x) и интерполяционной функции g(x) использует метод line(x1,y1,x2,y2) объекта _screen.


Реализация алгоритма линейной интерполяции функции f(x)=sin(5*x) на отрезке от 0,05 до 5 с шагом 0,005 на языке VBA:

Sub Interpolation_Test()

Dim xlSheet As Excel.Worksheet


Set xlSheet = Application.ActiveSheet


n = 10

Dim f(10), z(10)

h = 0.1


For i = 1 To n

z(i) = (i - 1) * h

x = z(i)

f(i) = Sin(5 * x)

Next i


sh = 0.005

x1 = 0.05

f1 = Sin(5 * x1)

g1 = Interpolation(x1, f, z, n)


xlSheet.Cells(1, 1).Value = x1

xlSheet.Cells(1, 2).Value = f1

xlSheet.Cells(1, 3).Value = g1

i = 1

For x = 0.05 To 0.6 Step sh

i = i + 1

x2 = x + sh

f2 = Sin(5 * x2)

g2 = Interpolation(x2, f, z, n)

xlSheet.Cells(i, 1).Value = x2

xlSheet.Cells(i, 2).Value = f2

xlSheet.Cells(i, 3).Value = g2


x1 = x2

f1 = f2

g1 = g2

Next x


Call AddChart("C1", "C2", "C3")


End Sub



Function Interpolation(t, f, z, n)

Dim k, a, b



For k = 1 To n - 1

If t >= z(k) And t <= z(k + 1) Then

k1 = k

k2 = k + 1

Exit For

ElseIf t > z(n) Then

k1 = n - 1

k2 = n

Exit For

End If

Next k


a = (f(k1) - f(k2)) / (z(k1) - z(k2))

b = f(k2) - a * z(k2)


Interpolation = a * t + b


End Function



Sub AddChart(Col1, Col2, Col3)

ASheetName = Application.ActiveSheet.Name

Charts.Add

ActiveChart.ChartType = xlXYScatterSmoothNoMarkers

ActiveChart.SetSourceData Source:=Sheets(ASheetName).Range("A1")

ActiveChart.SeriesCollection.NewSeries

ActiveChart.SeriesCollection.NewSeries

ActiveChart.SeriesCollection(1).XValues = "=" & ASheetName & "!" & Col1

ActiveChart.SeriesCollection(1).Values = "=" & ASheetName & "!" & Col2

ActiveChart.SeriesCollection(1).Name = "=""f(x)"""

ActiveChart.SeriesCollection(2).XValues = "=" & ASheetName & "!" & Col1

ActiveChart.SeriesCollection(2).Values = "=" & ASheetName & "!" & Col3

ActiveChart.SeriesCollection(2).Name = "=""g(x)"""

ActiveChart.Location Where:=xlLocationAsObject, Name:=ASheetName

ActiveChart.SeriesCollection(1).Select

ActiveChart.ChartArea.Select

End Sub


В данной реализации для графического изображения интерполируемой функции f(x) и интерполяционной функции g(x) используются средства построения графиков MS EXCEL. Значения x , f(x) и g(x) заносятся в ячейки первых трех колонок рабочего листа:

xlSheet.Cells(i, 1).Value = x1

xlSheet.Cells(i, 2).Value = f1

xlSheet.Cells(i, 3).Value = g1

и в конце программы для построения графика вызывается метод AddChart(Col1, Col2, Col3).