2

fortran を使用して e^x inside と interval [ba] の積分を計算するのに問題があります。

関数呼び出しで何か間違っていると思います。私を助けてくれてありがとう。

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
4

1 に答える 1

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 

モジュールを使用すると、コンパイラは関数の引数をチェックできることに注意してください。さらに、メイン プログラムで関数の戻り値を定義する必要はありません。

于 2013-10-31T21:12:28.710 に答える