## Derivation of the Algorithm in `gentherm2`

Here's the Steinhart-Hart equation, which gives a thermistors
characteristic curve that's within 0.02 C over the temperature
range of interest (this, of course, assumes that your resistance
measurements are that accurate!). Thanks to David Parrish for
finding this.

1/T = A + B*ln(R) + C*ln(R)**3

The Steinhart-Hart coefficients for the GM sensor are
A=0.00150664
B=0.00022484
C=1.25794e-07.

To solve it, first make it look like a matrix equation.

A + c1*B + c2*C = c3

where
c1 = ln(R)
c2 = ln(R)**3
c3 = 1/T

So, given three points (Tn, Rn):
for n = 1..3:
cn1 = ln(Rn)
cn2 = ln(Rn)**3
cn3 = 1/Tn
A*1 + B*c11 + C*c12 = c13
A*1 + B*c21 + C*c22 = c23
A*1 + B*c31 + C*c32 = c33

Do Gaussian elimination in a generic fashion. Subtract the top from each of
the bottom two, resulting in:
B*(c21-c11) + C*(c22-c12) = c23-c13
B*(c31-c11) + C*(c32-c12) = c33-c13

Multiply the bottom one by (c21-c11)/(c31-c11):
B*(c21-c11) + C*(c32-c12)*(c21-c11)/(c31-c11) = (c33-c13)*(c21-c11)/(c31-c11)

Now subtract this from the top one:
C*((c22-c12) - (c32-c12)*(c21-c11)/(c31-c11)) = (c23-c13) - ((c33-c13)*(c21-c11)/(c31-c11))

And get C by itself:
(c23-c13) - (c33-c13)*(c21-c11)/(c31-c11)
C = -----------------------------------------
(c22-c12) - (c32-c12)*(c21-c11)/(c31-c11)

Now that C is known, solve for B:
c33-c13 - C*(c32-c12)
B = ---------------------
c31-c11

Then A,
A = c13 - B*c11 - C*c12

Now we need the original equation rewritten as T(R):
1/T = A + B*Ln(R) + C*(Ln(R))**3
T(R) = 1 / (A + B*ln(R) + C*ln(R)**3)

Here's a source for some test data (in fact it is encoded in
`gentherm2.c` as the default values):

Date: Wed, 20 Feb 2002 16:42:22 -0500
From: "Camden Lindsay"
To: megasquirt@yahoogroups.com
just found this spec for an 88 audi quattro temp sensor (engine computer)
Degrees C Ohms
0 5 - 6.5K
20 2 - 3 K
50 700 - 900
100 175 - 210
hope this helps
camden

Peter Florance told us about an old L-Jet-equipped BMW 528:
http://www.firstfives.org/faq/ljet/528i_Ljet_schematic.PDF
70f 1950-3000 ohms
100 950-1600
160 250- 550

Here is a plot of the Audi raw data against a curve generated
by `gentherm2`. Also included are the raw data from
Bruce's
original `gentherm` program, in yellow (I assumed they
were the GM sensor data, but I'm not sure now after comparing the
output of `gentherm` with the `airdenfactor.inc` and
`thermfactor.inc` files).