Калибровка термистора Штейнхарта-Харта в Sympy - PullRequest
0 голосов
/ 04 ноября 2019

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

1 Ответ

1 голос
/ 04 ноября 2019

Вот способ написать это не с помощью матриц, а только списками:

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 встречает их в смешанной формуле.

...