0

0
0

文字

分享

0
0
0

以程式人的想法為「油價公式」除錯

程式人雜誌
・2013/06/13 ・3781字 ・閱讀時間約 7 分鐘 ・SR值 556 ・八年級

文 / 陳鍾誠 (國立金門大學資工系助理教授)


近來、每當中油油價要調漲時,很多新聞都會報導或批評,例如我們常常會聽到以下說法:

「甚麼都漲、就是薪水不漲」

等等的抱怨。

但是、您瞭解中油油價調漲的基準與方式是甚麼嗎?其中是否藏有某些您不知道的秘密呢?

在本文中,我們將透過「程式人的專業角度」,為您解讀油價公式內所隱藏的秘密!

但是在此之前,先讓我們介紹一下這個祕密背後所需要的「數學背景」。

遞歸關係

在「資訊類科系」(Computer Science) 的課程當中,「離散數學」(Discrete Mathematics) 是一們重要的數學課, 其中有個「遞歸關係式」 (Recurrence Equation) 的數學函數,可以用來計算程式 (或演算法) 的執行效能, 但是在本文中,我們將改用「遞歸關係」來為「中油的油價公式」進行除錯,證明「中油的油價公式會造成幾何暴漲」。

首先讓我們來看看甚麼是「遞歸關係」,先從一個比較簡單的例子開始:

問題 1. 假如有隻母雞,從成年開始他每天下一個蛋,那麼在成年後第 n 天他總共下了幾個蛋呢?

解答:關於這個問題,答案非常簡單,很多人一看就知道是 n 個蛋了。

但是讓我們姑且用遞歸關係來寫出這個問題的數學式:

T(n) = T(n-1) + 1
T(1) = 1

為了求解這樣的算式,我們可以將 n 代入 1, 2, 3, ….,然後列表如下:

T(1) = 1
T(2) = T(1) + 1
T(3) = T(2) + 1
T(4) = T(3) + 1
…..
T(n) = T(n-1) + 1

於是、您可以透過由上而下的計算方式,算出這個「遞歸關係」的解答,如下所示:

T(2) = T(1) + 1 = 1 + 1 = 2
T(3) = T(2) + 1 = 2 + 1 = 3
T(4) = T(3) + 1 = 3 + 1 = 4
….

很直覺的,您應該會猜測 T(n) 的解答就是 n,這個猜測是沒錯的!

上述遞歸關係的解答 T(n) 是個線性函數,也就是國中課程當中所說的「算術級數」。

接著、讓我們再來看看一種會造成「幾何級數」的遞歸關係,同樣的,讓我們先看看下列問題:

問題 2. 假如培養皿中有隻細菌、該細菌每分鐘分裂一次,請問在第 n 分鐘的時候,共有幾隻細菌?

解答:我們可以將這個問題寫成以下的遞歸關係:

T(n) = 2 * T(n-1)
T(0) = 1

於是我們可以列出前幾項的結果如下:

T(0) = 1
T(1) = 2*T(0) = 2 * 1 = 2
T(2) = 2*T(1) = 2 * 2 = 4
T(3) = 2*T(2) = 2 * 4 = 8
….

如果您觀察一下上述列表,可能會猜測 ,這個猜測也是對的,這類的函數稱為幾何級數。

著名的社會學家「馬爾薩斯」就在其名著「人口論」當中,提出了一個「廣為人知」的論點,其推論如下:

糧食的增長函數是算術級數,而人口的增長函數是幾何幾數,幾何級數後期的增長會遠超過算術級數, 因此糧食最後必然會不足,於是「饑荒、戰爭與大規模的疾病」將會是不可避免的結果。

另外、電腦在表示數字的時候,由於採用固定位元數的方式,因此都會有一些誤差,特別是像π這類的 無理數,更是無法用電腦精確表示,這些誤差如果經過某些遞歸關係放大之後,很可能會造成「差之毫釐、 失之千里」的結果。這類誤差放大的研究,甚至導致了學術上「混沌理論」的重要進展!

中油的油價調漲公式

