Результаты массива требуют явного интерфейса. Вам также нужно будет отрегулировать 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
. Существует внутренняя функция с тем же именем. Это может привести к некоторой путанице ...