Ю11.8

Метод Симпсона.  Вычислить определённый интеграл [latex]I=\int_{a}^{b}{f\left(x \right)}dx[/latex] по формуле Симпсона: [latex]I\approx \frac{b-a}{6n}\left(y_{0}+4y_{1}+2y_{2}+\cdot \cdot \cdot +4y_{2n-1}+y_{2n} \right)[/latex], где [latex]2n[/latex] — количество отрезков разбиения, [latex]y_{0}[/latex], [latex]y_{1}[/latex], …, [latex]y_{2n}[/latex] — значение функции [latex]f\left(x \right)[/latex] на концах отрезков.
В задачах на численное интегрирование определённый интеграл требуется найти с заданной точностью, для чего вычисление по формуле метода рекомендуется проводить многократно, каждый раз уменьшая шаг интегрирования в два раза, пока разница между соседними приближениями не станет меньше заданной погрешности.

Функция [latex]a[/latex] [latex]b[/latex] [latex]eps[/latex] Интеграл Комментарий
[latex]f\left(x \right)=\sin \left(x^{2}+2x \right)[/latex] 1 3 0.0001 -0.143058 Тест пройден.
[latex]\ln \left(1+x \right)[/latex] 1 3 0.0001 2.15888 Тест пройден.
[latex]\tan \left(3x^{3} \right)[/latex] 2 15 0.01 0.0256033 Тест пройден.
[latex]x\left( x^{2}-1\right)\left(x+1 \right)[/latex] -1 1 0.3 -0.265625 Тест пройден.

C++:

Java:

С помощью программы можно вычислить интеграл любой непрерывной на  [latex]\left[a;b \right][/latex]  функции, для этого нужно изменить 7 строку.

В условии главного цикла [latex]N\leq 4[/latex], так как важно, чтобы цикл выполнился хотя бы дважды. Потому что первый раз мы сравниваем новое значение интеграла не с предыдущим вычисленным, а с нулём, и если новое значение интеграла будет меньше погрешности, то цикл прекратится после первого же выполнения (без условия [latex]N\leq 4[/latex]).

Задача на Ideone:
C++
Java

Сорокина Полина
Сорокина Полина

Latest posts by Сорокина Полина (see all)

5 thoughts on “Ю11.8

  1. Долго смотрел на Ваше решение — чувствуя какой-то скрытый подвох. И вот он — если Вы вычислите приближенное значение интеграла при N=2, и окажется что оно равно нулю или очень близко к нулю, то выполнится условие fabs(I1-I)>eps и будет выдан ответ (ведь в конце первой итерации в переменной I будет «фантомный» ноль, не полученный по формуле Симпсона). Этот ответ будет выдан даже, если точное значение интеграла существенно отличается от нуля. Нужно обеспечить, чтобы выполнилось как минимум две итерации (при N=2 и N=4). Понимаю, что такая ошибка будет очень редко проявлять себя. Но тем более она коварна — в реальной программе такая скрытая ошибка может проявить себя в самый неожиданный момент. Если это просто обычная программа расчета чего-либо, то будет выдан неверный ответ, а если эта программа будет управлять атомной станцией или космическим кораблем может произойти катастрофа. Так что постарайтесь исправить этот мелкий недочет. Достаточно дополнить условие продолжения цикла.

  2. Засчитано, отлично, 10 баллов, только три небольшие просьбы:
    1) Вместо условия N==4 (правильного в Вашем случае) надежнее и логичнее поставить N<=4.
    2) Опишите в отчете этот нетривиальный момент с этим условием.
    3) и, наконец, раз это условие уже поставлено, то давайте я придумаю тест, где оно будет существенно: давайте возьмем функцию x*(x*x-1)*(x+1) на интервале от -1 до 1 . Проверьте свою старую версию (без дополнительного условия) и новую версию — в отчет впишите результат правильной программы.

Добавить комментарий