Реализация и примеры
При решении задачи интегрирования аналитически заданной функции возвращается одно число - величина интеграла. Поэтому оптимальным методом здесь представляется создание пользовательских функций.
Их VBA код (с необходимыми комментариями) представлен ниже. Соответствующая пользовательская функция реализована в рабочей книге integrating.xls
Листинг
'//////////////////////////////////////////////////////////
'Функция вычисляет интеграл от заданной функции
'по методу Ньютона-Котеса
'//////////////////////////////////////////////////////////
'funct - функция, заданная строкой
'start_point - нижний предел интегрирования
'end_point - верхний предел интегрирования
'k - количество точек
'eps - требуемая точность
'/////////////////////////////////////////////////////////
Function
newton_kotes(funct As String, start_point As Single, end_point As
Double, k As Byte, eps As Double) As Double
Dim koef(10, 5) As Long, b As Double, a As Double, s As Double, h1 As
Double
'Массив коэффициентов Котеса
koef(1, 0) = 1
koef(1, 1) = 1
koef(2, 0) = 1
koef(2, 1) = 4
koef(2, 2) = 1
koef(3, 0) = 1
koef(3, 1) = 3
koef(3, 2) = 3
koef(3, 3) = 1
koef(4, 0) = 7
koef(4, 1) = 32
koef(4, 2) = 12
koef(4, 3) = 32
koef(4, 4) = 7
koef(5, 0) = 19
koef(5, 1) = 75
koef(5, 2) = 50
koef(5, 3) = 50
koef(5, 4) = 75
koef(5, 5) = 19
koef(6, 0) = 41
koef(6, 1) = 216
koef(6, 2) = 27
koef(6, 3) = 272
koef(6, 4) = 27
koef(6, 5) = 216
koef(7, 0) = 751
koef(7, 1) = 3577
koef(7, 2) = 1323
koef(7, 3) = 2989
koef(7, 4) = 2989
koef(7, 5) = 1323
koef(8, 0) = 989
koef(8, 1) = 5888
koef(8, 2) = -928
koef(8, 3) = 10496
koef(8, 4) = -4540
koef(8, 5) = 10496
koef(9, 0) = 2857
koef(9, 1) = 15741
koef(9, 2) = 1080
koef(9, 3) = 19344
koef(9, 4) = 5778
koef(9, 5) = 5778
koef(10, 0) = 16067
koef(10, 1) = 106300
koef(10, 2) = -48525
koef(10, 3) = 272400
koef(10, 4) = -260550
koef(10, 5) = 427368
For i = 0 To Int(k / 2) - 1
Sum = Sum + 2 * koef(k, i)
Next i
If k Mod 2 Then
Sum = Sum + 2 * koef(k, Int(k / 2))
Else
Sum = Sum + koef(k, Int(k / 2))
End If
h1 = (end_point - start_point) / k
div = 1
Do
s = newton_kotes
newton_kotes = 0
a = start_point
For i = 1 To div
b = a + h1 * k
x = a
For j = 0 To k
If j <= 5 Then
h = koef(k, j) / Sum
Else
h = koef(k, k - j) / Sum
End If
newton_kotes = newton_kotes + (b - a) * h * sheetFormula(CStr(x), funct)
x = x + h1
Next j
a = b
Next i
h1 = h1 / 2
div = div * 2
Loop While Abs(s - newton_kotes) >= eps
End Function
'//////////////////////////////////////////////////////////
'Функция вычисляет интеграл от заданной функции
'по методу квадратур Гаусса
'//////////////////////////////////////////////////////////
'funct - функция, заданная строкой
'start_point - нижний предел интегрирования
'end_point - верхний предел интегрирования
'k - количество точек
'eps - требуемая точность
'/////////////////////////////////////////////////////////
Function gauss(funct As String, start_point As Single, end_point As
Double, k As Byte, eps As Double) As Double
Dim koef(10, 20) As Double, b As Double, a As Double, s As Double, h1
As Double
Dim gauss_arr() As Double
'Массив корней полинома Лежандра и
'и коэффициентов для квадратурных формул Гаусса
koef(2, 0) = 0.5773502692
koef(2, 1) = -0.5773502692
koef(2, 2) = 1
koef(2, 3) = 1
koef(3, 0) = -0.7745966692
koef(3, 1) = 0
koef(3, 2) = -0.7745966692
koef(3, 3) = 0.5555555556
koef(3, 4) = 0.8888888889
koef(3, 5) = 0.5555555556
koef(4, 0) = 0.8611363116
koef(4, 1) = 0.3399810436
koef(4, 2) = -0.3399810436
koef(4, 3) = -0.8611363116
koef(4, 4) = 0.3478548451
koef(4, 5) = 0.6521451549
koef(4, 6) = 0.6521451549
koef(4, 7) = 0.3478548451
koef(5, 0) = 0.9061798459
koef(5, 1) = 0.5384693101
koef(5, 2) = 0
koef(5, 3) = -0.5384693101
koef(5, 4) = -0.9061798459
koef(5, 5) = 0.236926885
koef(5, 6) = 0.4786286705
koef(5, 7) = 0.5688888889
koef(5, 8) = 0.4786286705
koef(5, 9) = 0.236926885
koef(6, 0) = 0.9324695142
koef(6, 1) = 0.6612093864
koef(6, 2) = 0.2386191861
koef(6, 3) = -0.2386191861
koef(6, 4) = -0.6612093864
koef(6, 5) = -0.9324695142
koef(6, 6) = 0.1713244924
koef(6, 7) = 0.360761573
koef(6, 8) = 0.4679139346
koef(6, 9) = 0.4679139346
koef(6, 10) = 0.360761573
koef(6, 11) = 0.1713244924
koef(7, 0) = 0.9491079123
koef(7, 1) = 0.7415311856
koef(7, 2) = 0.4058451414
koef(7, 3) = 0
koef(7, 4) = -0.4058451414
koef(7, 5) = -0.7415311856
koef(7, 6) = -0.9491079123
koef(7, 7) = 0.1294849661
koef(7, 8) = 0.2797053914
koef(7, 9) = 0.3818300505
koef(7, 10) = 0.4179591837
koef(7, 11) = 0.3818300505
koef(7, 12) = 0.2797053914
koef(7, 13) = 0.1294849661
koef(8, 0) = 0.9602898565
koef(8, 1) = 0.7966664774
koef(8, 2) = 0.5255324099
koef(8, 3) = 0.1834346425
koef(8, 4) = -0.1834346425
koef(8, 5) = -0.5255324099
koef(8, 6) = -0.7966664774
koef(8, 7) = -0.9602898565
koef(8, 8) = 0.1012285363
koef(8, 9) = 0.2223810345
koef(8, 10) = 0.3137066459
koef(8, 11) = 0.3626837834
koef(8, 12) = 0.3626837834
koef(8, 13) = 0.3137066459
koef(8, 14) = 0.2223810345
koef(8, 15) = 0.1012285363
koef(9, 0) = 0.9681602395
koef(9, 1) = 0.8360311073
koef(9, 2) = 0.6133714327
koef(9, 3) = 0.3242534234
koef(9, 4) = 0
koef(9, 5) = -0.3242534234
koef(9, 6) = -0.6133714327
koef(9, 7) = -0.8360311073
koef(9, 8) = -0.9681602395
koef(9, 9) = 0.0812743884
koef(9, 10) = 0.1806481607
koef(9, 11) = 0.2606106964
koef(9, 12) = 0.312347077
koef(9, 13) = 0.330239355
koef(9, 14) = 0.312347077
koef(9, 15) = 0.2606106964
koef(9, 16) = 0.1806481607
koef(9, 17) = 0.0812743884
koef(10, 0) = 0.9739065285
koef(10, 1) = 0.8650633667
koef(10, 2) = 0.6794095683
koef(10, 3) = 0.4333953941
koef(10, 4) = 0.148874339
koef(10, 5) = -0.148874339
koef(10, 6) = -0.4333953941
koef(10, 7) = -0.6794095683
koef(10, 8) = -0.8650633667
koef(10, 9) = -0.9739065285
koef(10, 10) = 0.0666713443
koef(10, 11) = 0.1494513492
koef(10, 12) = 0.2190863625
koef(10, 13) = 0.2692667193
koef(10, 14) = 0.2955242247
koef(10, 15) = 0.2955242247
koef(10, 16) = 0.2692667193
koef(10, 17) = 0.2190863625
koef(10, 18) = 0.1494513492
koef(10, 19) = 0.0666713443
div = 1
h1 = (end_point - start_point) / k
ReDim gauss_arr(div)
Do
s = gauss
gauss = 0
a = start_point
For i = 1 To div
b = a + h1 * k
For j = 0 To k
x = (a + b) / 2 + (b - a) / 2 * koef(k, j)
gauss_arr(i) = gauss_arr(i) + koef(k, j + k) * sheetFormula(CStr(x),
funct)
Next j
gauss_arr(i) = gauss_arr(i) * (b - a) / 2
a = b
Next i
h1 = h1 / 2
For i = 1 To div
gauss = gauss + gauss_arr(i)
Next i
div = div * 2
ReDim gauss_arr(div)
Loop While Abs(s - gauss) >= eps
End Function
Пример
Определить объем продукции, произведенной рабочим в течениеt восьмичасового рабочего дня, если производительность труда характеризуется функцией

Решение
Решение задачи сводится к вычислению определенного интеграла


Аналитическое решение: