Ю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

Related Images:

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 . Проверьте свою старую версию (без дополнительного условия) и новую версию — в отчет впишите результат правильной программы.

    • Исправила код и дополнила отчёт.

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