На основе уравнения Штейнхарта-Харта для модели термистора У меня есть простой трехточечный код для калибровки термистора 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))
В идеале его следует обобщить на многоточечный в минималистичная матричная форма, подобная
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