Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用fortran90进行数值积分_Fortran_Fortran90_Numerical Integration_Simpsons Rule - Fatal编程技术网

用fortran90进行数值积分

用fortran90进行数值积分,fortran,fortran90,numerical-integration,simpsons-rule,Fortran,Fortran90,Numerical Integration,Simpsons Rule,我试图用辛普森法则来计算从-1到1的区间内sqrt(1-x^2)的积分。然而,在我开发的代码中,由变量“s”表示的和根本不收敛于pi除以2。我是fortran和编程的新手,所以请耐心听我说。我做错了什么 PROGRAM integral REAL*8 :: x REAL*8 :: h REAL*8 :: fodd REAL*8 :: feven REAL*8 :: simpson REAL*8 :: s x = -1 s = 0 simpson = 0 h = 0 DO WHILE

我试图用辛普森法则来计算从-1到1的区间内sqrt(1-x^2)的积分。然而,在我开发的代码中,由变量“s”表示的和根本不收敛于pi除以2。我是fortran和编程的新手,所以请耐心听我说。我做错了什么

PROGRAM integral

REAL*8 :: x
REAL*8 :: h
REAL*8 :: fodd
REAL*8 :: feven
REAL*8 :: simpson
REAL*8 :: s

x = -1
s = 0
simpson = 0
h = 0

   DO WHILE (x<=1)

     fodd = sqrt(1-(x+(2*h+0.1))**(2))
     feven = sqrt(1-(x+2*h)**(2))
     simpson = 4*fodd + 2*feven
     s = s + simpson*(h/3)
     WRITE(*,*) x,h, fodd, feven, simpson, s
     h = 0.1
     x = x + h
     END DO

END PROGRAM
程序积分
实*8::x
实*8::h
REAL*8::fodd
REAL*8::feven
雷亚尔*8::辛普森
实*8::s
x=-1
s=0
辛普森=0
h=0

x
接近1时,你必须检查发生了什么。你当然不能使用
DO-WHILE(x你必须检查当
x
接近1时发生了什么。你当然不能使用
DO-WHILE(XY你当然应该在循环之前设置
h
。这不是这里的主要问题,但对未来很重要。此外,你真的应该告诉我们你得到了什么样的精确结果,以及你期望得到什么样的精确结果。当我们谈论数值积分的收敛性时,我们通常指的是h->0的收敛性。你现在只有h=0.1,你应该越来越低的值。另外,既然你声称自己是初学者,请注意R
real*8
不是标准的Fortran,因为我需要将步长设置两次,因为我需要它从零开始,以便正确计算奇数项。步长的大小不是问题所在,其他东西不起作用。是的,我我已经告诉过你,这不是这里的主要问题。但是,请相信我,步长
h
确实应该在循环之前设置,并让其固定。请不要链接到任何粘贴站。请将重要信息直接放在你自己的问题中。即使外部资源停止工作,这里的问题也应该提供给其他人未来。你当然应该在循环之前设置
h
。这不是这里的主要问题,但对未来很重要。此外,你真的应该告诉我们你得到了什么样的精确结果,以及你期望得到什么样的精确结果。当我们谈论数值积分的收敛性时,我们通常指的是h的收敛性->0.你现在只有h=0.1,你应该越来越低的值。另外,既然你声称自己是初学者,请注意R
real*8
不是标准的Fortran,这一步被设置了两次,因为我需要它从零开始,以便正确地计算奇数项。这一步的大小不是问题,其他一些东西不起作用ng.是的,我已经告诉过你,这不是这里的主要问题。但是,请相信我,步长
h
确实应该在循环之前设置,并让其固定。请不要链接到任何粘贴库。请将这里的重要信息直接放在你自己的问题中。即使外部资源停止,这里的问题也应该对其他人可用感谢您的帮助,但它似乎不起作用。我用2代替区间长度,用10代替n,并用在我刚刚编写的sqrt(1-(xa)**(2))点上计算的函数例如。但它返回的s值接近15,如果我尝试通过更改n来执行较小的步骤,它将返回更大的值。@Insight我忘了除以n,这应该是相当明显的,我在没有任何测试的情况下编写了代码,这是您的任务。谢谢您的帮助,但它似乎不起作用。我对于区间长度,为2,对于n,为10,对于在我刚刚写的sqrt(1-(xa)**(2))的点处计算的函数,为2例如。但它返回的s值接近15,如果我尝试通过更改n来执行较小的步骤,它将返回更大的值。@Insight我忘了除以n,这应该是相当明显的,我编写代码时没有进行任何测试,这是您的任务。
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