如何解决如何在 Sympy 求解器中使用线性插值?
我正在使用 Sympy 来求解一组复杂的方程(32 个方程中的 32 个变量)。 我希望该等式之一是表格线性插值的结果,使用未知数之一作为插值。
很遗憾,由于IP,我无法共享我的代码,因此我创建了一个虚拟示例;这是代码:
import sympy as sym
import numpy as np
import time
# Example: heat transfer through a 1D infinite plate of thickness "s"
T1 = 1400
H1 = 2100
s = 0.1
H2 = 3000
T2 = 600
#
list_unkNown = sym.symbols('k,Tw1,Tw2,Q')
k,Q = list_unkNown
list_eq = []
list_eq.append(sym.Eq(k,15.0))
list_eq.append(sym.Eq(Q,H1*(T1-Tw1)))
list_eq.append(sym.Eq(Q,k/s*(Tw1-Tw2)))
list_eq.append(sym.Eq(Q,H2*(Tw2-T2)))
#
start = time.time()
result = sym.nsolve(list_eq,list_unkNown,[10,1000,1000],dict=True) #nonlinear solver: must be initialized
end = time.time()
print("Non-Linear solver: ",result)
print("Elapsed time : ",end-start,"s")
结果:
Non-Linear solver: [{k: 15.0000000000000,Tw1: 1349.04458598726,Tw2: 635.668789808917,Q: 107006.369426752}]
Elapsed time : 0.01792430877685547 s
正如您在这种情况下所看到的,变量“k”固定为 15.0,但现在我希望它是 Tw1 和 Tw2 的函数(从物理上讲,它代表热导率,我希望它是平均值的函数Twall 值)。
import sympy as sym
import numpy as np
import time
# Example: heat transfer through a 1D infinite plate of thickness "s",using numpy
def kINTERP(T):
x_data = [400.0,600.0,800.0,1000.0,1200.0,1400.0]
y_data = [10.0,12.0,14.0,16.0,18.0,20.0]
k = np.interp(T,x_data,y_data)
return k
T1 = 1400
H1 = 2100
s = 0.1
H2 = 3000
T2 = 600
#
list_unkNown = sym.symbols('k,kINTERP((Tw1+Tw2)/2)))
list_eq.append(sym.Eq(Q,"s")
如果您了解 Sympy 求解器,您可能会期待结果:
TypeError: can't convert expression to float
在那之后,我尝试使用 sympy interpolating_spline,它有效:
import sympy as sym
import numpy as np
import time
# Example: heat transfer through a 1D infinite plate of thickness "s",using interpolating_spline
T1 = 1400
H1 = 2100
s = 0.1
H2 = 3000
T2 = 600
#
x_data = [400.0,1400.0]
y_data = [10.0,20.0]
x = sym.symbols('x')
start = time.time()
myfun = sym.interpolating_spline(1,x,y_data)
end = time.time()
print("myfun Elapsed time: ","s")
#
list_unkNown = sym.symbols('k,myfun.subs(x,(Tw1+Tw2)/2)))
list_eq.append(sym.Eq(Q,dict=True) #nonlinear solver: must be initialized
end = time.time()
print("Non-Linear solver : ",result)
print("Elapsed time : ","s")
但是如果我们看一下结果:
myfun Elapsed time: 6.12949275970459 s
Non-Linear solver : [{k: 15.9194167818222,Tw1: 1346.27785454813,Tw2: 637.605501816308,Q: 112816.505448924}]
Elapsed time : 0.05178380012512207 s
解决方案比以前慢,interpolating_spline 的构建非常非常慢,考虑到我的代码有 6 倍的方程并且表格数据包含数百个条目。
有没有一种有效的方法可以在 sympy 中进行线性插值?
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。