python fortran混编 ctypes_python – 使用ctypes在Fortran函数上使用scipy.optimize.minimize的错误结果...

我目前有一个Fortran函数,我希望使用SciPy使用Ctypes进行优化.这可能吗?也许我在实施中做错了.例如,假设我有:

cost.f90

module cost_fn

use iso_c_binding, only: c_float

implicit none

contains

function sin_2_cos(x,y) bind(c)

real(c_float) :: x, y, sin_2_cos

sin_2_cos = sin(x)**2 * cos(y)

end function sin_2_cos

end module cost_fn

我编译的:

gfortran -fPIC -shared -g -o cost.so cost.f90

然后尝试找到(本地)最小值:

cost.py

#!/usr/bin/env python

from ctypes import *

import numpy as np

import scipy.optimize as sopt

cost = cdll.LoadLibrary('./cost.so')

cost.sin_2_cos.argtypes = [POINTER(c_float), POINTER(c_float)]

cost.sin_2_cos.restype = c_float

def f2(x):

return cost.sin_2_cos(c_float(x[0]), c_float(x[1]))

# return np.sin(x[0])**2 * np.cos(x[1])

# print(f2( [1, 1] ))

# print(f2( [0.5 * np.pi, np.pi] ))

print( sopt.minimize( f2, (1.0, 1.0), options={'disp': True}, tol=1e-8) )

我期望局部最小f2(pi / 2,pi)= -1.当我使用cost.sin_2_cos返回值调用f2时,“最小值”仅在(1,1)的初始猜测时给出.如果我使用“Python”返回值调用f2,则optimize会找到正确的最小值.

我已经尝试重新定义sin_2_cos以获取维度(2)数组输入,但是看到了类似的行为.也许我需要用最小化直接调用sin_2_cos(但那么我如何为参数指定c_float)?任何想法都表示赞赏!

编辑:对于下面的注释,请注意两个注释的打印(f2(…))行产生预期值.因此,我相信通过Python f2函数正确调用Fortran函数.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值