Мне задача не понятна Какие входные данные , какие выходные. Что такое вычисление интеграла? Численное решение? или нужна формула ?Arei сказал(а):Спасибо,но тема не закрыта если кто то сможет, то жду примера.Заранее спасибо.
$a = 0; Левая граница интервала
$b = 1; Правая
$y = 'Sin(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 = 1/0; Начальное значение инеграла (бесконечность)
Do
$h = ($b - $a)/$N; Шаг интегрирования
$iSum = 0
For $i = 1 to $N
$x = $a + $i*$h - $h/2;
$iSum += yVal($y, $x)*$h
Next
$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, -1, 1)
MsgBox(64, "Определенный интеграл", "Значение интеграла от функции y(x) = " & $y & " равно " & $val[0] & @CRLF & _
"Количество итераций для вычислений - " & $val[1] & @CRLF & _
"Ошибка составила - " & $val[2])
$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])
Код не мой , а твой, я даже не примазываюсь. ) Мне он понравился .Kaster сказал(а):shm_alex
1. твой код считает неверно
теория говорит, что вычисления с использованием средних прямоугольников точнее чем крайних при одном и том же кол-во итераций ;) и дело не в машинном отличии свойства дистрибутивности, а в выборе узлов интегрирования. я выбираю середину между двумя соседними, а ты правыйтак какая же из сумм будет ближе к искомому интегралу
твое право. можешь почитать тут - Численное интегрирование: Метод прямоугольников начиная с третего абзаца, там где "очевидно".Не согласен
однакож привел ты пример функции, для которой это так ;)существуют функции для которых это не так
опять мой прокол. просто я не люблю копаться в чужом коде ;Dпрямоугольники выбраны такие как и у тебя