Реализация и примеры

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

Оптимальным методом здесь представляется создание пользовательских функций.

Их VBA код (с необходимыми комментариями) представлен ниже. Соответствующая пользовательская функция реализована в рабочей книге interpolation.xls

Листинг

'Интерполяция функции одной переменной методом Лагранжа
'///////////////////////////////////////////////////////
'ПАРАМЕТРЫ ФУНКЦИИ:
'nodes_x-диапазон, содержащий значения аргументов функции
'nodes_y - диапазон, содержащие значения функции
'x - входной аргумент
'///////////////////////////////////////////////////////

Function lagrange(nodes_x, nodes_y, x)
'определение размерности входного диапазона nodes_x
For Each A In nodes_x
num_nodes_x = num_nodes_x + 1
Next A

'определение размерности входного диапазона nodes_y
For Each A In nodes_y
num_nodes_y = num_nodes_y + 1
Next A

'если размерности диапазонов не совпадают функция возвращает ошибку
If num_nodes_y <> num_nodes_x Then
lagrange = CVErr(xlErrValue)
Exit Function
End If

'Вычисление полинома Лагранжа
lagrange = 0
For j = 1 To num_nodes_x
z1 = 1
z2 = 1
For i = 1 To num_nodes_x
If i <> j Then
z1 = z1 * (x - nodes_x(i))
z2 = z2 * (nodes_x(j) - nodes_x(i))
End If
Next i
lagrange = lagrange + nodes_y(j) * z1 / z2
Next j

End Function


'Интерполяция функции одной переменной методом Ньютона
'////////////////////////////////////////////////////////
'ПАРАМЕТРЫ ФУНКЦИИ:
'nodes_x-диапазон, содержащий значения аргументов функции
'nodes_y - диапазон, содержащие значения функции
'x - входной аргумент
'///////////////////////////////////////////////////////

Function newton(nodes_x, nodes_y, x) As Double
Dim num_nodes_x As Byte, num_nodes_y As Byte 'размерность массивов X и Y
Dim arr_x() As Double, arr_y() As Double 'массивы, содержащие значения аргументов и функции соответсвтенно

'определение размерности входного диапазона nodes_x
For Each i In nodes_x
num_nodes_x = num_nodes_x + 1
Next i

'определение размерности входного диапазона nodes_y
For Each i In nodes_y
num_nodes_y = num_nodes_y + 1
Next i

'если размерности диапазонов не совпадают функция возвращает ошибку

If num_nodes_x <> num_nodes_y Then
newton = CVErr(xlErrValue)
Exit Function
End If

'переопределение размерности массивов arr_x и arr_y
ReDim arr_x(num_nodes_x - 1)
ReDim arr_y(num_nodes_y - 1)

'ввод значений в массивы arr_x и arr_y
For i = 1 To num_nodes_x - 1
arr_y(i) = nodes_y(i + 1)
arr_x(i) = nodes_x(i + 1)
Next i

'вычисление полинома
For j = 1 To num_nodes_x - 1
For i = j To num_nodes_x - 1
arr_y(i) = (arr_y(j - 1) - arr_y(i)) / (arr_x(j - 1) - arr_x(i))
Next i
Next j
newton = arr_y(num_nodes_x - 1)
For i = num_nodes_x - 1 To 0 Step -1
newton = arr_y(i) + (x - arr_x(i)) * newton
Next i

End Function

Пример

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

T, oF
0
20
40
60
80
100
U, мВ
-0,67
-0,254
0,171 0,609
1,057
1,517

Найти показания вольтметра при Т=55oF