回 帖 发 新 帖 刷新版面

主题:[讨论]变步长求积分程序求助

子函数:
  real*8 function f(x)
  real*8 x
  if(x==0) then
    f=1
  else
    f=sin(x)/x
  endif
  end
子函数:
  function bianbc(f,a,b,k)
  real*8 bianbc,a,b,t,h,f1
  integer n, k
  t=(b-a)*(f(a)+f(b))/2
  do i=0,k
    n=2**i
    h=1.0*(b-a)/n
    f1=0
    do j=0,i
     f1=f1+ f(a+1.0*(2*j+1)/2*h)
    enddo
   t=1.0/2*t + 1.0/2*h*f1
  enddo
  bianbc=t
  end
主程序:
   external f
   real*8 bianbc
   real*8 a1,b1  
   real*8 result
1  read *,a1,b1,n1
   result=bianbc(f,a1,b1,n1)
   print *,"result=",result
   goto 1
   end
该程序用变步长法求积分sinx/x从0到1的积分,从键盘读入0,1,n1(二分次数),这个程序编译没得错误,就是结果和书上的差的太远,我估计是循环那里出问题了,但是我不才,改不过来啊!我都挣扎了好长时间了,请神仙帮忙啊!小弟我不胜感激。书上结果请大家参考:
二分次数:
0     0.9207355
1     0.9397933
2     0.9445135
3     0.9456909
4     0.9459850
5     0.9460586

回复列表 (共5个回复)

沙发

real*8 function f(x)
real*8 x
  if(x==0) then
    f=1
  else
    f=sin(x)/x
  endif
end

 function bianbc(f,a,b,n)
 real*8 bianbc,a,b,t,h,f1
 t=(b-a)*(f(a)+f(b))/2
 
 
do j=1,n
   f1=0
   h=1.0*(b-a)/n
 do i=0,n-1
  
  f1=f1+ f(a+1.0*(2*i+1)/2*h)
  
 enddo

 t=1.0/2*t + h/2*f1
 bianbc=t
enddo

 end
 
   external f
   real*8 a1,b1  
   real*8 result
1   read *,a1,b1,n1
   result=bianbc(f,a1,b1,n1)
   print *,"result=",result
   goto 1
   end

程序中有sin(x)/x,如果不用双精度的话误差会很大。

板凳


C:\MSDEV\Projects\tiezi\Text1.f90 : error FOR2205: wrong data type for reference to FUNCTION BIANBC from procedure main
执行时有错误啊,不晓得是咋回事,请高手指点啊,上面是错的信息提示。

3 楼


 real*8 function f(x)
 real*8 x
  if(x==0) then
    f=1
  else
    f=sin(x)/x
  endif
end

 function bianbc(f,a,b,k)
 real*8 bianbc,a,b,t,h,f1

 t=(b-a)*(f(a)+f(b))/2
 

 do i=0,k
   n=2**i
   h=1.0*(b-a)/n
   f1=0

   do j=0,i
    f1=f1+ f(a+1.0*(2*j+1)/2*h)
   enddo
   t=1.0/2*t + 1.0/2*h*f1
 enddo
bianbc=t
end
 
   external f
   real*8 bianbc
   real*8 a1,b1  
   real*8 result
1   read *,a1,b1,n1

   result=bianbc(f,a1,b1,n1)
   print *,"result=",result
   goto 1
   end
这样结果也不对

4 楼

楼主, 你是否考虑先把你的代码写规范一点? 虽然fortran2008兄弟已经帮你声明了不少变量, 但还有一些不是很明确.
我不是批评你的代码风格,只不过这样以利于别人帮你看.

5 楼

嘿嘿,楼主用的是Fortran PowerStation 4.0编译能发现错误,我用Compaq Visual Fortran 6.5没有发现。不过我刚刚又改过来了,能用Fortran PowerStation 4.0编译通过了。yeg001兄弟说得的,编程的变量一定要书写规范点。
real*8 function f(x)
real*8 x
  if(x==0) then
    f=1
  else
    f=sin(x)/x
  endif
end
real*8 function bianbc(f,a,b,n)
real*8 a,b,t,h,f1
t=(b-a)*(f(a)+f(b))/2 
do j=1,n
   f1=0
   h=1.0*(b-a)/n
 do i=0,n-1  
  f1=f1+ f(a+1.0*(2*i+1)/2*h)  
 enddo
 t=1.0/2*t + h/2*f1
 bianbc=t
enddo
end 
external f
   real*8 a1,b1  
   real*8 result,bianbc
1  read *,a1,b1,n1
   result=bianbc(f,a1,b1,n1)
   print *,"result=",result
   goto 1
   end

我来回复

您尚未登录,请登录后再回复。点此登录或注册