那麼、這些結果與中油的油價公式有何關係呢?讓我們來看看中油的油價,是如何調整的,在中油的 國內汽、柴油浮動油價調整機制作業原則 這份 PDF 文件當中,有一段令人難以解讀的中文如下:

  • 一、 調價指標:Platts報導之 Dubai 及 Brent均價,分別以70 %及30%權重計算(70 % Dubai +30% Brent),取小數二位,採四捨五入。
  • 二、 調價幅度:每週(週一至週五)調價幅度取「調價指標當週均價乘以當週匯率均價與調價指標前週均價乘以前週匯率均價比較」之80%變動幅度計算,取小數二位,採四捨五入。
  • 三、 調價金額:(一)依「92 無鉛汽油及高級柴油還原依機制計算應調整價格之稅前批售價格」乘以「調價幅度」,分別計算 92無鉛汽油及高級柴油稅前批售價格,再加上稅費換算 零售價(取小數一位,採四捨五入),據以計算調價金額。

由於這段話實在令人難懂,所以讓我們稍為進行一下數學定義,以數學的方式解讀這段「自然語言」,解讀前首先讓我們定義幾個變數:

  • P = 本期價格 = P(t)
  • P’ = 上期價格 = P(t-1)
  • C = 本期國際均價 = C(t)
  • C’ = 上期國際均價 = C(t-1)

以上的的國際均價 C 即為第一項所稱之調價指標。根據上述定義,則調價幅度的數學式解讀如下:

(P-P’)/P’ = (C -C’)/C’ * 0.8

也就是

調價幅度 = (本期價格 P – 上期價格 P’)/上期價格 P’ = (當期調價指標 C – 前期調價指標 C’)/前期調價指標 C’ * 80%

將上述數學式移項調整一下,可得下列數學式:

P = P’ + P’ * (C-C’)/C’ * 0.8

假如那段「令人難以解讀的中文」之數學式真的如以上所解讀的,那麼我們就可以透過電腦計算油價,並且可以進行模擬。

以程式模擬漲跌過程

於是我寫了一個簡單的 C 語言程式以模擬整個油價的調整過程,在程式中我們讓油價以正弦函數 2 + sin(i) 的方式震盪, 這個正弦函數是一個必然介於 1 到 3 之間的函數。但是、模擬的結果肯定會讓人嚇一大跳:

#include <stdio.h>
#include <math.h>

double gen(int n) {
doubl p=1.0, p1=1.0, c=1.0, c1=1.0;
int t;
for (t=1; t<=n; t++) {
c = 2.0+sin(t);
p = ((c-c1)/c1)*0.8*p1 + p1;
printf(“t=%d : c=%6.2f p=%6.2f\n”, t, c, p);
c1 = c;
p1 = p;
}
}

int main() {
gen(1000);
}

雖然在模擬過程當中,國際油價始終在 1 元到 3 元之間震盪,但是經過了很多期之後,整個國內油價還是暴漲, 從最初 2.47 元 (比國際油價 2.84 元還低),到 500 期時上漲到 397.04 元 (此時國際油價為 1.53 元),然後 到了 1000 期時更暴漲到 174551.80 元 (十七萬四千多元,此時國際油價為 2.83 元)。

執行方法與指令

D:\Dropbox\Public\pmag\201307\code>gcc oil.c -o oil

D:\Dropbox\Public\pmag\201307\code>oil > oil.lst

執行結果摘錄

t=1 : c= 2.84 p= 2.47
t=2 : c= 2.91 p= 2.52
t=3 : c= 2.14 p= 1.99
t=4 : c= 1.24 p= 1.32
t=5 : c= 1.04 p= 1.15
t=6 : c= 1.72 p= 1.75
t=7 : c= 2.66 p= 2.51
t=8 : c= 2.99 p= 2.76
t=9 : c= 2.41 p= 2.34
t=10 : c= 1.46 p= 1.59

t=500 : c= 1.53 p=397.04
t=501 : c= 1.00 p=287.44
t=502 : c= 1.39 p=376.22
t=503 : c= 2.34 p=581.21
t=504 : c= 2.97 p=707.73
t=505 : c= 2.71 p=658.28
t=506 : c= 1.80 p=480.40
t=507 : c= 1.07 p=324.10
t=508 : c= 1.19 p=354.96
t=509 : c= 2.06 p=561.54
t=510 : c= 2.87 p=738.31

t=990 : c= 1.61 p=98834.43
t=991 : c= 1.01 p=69539.87
t=992 : c= 1.32 p=86448.98
t=993 : c= 2.25 p=135085.66
t=994 : c= 2.95 p=168513.04
t=995 : c= 2.77 p=160415.99
t=996 : c= 1.89 p=119299.47
t=997 : c= 1.10 p=79653.27
t=998 : c= 1.14 p=82110.42
t=999 : c= 1.97 p=129690.29
t=1000 : c= 2.83 p=174551.80

