2015-11-12 83 views
2

所以,我對整個編程的事情都很陌生,因此我非常感謝所有幫助。我正在嘗試使用複合中點規則來解決這個積分問題。我知道我的答案應該是什麼,而我越來越接近,但並不完全正確。我的代碼如下:Fortran中的中點規則90

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)) 

回答

3

一件事,你的循環是增加n+1數字加在一起,而不是n。你應該在n-1停止循環(或在1也許開始)

此外,在中點法則連續採樣點之間的間距應該是你在呼喚dx,不dx/2。採樣點:

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

你需要或者

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

2)更換i在你進入主循環,通過a + dx/2更換a (假設a是一個局部變量,可以在不影響調用代碼的情況下進行重新分配 - 我不記得Fortran是否通過了b y值或通過引用傳遞),然後只使用行s=s+f(a+i*dx)。重點是一旦第一個採樣點移動到第一個分區塊的中點,另一個子區間的中點可以通過大小爲dx的步驟達到。