2017年4月22日 星期六

札記-數學-氣壓轉高度公式的指數(對數)

這是寫程式時,對數學公式的絮叨。
之前要將感應器(barometer sensor)讀出的氣壓數值,轉換成海拔高度。
嚴謹來說,
用維基寫的那段Source code(註1)才正確,但我們的需求是,大約數值便可。
就向(barometer sensor)廠商要簡便公式(註2),所得公式如下:
h = 44330 * (1.0 - pow(pressure / seaLevelPressure, 0.1903))

pressure是讀出的氣壓值,seaLevelPressure是海平面的氣壓值,兩者皆浮點數。
要留意,pressure/seaLevelPressure,也要是浮點數。

由於我們目前用的SOC的軟體環境跟原始碼、函數集,並不包括C語言所含之全部。
我就遇過呼叫不到的函數,因此,關鍵就在於能不能使用pow()。
幸虧,聽我同事講,他計算經緯度也用到pow(),這函數是有的。
不然,我就要複習指數、對數,跟查對數表查到翻了。
 
 
指數(對數)在工程上是常用的數學,像Microsoft Windows的小算盤就有工程型。
如果pow()不能用,就真的太不尋常了!
除了上說的氣壓轉高度、經緯度,
聲音的分貝(註3)、地震規模(註4)都與指數(對數)相關。
以聲音而言:
分貝(dB)是十分之一貝(B):1B = 10dB。
1貝的兩個功率量的比值是10:1。
例如,70分貝就是60分貝的10倍,
61分貝就是60分貝的10的0.1次方倍,即1.25892倍了。
62分貝是60分貝的0.2次方倍,即1.58489倍,以此類推。
同理,大聲公比賽,125分貝其實也是124分貝的1.25892倍。
所以,說剛剛只用七成功力得124分貝,
假如用十成洪荒之力的話,僅會上升1分貝(125分貝),而不到2分貝(126分貝)。
 
那地震規模(不是指震度)的話,
則是按1966年Bath所提之logE=5.24+1.44M
(E:釋放能量(單位焦耳), M:地震規模)的公式計算。
規模7地震的能量,是規模6地震的32倍。
計算如下:
 假設規模6地震能量為 E1,規模7地震能量為 E2
 則log(E2)=5.24+1.44(6+1)
 且log(E1)=5.24+1.44(6)

 log(E2/E1)=1.5 故 E2/E1=10^(1.44)≒27.54
同樣地,也可推出規模6.1地震,是規模6地震10的0.144次方倍,即1.39倍。
 
 
 
-----------------------

註2:
1. amoBBS: formula
altitude = 44330 * (1.0 - pow(P / P0, 0.1903)); P0是海拔大氣壓,P為你測的當地大氣壓。

2. BMP180 模組使用提示 - Arduino 接線與程式測試
float BMP180::getAltitude(float pressure, float seaLevelPressure) {
return 44330 * (1.0 - pow(pressure / seaLevelPressure, 0.1903));
};

3. arduino:Barometric Pressure to Altitude
h = 44330 * [ 1 - ( p / p0 ) ^ ( 1 / 5.255) ]

h = altitude (m)
p = measured pressure (Pa)
p0 = reference pressure at sea level.

4. 廣州友善電子科技有限公司:Pressure_and_Temperature_Sensor









註3:維基:分貝

註4:
1. 地震的規模、震度log10E = 5.24 + 1.44M E︰釋放能量(焦耳)
 由1966年Bath所提之logE=5.24+1.44M(E:釋放能量, M:地震規模)經驗公式
 地震規模和所釋放的能量滿足以下關係式
 logE=11.8+1.5M

 若規模M=X時能量為E1,規模M=X+1時能量為E2
 則log(E2)=11.8+1.5(M+1)
 且log(E1)=11.8+1.5(M)

 兩式相減得log(E2/E1)=1.5
 故 E2/E1=10^(1.5)=31.62≒32
 Bodhi:單位是爾格。
4. 地震規模有多大
 古登堡和芮氏(Gutenberg & Richter, 1956)所提出之地震規模和能量之間的
 關係公式來計算,即 
 logE = 11.8 + 1.5Μ 
 其中 E:能量(單位:爾格) Μ:地震規模