Loading [MathJax]/extensions/tex2jax.js

0

0
1

文字

分享

0
0
1

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

程式人雜誌
・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) 無關,如此就不會因為「回饋效應」而造成幾何暴漲了!

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

轉載自程式人雜誌

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

0

2
1

文字

分享

0
2
1
ECU: 汽車大腦的演化與挑戰
鳥苷三磷酸 (PanSci Promo)_96
・2025/07/02 ・3793字 ・閱讀時間約 7 分鐘

-----廣告,請繼續往下閱讀-----

本文與 威力暘電子 合作,泛科學企劃執行。

想像一下,當你每天啟動汽車時,啟動的不再只是一台車,而是一百台電腦同步運作。但如果這些「電腦」突然集體當機,後果會有多嚴重?方向盤可能瞬間失靈,安全氣囊無法啟動,整台車就像失控的高科技廢鐵。這樣的「系統崩潰」風險並非誇張劇情,而是真實存在於你我日常的駕駛過程中。

今天,我們將深入探討汽車電子系統「逆天改運」的科學奧秘。究竟,汽車的「大腦」—電子控制單元(ECU),是如何從單一功能,暴增至上百個獨立系統?而全球頂尖的工程師們,又為何正傾盡全力,試圖將這些複雜的系統「砍掉重練」、整合優化?

第一顆「汽車大腦」的誕生

時間回到 1980 年代,當時的汽車工程師們面臨一項重要任務:如何把汽油引擎的每一滴燃油都壓榨出最大動力?「省油即省錢」是放諸四海皆準的道理。他們發現,關鍵其實潛藏在一個微小到幾乎難以察覺的瞬間:火星塞的點火時機,也就是「點火正時」。

如果能把點火的精準度控制在「兩毫秒」以內,這大約是你眨眼時間的百分之一到千分之一!引擎效率就能提升整整一成!這不僅意味著車子開起來更順暢,還能直接省下一成的油耗。那麼,要如何跨過這道門檻?答案就是:「電腦」的加入!

-----廣告,請繼續往下閱讀-----

工程師們引入了「微控制器」(Microcontroller),你可以把它想像成一顆專注於特定任務的迷你電腦晶片。它能即時讀取引擎轉速、進氣壓力、油門深度、甚至異常爆震等各種感測器的訊號。透過內建的演算法,在千分之一秒、甚至微秒等級的時間內,精準計算出最佳的點火角度,並立刻執行。

從此,引擎的性能表現大躍進,油耗也更漂亮。這正是汽車電子控制單元(ECU)的始祖—專門負責點火的「引擎控制單元」(Engine Control Unit)。

汽車電子控制單元的始祖—專門負責點火的「引擎控制單元」(Engine Control Unit)/ 圖片來源:shutterstock

ECU 的失控暴增與甜蜜的負荷

第一顆 ECU 的成功,在 1980 年代後期點燃了工程師們的想像:「這 ECU 這麼好用,其他地方是不是也能用?」於是,ECU 的應用範圍不再僅限於點火,燃油噴射量、怠速穩定性、變速箱換檔平順度、ABS 防鎖死煞車,甚至安全氣囊的引爆時機……各種功能都交給專屬的 ECU 負責 。

然而,問題來了:這麼多「小電腦」,它們之間該如何有效溝通?

-----廣告,請繼續往下閱讀-----

為了解決這個問題,1986 年,德國的博世(Bosch)公司推出了一項劃時代的發明:控制器區域網路(CAN Bus)。你可以將它想像成一條專為 ECU 打造的「神經網路」。各個 ECU 只需連接到這條共用的線路上,就能將訊息「廣播」給其他單元。

更重要的是,CAN Bus 還具備「優先通行」機制。例如,煞車指令或安全氣囊引爆訊號這類攸關人命的重要訊息,絕對能搶先通過,避免因資訊堵塞而延誤。儘管 CAN Bus 解決了 ECU 之間的溝通問題,但每顆 ECU 依然需要獨立的電源線、接地線,並連接各種感測器和致動器。結果就是,一輛汽車的電線總長度可能達到 2 到 4 公里,總重量更高達 50 到 60 公斤,等同於憑空多載了一位乘客的重量。

另一方面,大量的 ECU 與錯綜複雜的線路,也讓「電子故障」開始頻繁登上汽車召回原因的榜首。更別提這些密密麻麻的線束,簡直是設計師和維修技師的惡夢。要檢修這些電子故障,無疑讓人一個頭兩個大。

大量的 ECU 與錯綜複雜的線路,也讓「電子故障」開始頻繁登上汽車召回原因的榜首。/圖片來源:shutterstock

汽車電子革命:從「百腦亂舞」到集中治理

到了2010年代,汽車電子架構迎來一場大改革,「分區架構(Zonal Architecture)」搭配「中央高效能運算(HPC)」逐漸成為主流。簡單來說,這就像在車內建立「地方政府+中央政府」的管理系統。

-----廣告,請繼續往下閱讀-----

可以想像,整輛車被劃分為幾個大型區域,像是車頭、車尾、車身兩側與駕駛艙,就像數個「大都會」。每個區域控制單元(ZCU)就像「市政府」,負責收集該區所有的感測器訊號、初步處理與整合,並直接驅動該區的馬達、燈光等致動器。區域先自理,就不必大小事都等中央拍板。

而「中央政府」則由車用高效能運算平台(HPC)擔任,統籌負責更複雜的運算任務,例如先進駕駛輔助系統(ADAS)所需的環境感知、物體辨識,或是車載娛樂系統、導航功能,甚至是未來自動駕駛的決策,通通交由車輛正中央的這顆「超級大腦」執行。

