如何使用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
我怎样才能解决这个问题?
多谢各位