油價公式的問題

這個模擬過程告訴我們,中油的油價調整公式的設計,會有某種誤差放大效果,而且這種放大效果並非上下一致的,而是向上放大的情況較嚴重,這與達爾文進化論中的「適者生存、而且會產生更多後代」 有點類似,都是一種隨機性的幾何上漲的過程,因此才會造成後期的暴漲。

這個現象並非我所發現的,而是我在 MR. OTTER 在「歐特先生本性難移」網誌的 中油油價公式,創造永遠跌不回去的油價 一文中所看到的, 我只是將該文用程式人的方式重新解讀一遍而已!

透過這個油價的範例,相信您應該可以看到「遞歸運算式」千變萬化的一面,在設計制度時也會更小心一些, 以免不小心落入幾何暴漲的陷阱,造成毀滅性的災難啊!

疑問與解決辦法

在上述的油價調整公式之設計中,調價幅度以 80% 計算,似乎是為了讓油價不要太快上漲或下跌,以免衝擊太大,但事實上這個方式反而是造成油價暴漲的元凶,如果將調價幅度改以 100% 計算,反而不容易有暴漲的問題。

為甚麼呢?讓我們舉一個簡單的例子,假設有某次波動,漲跌各一次,先漲了 100% 再跌了 50%,這時價格應該是 200% * 50% = 2 * 0.5 = 1, 也就是價格會回到原點,但是如果我們將調價幅度以 80% 計算,那麼就會變成 1.8 * 0.6 = 1.08,並沒有回到原價,而是漲了 8%,所以 這個看來是好意的 80% 調價幅度,其實隱藏了爆漲的種子,一但經過很多輪的漲跌之後,就可能造成國際價格不變,但國內價格卻漲翻天的情況。

不過如果國際油價是一路慢慢上漲或下跌,而沒有震盪情況的話,那麼中油油價只會一路慢慢跟隨,而不會有漲翻天的情況!

但是、這個公式每週都至少用一次,那從開始實施浮動油價之後,應該也有幾百次的調整了,那麼為何一直沒有發現暴漲現象呢? 這個問題根據我的猜測,很可能是因為 國內汽、柴油浮動油價調整機制作業原則 這份 PDF 文件的後半部,還有一條重要的規定如下:

  • 七、各週調整後 92無鉛汽油、高級柴油零售價換算稅前批售價格,以亞鄰競爭國(日本、韓國、香港、新加坡)當週稅前價之最低價做為浮動油價調整的上限。

由於被這個第七條壓住了,所以油價並沒有暴漲,但是這樣的做法顯然很沒道理,先設計一個有問題會暴漲的公式,然後再用一個額外的規定壓住它,這真的是非常奇怪不合理的想法!

事實上,採用「遞歸數學式」有時很難控制得很好,如果真的要只是要緩和上漲與下跌的幅度,那不如採用「移動平均線」的方式,例如根據 前 5 期國際油價平均值,加上一定比例的利潤率 (例如 5%) 做為油價,就不會有這種幾何暴漲的現象了。

如果用數學表示這種鎖定國際油價移動平均線的方法,可以用下列「沒有遞歸」的數學式表示:

P(t) = 1.05 * [C(t-1)+C(t-2)+C(t-3)+C(t-4)+C(t-5)] / 5

由於上述算式的右端沒有 P(t-1) 之類的函數存在,而且 C(t-i) 的計算也與國內油價 P(t) 無關,如此就不會因為「回饋效應」而造成幾何暴漲了!

當然,假如我們對上述 國內汽、柴油浮動油價調整機制作業原則 的「中文」理解錯誤的話,那本文的推論就可能是錯誤的。因此我們希望中油 與相關單位能夠澄清一下,最好能將該文的「遞歸數學式」寫出來,讓大家都能看得更清楚明白啊!

參考文獻

轉載自程式人雜誌


數感宇宙探索課程,現正募資中!

文章難易度
程式人雜誌
10 篇文章 ・ 0 位粉絲
程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。


2

5
2

文字

分享

2
5
2

「你不要過來啊!」蜘蛛為了在交配中保命,竟然把自己給射出去了!

Peggy Sha
・2022/05/18 ・1686字 ・閱讀時間約 3 分鐘

