Вы должны проверить, что происходит, когда вы получаете с x
близко к 1. Вы, конечно, не можете использовать DO WHILE (x<=1)
, потому что когда x==1
, тогда x+2*h
выше 1, и вы вычисляете квадратный корень из отрицательного числа.
Я предлагаю вообще не использовать DO WHILE
.Просто установите количество делений, вычислите шаг, используя размер шага в качестве длины интервала / число делений, а затем используйте
sum = 0
h = interval_length / n
x0 = -1
do i = 1, n
xa = (i-1) * h + x0 !start of the subinterval
xb = i * h + x0 !end of the subinterval
xab = (i-1) * h + h/2 + x0 !centre of the subinterval
!compute the function values here, you can reuse f(xb) from the
!last step as the current f(xa)
!the integration formula you need comes here, adjust as needed
sum = sum + fxa + 4 * fxab + fxb
end do
! final normalization, adjust to follow the integration formula above
sum = sum * h / 6
Обратите внимание, что вышеприведенное гнездо цикла написано очень общим способом, а неспецифичные для правила Симпсона.Я просто предположил, что h постоянен, но даже это можно легко изменить.По правилу Симпсона его можно легко оптимизировать.Вы, конечно, хотите только две оценки функции за интервал.Если это школьное задание, и вам нужно считать точки нечетно-четными, а не центральными, вы должны сами это скорректировать, это очень просто.