如何使用python函数调用带有Symphy非线性解算器的外部DLL?

如何使用python函数调用带有Symphy非线性解算器的外部DLL?,python,dll,sympy,Python,Dll,Sympy,我想使用Symphy非线性解算器(nsolve)来解一组方程。其中一个等式包含一个自定义python函数,该函数调用DLL中的子例程。此子例程只需将“300.0”添加到输入并返回总和。 我尝试了以下代码,效果良好: import sympy as sym import ctypes as ct def my_cp_fun(T): fortlib = ct.CDLL(r'myDLL.dll') # cp_out = 0.0 # T = ct.pointer


我想使用Symphy非线性解算器(nsolve)来解一组方程。其中一个等式包含一个自定义python函数,该函数调用DLL中的子例程。此子例程只需将“300.0”添加到输入并返回总和。
我尝试了以下代码,效果良好:

import sympy as sym
import ctypes as ct

def my_cp_fun(T):
    fortlib = ct.CDLL(r'myDLL.dll')
    #
    cp_out = 0.0
    #
    T = ct.pointer(ct.c_double(T))
    cp_out = ct.pointer(ct.c_double(cp_out))
    #
    _ = fortlib.myDLL_cp_fun(T,cp_out)
    return cp_out[0]

m = 0.25
T1 = 1500
s = 0.1
k = 15
H2 = 3700
T2 = 600

list_unknown = sym.symbols('Tw1,Tw2,Q,cp')
Tw1,Tw2,Q,cp = list_unknown
list_eq = []
list_eq.append(sym.Eq(Q , m*cp*(T1-Tw1)))
list_eq.append(sym.Eq(Q , k/s*(Tw1-Tw2)))
list_eq.append(sym.Eq(Q , H2*(Tw2-T2)))
list_eq.append(sym.Eq(cp ,my_cp_fun(T1)))

init = [500.0 for i in list_eq]
result = sym.nsolve(list_eq,list_unknown,init,dict=True) #nonlinear solver: must be initialized
print("Non-Linear solver: ",result)
输出:
非线性求解器:[{Tw1:1281.63934426230,Tw2:626.557377049180,Q:98262.2950819672,cp:1800.00000000000}]

现在,我希望我的自定义函数依赖于未知值“Tw1”之一,这会引发错误:

import sympy as sym
import ctypes as ct

def my_cp_fun(T):
    fortlib = ct.CDLL(r'myDLL.dll')
    #
    cp_out = 0.0
    #
    T = ct.pointer(ct.c_double(T))
    cp_out = ct.pointer(ct.c_double(cp_out))
    #
    _ = fortlib.myDLL_cp_fun(T,cp_out)
    return cp_out[0]

m = 0.25
T1 = 1400
s = 0.1
k = 15
H2 = 3700
T2 = 600

list_unknown = sym.symbols('Tw1,Tw2,Q,cp')
Tw1,Tw2,Q,cp = list_unknown
list_eq = []
list_eq.append(sym.Eq(Q , m*cp*(T1-Tw1)))
list_eq.append(sym.Eq(Q , k/s*(Tw1-Tw2)))
list_eq.append(sym.Eq(Q , H2*(Tw2-T2)))
list_eq.append(sym.Eq(cp ,my_cp_fun(Tw1))) #This line is now corrected

init = [500.0 for i in list_eq]
result = sym.nsolve(list_eq,list_unknown,init,dict=True) #nonlinear solver: must be initialized
print("Non-Linear solver: ",result)
输出:
TypeError:无法将表达式转换为float

问题似乎是转换成浮点值——这是让python与(Fortran)DLL正确接口所必需的。任何人只要将函数替换为以下内容,即可简单地再现此错误:

def my_cp_fun(T):
    cp_out = float(T) + 300.0
    return cp_out
我怎样才能解决这个问题? 多谢各位