主题:[讨论]变步长求积分程序求助
子函数:
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
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