我正在尝试使用Simpson规则在-1到1的区间内计算sqrt(1-x ^ 2)的积分。但是,在代码中,变量“ s”表示的总和开发人员,完全无法收敛到pi超过2。我是一般来说fortran和编程的绝对新手,请耐心等待。我在做什么错了?
time
以下是其生成的输出的链接:https://pastebin.com/mW06Z6Lq
由于该积分只是半径为1的圆的面积的一半,因此应收敛到pi超过2,但它大大超过了该值。我曾考虑过减小步长以提高精度,但这不是问题,因为当我尝试执行此操作时,它甚至超过了预期值。
答案 0 :(得分:4)
您必须检查当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
请注意,上面的循环嵌套是以非常通用的方式编写的,并不特定于Simpson的规则。我只是假设 h 是常数,但是即使这样也可以轻易地改变。对于辛普森规则,可以轻松地对其进行优化。您当然只希望每个间隔进行两次功能评估。如果这是学校的任务,并且您需要将分数视为奇偶数而不是中心数,则必须自己进行调整,这非常容易。