Fortran 90中的中点规则

时间:2015-11-12 23:28:26

标签: fortran fortran90 gfortran

所以,我对整个编程事物都很陌生,所以任何和所有帮助都是值得赞赏的。我试图使用复合中点规则来解决这个积分。我知道我的答案应该是什么,而且我越来越接近了,但这并不完全正确。我的代码如下:

implicit none
double precision:: a,b,dx,m,f,s,x
integer::i,n

a=1.0d0
b=2.0d0

n=6
dx=(b-a)/n

s=0.0d0
do i=0,n
s=s+f(a+i*(dx/2))
end do

print*, s*(dx)
return
end

double precision function f(x)
implicit none
double precision :: x

f=x*log(x)
return
end

有谁能告诉我这段代码中有哪些错误可能会给我错误的答案?我认为错误在行

s=s+f(a+i*(dx/2))

1 个答案:

答案 0 :(得分:3)

首先,您的循环是将n+1个数字加在一起而不是n。你应该在n-1(或者从1开始)

停止循环

此外,中点规则中连续采样点之间的间距应该是您所呼叫的dx,而不是dx/2。样本点是:

a + (dx/2), a + 3*(dx/2), a + 5*(dx/2), ...

你需要

1)将i替换为(2*i+1)

中的s=s+f(a+i*(dx/2))

2)在您进入主循环之前,将a替换为a + dx/2(假设a是一个可以重新分配而不会影响调用代码的局部变量 - 我不会&# 39;记住Fortran是通过值传递还是通过引用传递)然后只使用行s=s+f(a+i*dx)。关键是,一旦第一个采样点移动到第一个分区块的中点,就可以通过大小为dx的步长来到达另一个子区间的中点。