这是主程序:
PROGRAM integration
EXTERNAL funct
DOUBLE PRECISION funct, a , b, sum, h
INTEGER n, i
REAL s
PARAMETER (a = 0, b = 10, n = 200)
h = (b-a)/n
sum = 0.0
DO i = 1, n
sum = sum+funct(i*h+a)
END DO
sum = h*(sum-0.5*(funct(a)+funct(b)))
PRINT *,sum
CONTAINS
END
以下是功能函数(x)
DOUBLE PRECISION FUNCTION funct(x)
IMPLICIT NONE
DOUBLE PRECISION x
INTEGER K
Do k = 1,10
funct = x ** 2 * k
End Do
PRINT *, 'Value of funct is', funct
RETURN
END
我希望主程序中的'Sum'
在函数funct(x)
中的10个不同k值上打印10个不同的和。
我已尝试过上述程序,但它只编译了Funct()
的最后一个值,而不是总和的10个不同值。
答案 0 :(得分:1)
数组结果需要显式接口。您还需要使用funct
语句将sum
和dimension
调整为实际数组。使用显式接口需要Fortran 90+(感谢@francescalus和@VladimirF的提示)并且非常乏味:
PROGRAM integration
INTERFACE funct
FUNCTION funct(x) result(r)
IMPLICIT NONE
DOUBLE PRECISION r
DIMENSION r( 10 )
DOUBLE PRECISION x
END FUNCTION
END INTERFACE
DOUBLE PRECISION a , b, sum, h
DIMENSION sum( 10)
INTEGER n, i
PARAMETER (a = 0, b = 10, n = 200)
h = (b-a)/n
sum = 0.0
DO i = 1, n
sum = sum+funct(i*h+a)
END DO
sum = h*(sum-0.5*(funct(a)+funct(b)))
PRINT *,sum
END
FUNCTION funct(x)
IMPLICIT NONE
DOUBLE PRECISION funct
DIMENSION funct( 10)
DOUBLE PRECISION x
INTEGER K
Do k = 1,10
funct(k) = x ** 2 * k
End Do
PRINT *, 'Value of funct is', funct
RETURN
END
如果可以,您应该切换到更现代的标准,例如Fortran 90+,并使用modules
。它们自动提供接口,使代码更简单。
或者,您可以将k
的循环从函数中取出,并按元素执行求和。这将是有效的FORTRAN 77:
PROGRAM integration
c ...
DIMENSION sum( 10)
c ...
INTEGER K
c ...
DO i = 1, n
Do k = 1,10
sum(k)= sum(k)+funct(i*h+a, k)
End Do
END DO
c ...
请注意,我将k
传递给该函数。需要相应调整:
DOUBLE PRECISION FUNCTION funct(x,k)
IMPLICIT NONE
DOUBLE PRECISION x
INTEGER K
funct = x ** 2 * k
PRINT *, 'Value of funct is', funct
RETURN
END
此版本只返回一个标量并填充主程序中的数组。
除此之外,我不确定使用名为sum
的变量是明智的。有一个intrinsic function具有相同的名称。这可能会引起一些混乱......