我试图编写一个程序,它接受一个预定义的函数过程,并在某个域上执行高斯正交积分。我不仅希望集成单个函数(例如f(x)),而且还想集成2和3个函数(f(x)*g(x))的乘积。
我已经成功地编写了执行高斯积分的过程,并测试了它与预定义的函数过程一起工作。但是,当我将两个过程的产品作为输入传递时,它不起作用。当我通过int = integral(S*phi,E_min,E_max,1)时(请参阅下面的积分过程),我得到的错误是Function ‘s’ requires an argument list
为了解决这一问题,我尝试编写一个包含3个函数过程的程序,并输出它们的产品。我这样做的方式如下
real(dp) function prod(func1,func2,func3)
interface
function func1(E,on)
use f90_kind
real(dp),intent(in)::E
logical,intent(in)::on
real(dp)::func1
end function func1
function func2(E,on)
use f90_kind
real(dp),intent(in)::E
logical,intent(in)::on
real(dp)::func2
end function func2
function func3(E,on)
use f90_kind
real(dp),intent(in)::E
logical,intent(in)::on
real(dp)::func3
end function func3
end interface
prod = func1(E,on) * func2(E,on) * func3(E,on)
end function prod这导致了Type mismatch in argument ‘e’ at (1); passed REAL(4) to REAL(8)。这就是我被困的地方。如何使我的集成过程函数接受两个或多个预定义函数过程的任何产品作为输入?
这里是高斯积分函数过程。
real(dp) function integral(func,a,b,int_pts)
interface
function func(E,on)
use f90_kind
real(dp), intent(in) :: E
logical,intent(in) :: on
real(dp) :: func
end function func
end interface
real(dp),intent(in) :: a,b
integer, intent(in) :: int_pts
integer :: idx1, idx2
real(dp) :: dx,F1,F2,S,I,up_lim,low_lim
logical :: on
real(dp),allocatable,dimension(:) :: point,weight
integer, parameter :: nqp = 7
allocate(point(nqp))
allocate(weight(nqp))
call legendre_set(point,weight)
dx = (b-a)/int_pts
I = 0.0_dp
on = .false.
do idx1 = 1,int_pts
low_lim = a + (idx1-1)*dx
up_lim = a + idx1*dx
F1 = (up_lim - low_lim)/2.0_dp
F2 = (up_lim + low_lim)/2.0_dp
S = 0.0_dp
do idx2 = 1,nqp
S = S + weight(idx2) * func(F1*point(idx2)+F2,on)
!print *,"idx2 is",idx2,"func is",func(F1*point(idx2)+F2,on)
enddo
I = I + S * F1
!print *,"Sum is",S
enddo
integral = I
end function integral当我用integral(S,E_min,E_max,1)调用它时,它工作得很好,其中S是这样一个预定义函数。
谢谢
发布于 2019-08-13 08:46:00
当我通过int = integral(S*phi,E_min,E_max,1) (整数过程见下文)时,我得到的错误是Function ‘s’ requires an argument list__
你不能乘一个函数,只有一个函数的结果。此外,在Fortran中没有lambda表达式。您必须构造要集成的实际函数,并将其传递给集成过程。
您可以(但不必)将其作为内部功能来完成。
int = integral(new_function,E_min,E_max,1)
contains
function new_function(E,on)
real(dp), intent(in) :: E
logical,intent(in) :: on
real(dp) :: new_function
new_function = S(E, on) *phi
end ...参见相关的Fortran minimization of a function with additional arguments Passing external function of multiple variables as a function of one variable in Fortran
https://stackoverflow.com/questions/57473962
复制相似问题