我有一个Fortran90函数f(a,b)。我需要使用需要函数g(a)的一维根查找器,只有一个变量a,以找到各种b值的f的根。
在Matlab中,我可以使用参数b,
构建一个只有一个变量a的新函数gg = @(a) f(a, b);
b是一个可以在主程序中更改的参数,其范围也在f中。
如何在Fortran 90或95中执行此操作?
答案 0 :(得分:0)
简单:使用包装功能...如果这是您的原始功能f
:
integer function f(a,b)
implicit none
integer,intent(in) :: a, b
f = a + b
end function
你可以将它包装成一个带有常量wrapper_fct
的单参数函数b1
,如下所示:
integer function wrapper_fct(a)
implicit none
integer,intent(in) :: a
integer,parameter :: b1 = 10
wrapper_fct = f(a, b10)
end function
或者,甚至更简单:
integer function wrapper_fct(a)
implicit none
integer,intent(in) :: a
wrapper_fct = f(a, 10)
end function
答案 1 :(得分:0)
包装器的快速而肮脏的示例如下:
program omhulsel
implicit none
print *, 'f(1.,2.,3.) = ', f(1.,2.,3.)
print *, 'g(1.) = ', g(1.)
print *, 'g(1.,2.,3.) = ', g(1.,2.,3.)
print *, 'g(1.) = ', g(1.)
print *, 'g(1.,b=0.) = ', g(1.,b=0.)
contains
real function f(x,y,z)
real :: x, y, z
f = x**2 + y**2 + z**2
end function
real function g(x,a,b)
real :: x
real, optional :: a, b
real :: par_a = 0, par_b = 0
if (present(a)) par_a = a
if (present(b)) par_b = b
g = f(x,par_a,par_b)
end function
end program
函数g
保留其参数par_a
和par_b
(它们获取SAVE
属性),也可以通过传递可选参数来修改。
答案 2 :(得分:0)
你可以按如下方式处理,虽然它不完全等同于matlab的函数句柄(函数在Fortran中并不是真正的一等公民)。
module roots
implicit none
contains
subroutine root_finder(f,b)
procedure(func) :: f
real, intent(in) :: b
abstract interface
real function func(a,b)
real, intent(in) :: a,b
end function
end interface
print*, g(2.)
contains
real function g(a)
real, intent(in) :: a
g = f(a,b)
end function
end subroutine
end module
如您所见,两个变量的函数与参数b
一起传递给子例程。子例程使用内部函数g(a)
来评估f(a,b)
。这个函数就是"句柄"。
示例程序,它定义实际函数f(a,b) = a**2 + b
:
program example
use roots
implicit none
call root_finder(f, 10.)
contains
real function f(a,b)
real,intent(in) :: a,b
f = a**2 + b
end function
end program
输出:14.0000000