Файл: Простейшие способы интерполяции и экстраполяции данных.doc
Добавлен: 29.10.2018
Просмотров: 466
Скачиваний: 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), 1≤j+1≤n. Коэффициенты a и b вычисляются следующим образом:
;
. (4)
Пример алгоритма линейной интерполяции на естественном языке:
-
Задаем начальные данные для интерполяции: границы интерполируемого отрезка a и b, количество узлов координатной сетки n, шаг сетки h, массив значений координат сетки z(n) и массив значений интерполируемой функции f(n).
-
Задаем шаг графического изображения sh интерполируемой функции f(x) и интерполяционной функции g(x).
-
Задаем цикл по х от a до b-sh с шагом sh*2.
-
Задаем x1=x и x2=x+sh.
-
Вычисляем значения интерполируемой функции в точках x1 и x2: f(x1) и f(x2).
-
Выводим на экран изображение интерполируемой функции в точках x1 и x2: f(x1) и f(x2).
-
Вычисляем значения интерполяционной функции в точках x1 и x2: g(x1) и g(x2):
-
Задаем цикл по k от 1 до n-1.
-
Находим номера узлов интерполяционной сетки, между которыми находится значение x1. Задаем ветвление: если x>=z(k) и x<=z(k+1), то k1=k и k2=k+1; если x>z(n), то k1=n-1 и k2=n.
-
По формулам метода линейной интерполяции находим коэффициенты интерполяционной прямой: a=(f(k1)-f(k2))/(z(k1)-z(k2)) и b=f(k2)-a*z(k2).
-
Вычисляем значение интерполяционной функции в точке x1: g(x1).
-
Пункты 7.1 – 7.4 повторяем для нахождения значения интерполяционной функции в точке x2: g(x2).
-
-
Выводим на экран интерполяционной функции в точках x1 и x2: g(x1) и g(x2).
-
Конец цикла по x.
-
Конец программы.
Реализация алгоритма линейной интерполяции функции 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).