gpt4 book ai didi

python - f2py,返回数组的 Python 函数(向量值函数)

转载 作者:太空狗 更新时间:2023-10-30 01:23:01 25 4
gpt4 key购买 nike

在下面的 Python 中,我有五个函数包含在 func 返回的数组中,我必须集成它们。该代码调用使用 f2py 生成的外部 Fortran 模块:

import numpy as np
from numpy import cos, sin , exp
from trapzdv import trapzdv
def func(x):
return np.array([x**2, x**3, cos(x), sin(x), exp(x)])

if __name__ == '__main__':
xs = np.linspace(0.,20.,100)
ans = trapzdv(func,xs,5)
print 'from Fortran:', ans
print 'exact:', np.array([20**3/3., 20**4/4., sin(20.), -cos(20.), exp(20.)])

Fortran 程序是:

      subroutine trapzdv(f,xs,nf,nxs,result)
integer :: I
double precision :: x1,x2
integer, intent(in) :: nf, nxs
double precision, dimension(nf) :: fx1,fx2
double precision, intent(in), dimension(nxs) :: xs
double precision, intent(out), dimension(nf) :: result
external :: f
result = 0.0
do I = 2,nxs
x1 = xs(I-1)
x2 = xs(I)
fx1 = f(x1)
fx2 = f(x2)
result = result + (fx1+fx2)*(x2-x1)/2
enddo
return
end

问题是 Fortran 只集成了 func(x) 中的第一个函数。查看打印结果:

from Fortran: [ 2666.80270721  2666.80270721  2666.80270721  2666.80270721  2666.80270721]
exact: [ 2.66666667e+03 4.00000000e+04 9.12945251e-01 -4.08082062e-01 4.85165195e+08]

一种解决方法是修改 func(x) 以返回给定的值在函数数组中的位置:

def func(x,i):
return np.array([x**2, x**3, cos(x), sin(x), exp(x)])[i-1]

然后更改 Fortran 例程以使用两个参数调用该函数:

      subroutine trapzdv(f,xs,nf,nxs,result)
integer :: I
double precision :: x1,x2,fx1,fx2
integer, intent(in) :: nf, nxs
double precision, intent(in), dimension(nxs) :: xs
double precision, intent(out), dimension(nf) :: result
external :: f
result = 0.0
do I = 2,nxs
x1 = xs(I-1)
x2 = xs(I)
do J = 1,nf
fx1 = f(x1,J)
fx2 = f(x2,J)
result(J) = result(J) + (fx1+fx2)*(x2-x1)/2
enddo
enddo
return
end

哪个有效:

from Fortran: [  2.66680271e+03   4.00040812e+04   9.09838195e-01   5.89903440e-01 4.86814128e+08]
exact: [ 2.66666667e+03 4.00000000e+04 9.12945251e-01 -4.08082062e-01 4.85165195e+08]

但是这里 func 被调用了 5 次以上(在实际情况下 func有超过300个函数,所以它会被调用300次以上)。

  • 有没有人知道更好的解决方案来让 Fortran 识别 func(x) 返回的所有数组?换句话说,让 Fortran 将 fx1 = f(x1) 构建为一个包含 5 个元素的数组,对应于 func(x) 中的函数。

OBS:我正在使用 f2py -c --compiler=mingw32 -m trapzdv trapzdv.f90

进行编译

最佳答案

不幸的是,您无法将数组从 python 函数返回到 Fortran 中。为此你需要一个子例程(意味着它是用 call 语句调用的),而这是 f2py 不允许你做的事情。

在 Fortran 90 中,您可以创建返回数组的函数,但这同样不是 f2py 可以做的事情,尤其是因为您的函数不是 Fortran 函数。

您唯一的选择是使用循环解决方法,或者重新设计您希望 python 和 Fortran 交互的方式。

关于python - f2py,返回数组的 Python 函数(向量值函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com