Sympy 中的 Steinhart-Hart 热敏电阻校准

Posted

技术标签:

【中文标题】Sympy 中的 Steinhart-Hart 热敏电阻校准【英文标题】:Steinhart-Hart thermistor calibration in Sympy 【发布时间】:2019-11-04 13:35:35 【问题描述】:

基于Steinhart-Hart 热敏电阻模型方程,我有简单的 3 点代码用于 NTC 热敏电阻校准:

from sympy import *

var('R1 R2 R3')
var('T1 T2 T3')
var('A  B  C')

#Ametherm DG103395
T1,R1 = 273.150,31991.6
T2,R2 = 323.150, 3641.0
T3,R3 = 373.150,  686.2

equations = [
    Eq( A + B*ln(R1) + C*ln(R1)**3 , 1.0/T1 ),
    Eq( A + B*ln(R2) + C*ln(R2)**3 , 1.0/T2 ),
    Eq( A + B*ln(R3) + C*ln(R3)**3 , 1.0/T3 ),
]

print solve(equations, (A,B,C))

理想情况下,它应该推广到 minimalistic 矩阵形式的多点,例如

T = Matrix([ 273.150, 323.150, 373.150, ....])
R = Matrix([1991.6,  3641.0,   686.2,   ....])
K = MatrixSymbol('K', 3, 1)

print solve( Eq( [1,ln(?),ln(?)**3]*K - 1/T]) )

通过在循环中创建方程式来扩展原始代码非常简单。但是看起来很灰。

是否存在干净且适当的矩阵方式来做到这一点?

更新: 看来我自己找到了解决方案。也许可以减少更多?

from sympy import *

#Ametherm DG103395
T = Matrix([  273.150,   298.150, 323.150,  373.150, ])
R = Matrix([31991.6,   10000.0,  3641.0,   686.2,    ])

M = Matrix.vstack( *R.applyfunc( lambda x: Matrix([[1, ln(x), ln(x)**3]]) ) )

ABC = M.solve_least_squares( T.applyfunc(lambda x: 1/x) )

print ABC

【问题讨论】:

【参考方案1】:

这是一种写法,不是用矩阵,而是用列表:

from sympy import *

T = [273.150, 323.150, 373.150]
R = [31991.6, 3641.0, 686.2]
n = len(T)
assert n == len(R), "R and T need to have the same length"

A, B, C = symbols("A B C", real=True)

equations = [ Eq( A + B*ln(R[i]) + C*ln(R[i])**3 , 1.0/T[i] ) for i in range(n) ]
print (solve(equations, (A,B,C)))

输出:A: 0.00115679797363983, B: 0.000227813584600384, C: 1.26349943638314e-7

请注意,您不需要将 T 和 R 声明为 SymPy 符号。它们是常量,当 SymPy 在混合公式中遇到它们时会自动转换。

【讨论】:

循环——这正是我不想做的;)矩阵方式在哪里? 矩阵只是变相的循环。不知道为什么你更喜欢矩阵?要构建矩阵,您将再次需要一个或多个循环。 Newer say newer... 试试 applyfunction() applyfunction 不是矩阵运算,只是写一个循环的复杂方式 恕我直言,应用于矩阵的函数是矩阵运算。矩阵本身是编写循环的复杂方式;)...有点离题。问题不只是_matrix 操作。问题是方程式声明中没有循环。

以上是关于Sympy 中的 Steinhart-Hart 热敏电阻校准的主要内容,如果未能解决你的问题,请参考以下文章

sympy 中的复数:解析欧拉恒等式

将 sympy 中的变量定义为 CONSTANT

新的 jupyter 笔记本中的 sympy 漂亮打印是不是损坏?

SymPy的dsolve的返回值中的r()函数是啥意思?

如何传递用于scipy的sympy表达式?

Python圈中的符号计算库-Sympy(转载)