自然界中,充滿了不少為了交配而「慷慨赴義」的勇者,像是:螳螂、蜘蛛等等,在激戰中或激戰後,雄性會變成配偶的盤中飧,如此一來,不僅可以延長交配時間、增加受精機率,還能為雌性提供養分,讓後代更有機會健康快樂地成長!(讓我們感謝飛天小爸爸的努力!)

「性食同類」不僅可以延長交配時間、增加受精機率,還能為雌性提供養分,讓後代更有機會健康快樂地成長!圖/Pixabay

這種現象呢,被稱之為「性食同類」(sexual cannibalism),通常是雌性吃掉雄性的比例稍微高一些。

但正如俗話所說,「生命會自己找到出口」,竟然有雄性蜘蛛靠著把自己「射」出去來保下一命!今天,就要來為你講述,隆背菲蛛(Philoponella prominens)的噴射故事。

交配到一半就彈出去了?超離奇高速彈射之謎!

這次的主角隆背菲蛛呢,是一種原產於日本、韓國等地的社會性動物,過去驚人的成就包括:能夠一次聚集 300 多隻同伴,共同編織出一片大網。

至於牠們超強的彈射能力又是如何被發現的?原先,來自湖北大學的張士昶副教授與團隊正在研究隆背菲蛛的性行為,卻忽然發現了一個超離奇現象:完成交配之後,雄蛛居然會猛然彈開,「biu」地一下就飛得老遠!

這驚人的過程可說是快到不可思議,最高紀錄達到一秒 88.2 公分,別說是肉眼,就連普通相機都沒辦法正確紀錄下細節。

這個現象立刻引發了研究團隊的好奇心,那麼接下來該怎麼辦呢?當然是:交配大戰看起來!

射,還是不射?這是個攸關性命的問題!

為了進行研究,團隊總共觀察了 155 次交配行為,並在其中 152 次中觀察到了這種超高速的彈射情形。你可能會很好奇,那剩下的 3 次呢?嗯……那 3 隻隆背菲蛛沒有成功彈射出去,交配後就成了配偶的大餐了。

什麼?沒彈掉就會被吃掉?這究竟是巧合還是命運的安排?

研究人員決定出手人為干預一下,他們選了 30 隻隆背菲蛛,然後想辦法阻止牠們彈射,結果發現:「彈射=保命」,要是你射不出去,那你就逃不過配偶的大口,注定要變成人家的晚餐。

要是隆背菲蛛彈射失敗,那就逃不過配偶的大口,注定要變成人家的營養來源。圖/Pixabay

相反地,如果成功彈出去了,那麼,你不但可以保命,也多了再次交配的機會。嘿,沒錯,牠們彈出去後還會再爬回來交配,再彈、再爬、再交配,就如此反反覆覆。(當然啦,有時也會在過程中不小心弄掉一些身體部位,比如一兩支步足。)

想要成功噴射,你需要一對強壯的步足!

至於為何隆背菲蛛能變成這樣的飛天小蜘蛛呢?秘密就藏在牠們的步足中。研究團隊發現,雄蛛們會將第一對步足抵在雌蛛身上,一旦交配完成,就用力蹬腳彈射出去。

根據實驗,科學家們發現這對步足可說是噴射與交配關鍵,少了一支都不行,只要沒有這對秘密武器,雄蛛只會停留在求偶階段,但不會真的跟雌蛛交配。但如果掉的是其他幾支腳,那可完全不會影響交配過程,還是能順利完成生育大計。

而這對秘密武器最強大的地方,其實是來自液壓;只要蜘蛛擠壓胸部的肌肉,便可以將其中的體液注入特定關節(tibia–metatarsus joint),透過液壓來伸直步足、產生彈力。

沒想到吧?為了在交配中保命,隆背菲蛛還得運用到流體力學,是不是很有趣呢?

參考資料:

Male spiders avoid sexual cannibalism with a catapult mechanism: Current Biology
These male spiders catapult away to avoid being cannibalized after sex
Watch These Male Spiders Jump Like Hell to Avoid Being Eaten After Sex
This Male Spider Catapults Itself Into the Air to Avoid Sexual Cannibalism | Science| Smithsonian Magazine
台灣物種名錄


數感宇宙探索課程,現正募資中!

所有討論 2
Peggy Sha
9 篇文章 ・ 7 位粉絲
曾經是泛科的 S 編,來自可愛的教育系,是一位正努力成為科青的女子,永遠都想要知道更多新的事情,好奇心怎樣都不嫌多。