生活随笔
收集整理的這篇文章主要介紹了
常用算法 之二 牛顿迭代法求解PT100温度(高阶方程求解)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
問題
??在最近的工作中用到了PT100鉑電阻,它適用于醫(yī)療、電機、工業(yè)、溫度計算、衛(wèi)星、氣象、阻值計算等高精溫度設(shè)備,應(yīng)用范圍非常之廣泛。類似的還有PT1000。
??PT后的100即表示它在0℃時阻值為100歐姆,在100℃時它的阻值約為138.5歐姆。它的工作原理:當(dāng)PT100在0攝氏度的時候他的阻值為100歐姆,它的的阻值會隨著溫度上升它的阻值是成勻速增長的。
??在國家標(biāo)準(zhǔn)《GBT 30121-2013 工業(yè)鉑熱電阻及鉑感溫元件.pdf》中(下載見附件),PT100的分度表如下圖所示:
溫度與阻值的計算公式,在標(biāo)準(zhǔn)文檔中也是有的,如下:
以上公式涉及到高階方程的求解問題!
方法
??一般可使用牛頓迭代法求近似解!關(guān)于該方法,網(wǎng)友馬同學(xué)高等數(shù)學(xué) 寫了一篇非常棒的文章如何通俗易懂地講解牛頓迭代法?來進(jìn)行了非常詳細(xì)的介紹。由于沒有作者的授權(quán),這里不方便轉(zhuǎn)載,感興趣的可以點擊以上鏈接去看看!需要很強的數(shù)學(xué)知識哦!!!突然感覺,當(dāng)初的高等數(shù)學(xué)白學(xué)了,唉。。。
源碼
??從溫度獲取阻值非常簡單,重點在于從阻值獲取溫度!用二階導(dǎo)數(shù)切線法,根據(jù)電阻接近零度電阻程度,用1到3次計算可得到較為精確的溫度值:
先用線性公式得到一個粗略的溫度:
t1 = (Rt / R0 - 1) / A
計算t1的阻值:
0度以上用公式:Rt1 = R0 * (1 + A * t1 + B * t1 * t1);
0度以下用公式:Rt1 = R0 * [1 + A * t1 + B * t1 * t1 + C * (t1 - 100) * t1 * t1 * t1];
如果 |Rt1 - Rt| < 0.001,t1 就是所要的溫度,反之繼續(xù)進(jìn)行下面的計算:計算一階導(dǎo)數(shù)和二階導(dǎo)數(shù):
如果 Rt ≥ R0
t1’ = 1 / [R0 * (A + 2 * B * t1)]
t1’’ =-2 * B * R0 * t1’ * t1’ * t1’
如果 Rt < R0
t1’ = 1 / [R0 * (A + 2 * B * t1 - 300 * C * t1 * t1 + 4 * C * t1 * t1 * t1)]
t1’’=- R0 * (2 * B - 600 * C * t1 + 12 * C * t1 * t1) * t1’ * t1’ * t1’基于 Rt,t1,Rt1 計算近似溫度 t2:
t2 = t1 + t1’ * (Rt - Rt1) + 0.5 * t1’’ * (Rt - Rt1) * (Rt - Rt1),再計算出 t2 對應(yīng)的電阻 Rt2。如果 |Rt2 - Rt| < 0.001,t2 就是所要的溫度,反之再從第二步開始計算 t2 的一二階導(dǎo)數(shù),最終得出精確的溫度值。
#include <stdio.h>
#include <math.h>
#include <stdbool.h>#define A 3.9083e-3
#define B -5.775e-7
#define C -4.183e-12
bool
GetResistanceFromTempereture(double temp
, double* resist
)
{double fT
, fR
;bool ret
;if(resist
== NULL){return false
;}if (temp
>= -200 && temp
< 0){*resist
= 100 * (1 + A
* temp
+ B
* temp
* temp
+ C
* (temp
- 100) * temp
* temp
* temp
);ret
= true
;}else if (temp
>= 0 && temp
<= 850){*resist
= 100 * (1 + A
* temp
+ B
* temp
* temp
);ret
= true
;}else{*resist
= 0;ret
= false
;}return ret
;
}
bool
GetTemperetureFromResistance(double resist
, double* temp
)
{bool ret
;double fT
, fT0
;short i
;if(temp
== NULL){return false
;}fT0
= (resist
/ 100 - 1) / A
;if (resist
>= 18.52 && resist
< 100) {for (i
= 0; i
< 50; i
++){fT
= fT0
+ (resist
- 100 * (1 + A
* fT0
+ B
* fT0
* fT0
- 100 * C
* fT0
* fT0
* fT0
+ C
* fT0
* fT0
* fT0
* fT0
)) /(100 * (A
+ 2 * B
* fT0
- 300 * C
* fT0
* fT0
+ 4 * C
* fT0
* fT0
* fT0
));if (fabs(fT
- fT0
) < 0.001) {break;}else{fT0
= fT
;}}*temp
= fT
;ret
= true
;}else if (resist
>= 100 && resist
<= 390.481) {for (i
= 0; i
< 50; i
++){fT
= fT0
+ (resist
- 100 * (1 + A
* fT0
+ B
* fT0
* fT0
)) / (100 * (A
+ 2 * B
* fT0
));if (fabs(fT
- fT0
) < 0.001) {break;}else{fT0
= fT
;}}*temp
= fT
;ret
= true
;}else{ret
= false
;}return ret
;
}
int main(int argc
, char const *argv
[])
{double temp
= 0;double resist
= 68.33;if(GetTemperetureFromResistance(resist
, &temp
)){printf("Temp = %f\r\n", temp
);}else{printf("Temp = Error!\r\n");}return 0;
}
附件
GBT 30121-2013 工業(yè)鉑熱電阻及鉑感溫元件.pdf
總結(jié)
以上是生活随笔為你收集整理的常用算法 之二 牛顿迭代法求解PT100温度(高阶方程求解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。