2013-10-31 70 views
2

我在使用fortran計算e^x內積分和間隔[b.a]時遇到了一些麻煩。梯形法則的問題

我想我在功能調用中做錯了什麼。感謝您的幫助。

program trapezium 
    implicit none 

    integer :: i, n, b, a 
    real :: sumation, mean, deltax, f(i), integral 


! The value of the integral using the trapezium rule can be found using 
! integral = (b - a)*((f(a) +f(b))/2 + sumation_1_n-1)/n 

write(*,*) "type the limits b, a and the number of intervals" 
    read *, b, a, n 

    deltax = (b - a)/n 
     mean = (f(a) + f(b))/2 
sumation = 0 

do i = 1, n-1 
    sumation = sumation + f(i) 
end do 


     integral = deltax*(mean + sumation) 
    write (*,*) "the value of the integral using the trapezoidal method is", integral 

    end program 

function f(x) 
    real :: f(x) 
    integer :: x 

     f(x) = EXP(x) 

end function 
+0

我不確定數學在您的代碼中是否正確...即使用戶可以指定完全不同的限制,爲什麼總是從f(1)開始並轉到f(n-1) ?你不應該以'(a-b)/ n'的步驟從'a'跳到'b'嗎?你爲什麼在這裏使用整數? –

+0

i = 1到n-1是計算圖像上出現的總和。計算deltax的限制a和b。 [鏈接] http://imgur.com/uQOEGcS [/ link] – user2803219

回答

2

有幾個與你的代碼問題:

  • f是一個函數,但在同一時間,你定義數組f(i)
  • 當定義固定大小的數組中,大小必須在編譯時知道。所以real :: f(i)只適用於一個恆定i
  • exp()需要一個real變量,而不是一個整數
  • 整數運算可能會導致意外的結果:1/2 = 0,而不是0.5

什麼(這不嘗試解決數學,雖然 - 看我的意見):

module functions 
contains 
    function f(x) 
    implicit none 
    real :: f 
    integer,intent(in) :: x 

    f = EXP(real(x)) 

    end function 
end module 

program trapezium 
    use functions 
    implicit none 

    integer :: i, n, b, a 
    real :: sumation, mean, deltax, integral 


    ! The value of the integral using the trapezium rule can be found using 
    ! integral = (b - a)*((f(a) +f(b))/2 + sumation_1_n-1)/n 

    write(*,*) "type the limits b, a and the number of intervals" 
    read *, b, a, n 

    deltax = real(b - a)/real(n) 
    mean = (f(a) + f(b))/2 
    sumation = 0 

    do i = 1, n-1 
    sumation = sumation + f(i) 
    end do 


    integral = deltax*(mean + sumation) 
    write (*,*) "the value of the integral using the trapezoidal method is", integral 

end program 

注意,模塊的使用使編譯器來檢查函數的參數。此外,您不需要在主程序中定義函數的返回值。

+0

現在我的程序編譯。我認爲我在聲明中犯了一些可怕的錯誤。現在算法編譯,但正如你所看到的,我需要修正數學。謝謝! – user2803219