$a = 0; Левая граница интервала
$b = 1; Правая
$y = '1/sqrt(x)'; Функция (только "x" - в качестве аргумента)
Func yVal($y, $x)
Return Execute(StringReplace($y, "x", $x))
EndFunc
Func integral($y, $a = 0, $b = 1, $e = 1e-6); $y - функция, $a, $b - границы, $e - точность вычислений
$N = 2; Начальное кол-во интервалов
$iInt_old = yVal($y, ($b-$a)/2)*($b-$a); Начальное значение интеграла
Do
$h = ($b - $a)/$N; Шаг интегрирования
$iSum = 0
$x=$a+$h/2;добавил начальное значение х в которой считать первую среднюю линию трапеции
For $i = 1 to $N
;$x = $a + $i*$h - $h/2;
$x+=$h;Заменил чтобы в цикле не умножать много раз $i*$h
;$iSum += yVal($y, $x)*$h
$iSum += yVal($y, $x);сначало посчитаем сумму вскобках чтобы 100 раз не умножать в цикле и не накапливать ошибку вынесем высоту трапеции h за скобки
Next
$iSum*=$h ; зделаем умножение за скобками
$iDiff = Abs($iSum - $iInt_old); Разница вычислений на каждом шаге по сравнению с предыдущим
$iInt_old = $iSum
$N += 1
Until $iDiff < $e; Конец вычислений, если разница стала меньше точности вычислений
Local $retvals[3] = [Round($iInt_old, 5), $N - 2, Round($iDiff, 5)]; Возвращаемый массив из [значения интеграла, кол-ва итераций, локальной ошибки]
Return $retvals
EndFunc
$val = integral($y,0,4)
MsgBox(64, "Определенный интеграл", "Значение интеграла от функции y(x) = " & $y & " равно " & $val[0] & @CRLF & _
"Количество итераций для вычислений - " & $val[1] & @CRLF & _
"Ошибка составила - " & $val[2])