乘著這波汽車電子架構的轉型浪潮中, 2008 年成立的台灣本土企業威力暘電子,便精準地切入了這個趨勢,致力於開發整合 ECU 與區域控制器(Domain Controller)功能的模組化平台。他們專精於開發電子排檔、多功能方向盤等各式汽車電子控制模組。為了確保各部件之間的溝通順暢,威力暘提供的解決方案,就像是將好幾個「分區管理員」的職責,甚至一部分「超級大腦」的功能,都整合到一個更強大的硬體平台上。

這些模組不僅擁有強大的晶片運算能力,可同時支援 ADAS 與車載娛樂,還能兼容多種通訊協定,大幅簡化車內網路架構。如此一來,車廠在追求輕量化和高效率的同時,也能顧及穩定性與安全性。

-----廣告,請繼續往下閱讀-----
2008 年威力暘電子致力於開發整合 ECU 與區域控制器(Domain Controller)功能的模組化平台 /圖片來源:shutterstock

萬無一失的「汽車大腦」:威力暘的四大策略

然而,「做出來」與「做好」之間,還是有差別。要如何確保這顆集結所有功能的「汽車大腦」不出錯?具體來說,威力暘電子憑藉以下四大策略,築起其產品的可靠性與安全性:

  1. AUTOSAR : 導入開放且標準化的汽車軟體架構 AUTOSAR。分為應用層、運行環境層(RTE)和基礎軟體層(BSW)。就像在玩「樂高積木」,ECU 開發者能靈活組合模組,專注在核心功能開發,從根本上提升軟體的穩定性和可靠性。
  2. V-Model 開發流程:這是一種強調嚴謹、能在早期發現錯誤的軟體開發流程。就像打勾 V 字形般,左側從上而下逐步執行,右側則由下而上層層檢驗,確保每個階段的安全要求都確實落實。
  3. 基於模型的設計 MBD(Model-Based Design) 威力暘的工程師們會利用 MatLab®/Simulink® 等工具,把整個 ECU 要控制的系統(如煞車),用數學模型搭建起來,然後在虛擬環境中進行大量的模擬和測試。這等於在實體 ECU 誕生前,就能在「數位雙生」世界中反覆演練、預先排除設計缺陷,,並驗證安全機制是否有效。
  4. Automotive SPICE (ASPICE) : ASPICE 是國際公認的汽車軟體「品質管理系統」,它不直接評估最終 ECU 產品本身的安全性,而是深入檢視團隊在軟體開發的「整個過程」,也就是「方法論」和「管理紀律」是否夠成熟、夠系統化,並只根據數據來評估品質。

既然 ECU 掌管了整輛車的運作,其能否正常運作,自然被視為最優先項目。為此,威力暘嚴格遵循汽車業中一本堪稱「安全聖經」的國際標準:ISO 26262。這套國際標準可視為一本針對汽車電子電氣系統(特別是 ECU)的「超嚴格品管手冊」和「開發流程指南」,從概念、設計、測試到生產和報廢,都詳細規範了每個安全要求和驗證方法,唯一目標就是把任何潛在風險降到最低

有了上述這四項策略,威力暘確保其產品從設計、生產到交付都符合嚴苛的安全標準,才能通過 ISO 26262 的嚴格檢驗。

然而,ECU 的演進並未就此停下腳步。當ECU 的數量開始精簡,「大腦」變得更集中、更強大後,汽車產業又迎來了新一波革命:「軟體定義汽車」(Software-Defined Vehicle, SDV)。

-----廣告,請繼續往下閱讀-----

軟體定義汽車 SDV:你的愛車也能「升級」!

未來的汽車,會越來越像你手中的智慧型手機。過去,車輛功能在出廠時幾乎就「定終身」,想升級?多半只能換車。但在軟體定義汽車(SDV)時代,汽車將搖身一變成為具備強大運算能力與高速網路連線的「行動伺服器」,能夠「二次覺醒」、不斷升級。透過 OTA(Over-the-Air)技術,車廠能像推送 App 更新一樣,遠端傳送新功能、性能優化或安全修補包到你的車上。

不過,這種美好願景也將帶來全新的挑戰:資安風險。當汽車連上網路,就等於向駭客敞開潛在的攻擊入口。如果車上的 ECU 或雲端伺服器被駭,輕則個資外洩,重則車輛被遠端鎖定或惡意操控。為了打造安全的 SDV,業界必須遵循像 ISO 21434 這樣的車用資安標準。

威力暘電子運用前面提到的四大核心策略,確保自家產品能符合從 ISO 26262 到 ISO 21434 的國際認證。從品質管理、軟體開發流程,到安全認證,這些努力,讓威力暘的模組擁有最高的網路與功能安全。他們的產品不僅展現「台灣智造」的彈性與創新,也擁有與國際大廠比肩的「車規級可靠度」。憑藉這些實力,威力暘已成功打進日本 YAMAHA、Toyota,以及歐美 ZF、Autoliv 等全球一線供應鏈,更成為 DENSO 在台灣少數核准的控制模組夥伴,以商用車熱系統專案成功打入日系核心供應鏈,並自 2025 年起與 DENSO 共同展開平台化量產,驗證其流程與品質。

毫無疑問,未來車輛將有更多運作交由電腦與 AI 判斷,交由電腦判斷,比交由人類駕駛還要安全的那一天,離我們不遠了。而人類的角色,將從操作者轉為監督者,負責在故障或斷網時擔任最後的保險。透過科技讓車子更聰明、更安全,人類甘願當一個「最弱兵器」,其實也不錯!

-----廣告,請繼續往下閱讀-----
-----廣告,請繼續往下閱讀-----
文章難易度

討論功能關閉中。