如何在 Sympy 求解器中使用线性插值?

如何解决如何在 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 值)。

所以我通过使用 numpy 添加一个函数来更改代码

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?