Реализация и примеры
При решении задачи интеполяции необходимо вычислять значение таблично заданной функции в неузловых точках.
Оптимальным методом здесь представляется создание пользовательских функций.
Их 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

