情人節特獻:有心之函數必然就有分手函數

首先,祝大家情人節快樂。不過,對於單身程序猿來說,情人節或許並不快樂。情人節可以說是程序猿們永久的傷痛了。即使是熱愛數學的你,或許看到已經被轉發到爛的“心之函數”今日再度走紅,心中也會覺得不爽:我們發明出來的 Geek 玩物,竟然都被你們這些非 Geek 人士拿去裝 Geek 泡妞用了,最終情人節宅在家裏面向顯示器編程度過平凡一天的反而還是我們這羣 Geek 。

於是乎,“訂完全部大牀房”、“買光影院單號位”、“扎破所有安全套”等經典段子年年少不了。當然,我也沒有閒着。爲什麼有 Geek 式的愛情祝福,就沒有 Geek 式的分手詛咒?我計劃着創作一個“分手函數”,它的函數圖像是一個裂成兩半的心。

要製造分手函數,首先要有一個等待被惡搞的心形原型。我所選用的原型函數則是 2006 年 5 月 4 日本 Blog所發文章裏的函數(看到五年前的文章真是讓我感慨萬千啊)。這個函數的形式相當對稱美觀:17 x^2 - 16|x|y + 17 y^2 < 225 。用 Mathematica 畫出來大概是這樣:

這個心形函數的成因非常簡單,去掉中間一項的絕對值後你就明白了:

原來,17 x^2 - 16 x y + 17 y^2 < 225 將會畫出一個橢圓,因此給 x 加上絕對值,相當於把平面直角座標系 y 軸右半部分鏡像過來,就得到一個大致的心形了。我們的目標,便是要沿着 y 軸方向給這顆心加上一道的裂縫。

裂縫一般都是鋸齒形的。什麼函數也是鋸齒形的呢?最常用的估計就是三角函數和取餘函數了吧。這裏,我決定用大家熟知的並且也是相對容易控制的正弦函數來描繪裂縫的形狀。考慮二元函數 f(x, y) = x ,由於所有 x 座標相同的點函數值都一樣,它的“等高線圖像”就是一條條簡單的豎直線,如圖所示:

那麼,函數 f(x, y) = x + sin(y) 就是對上圖中縱座標爲 y 的所有點偏移 sin(y) 的量,也就把一個個帶狀區域扭成了波浪。

不過,這個波浪似乎還不夠劇烈,離我們的“裂縫”要求遠了些。我們不妨加大正弦函數的頻率:

哇, f(x, y) = x + sin(5 y) 的週期倒是變短了,不過這波動得也太劇烈了一些。看來,我們應該讓 x 的變化也稍微劇烈一些,讓它能適應 sin(5 y) 的步伐。於是,我把 f(x, y) 改成了 5 x + sin(5 y)

這就有點裂縫的味道了。注意,圖裏看上去裂縫帶有些寬,這無所謂——這只是生成圖形中等高線畫得比較稀而已。光從無差異曲線的分佈形狀來看,我們已經實現裂縫效果了。

但是,怎樣把這個裂縫應用到之前的心之函數裏呢?注意到心之函數其實是一個不等式 17 x^2 - 16|x|y + 17 y^2 < 225 。如果我們能找一個兩側值小、靠近 y 軸部分陡然增大的波浪形函數 f(x, y) 就好了。把這樣的 f(x, y) 加到心之函數上,就相當於給 y 軸附近的一個波浪形範圍加上一個大得出奇的值,讓不等式左邊超過 225 ,出現裂縫狀的空缺;同時,這以外的部分 f(x, y) 幾乎爲 0,該小於 225 的還是小於 225 , 該大於 225 的還是大於 225 ,對心形不會造成任何實質性的影響。

什麼操作能夠讓一個函數變得兩邊小到幾乎爲 0 ,靠近 y 軸的地方陡然增大呢?答案是“絕對值分之一”。

把它應用到之前的 f(x, y) 上(函數也就變成 1/|5 x + sin(5 y)| 了):

哈哈,這個有效果,中間的函數值陡然增大,大到都亮得發白了。

讓我們把這個 f(x, y) 加到心之函數上,也就是說畫出不等式 17 x^2 - 16|x|y + 17 y^2 + 1/|5 x + sin(5 y)| < 225 :

咦?怎麼沒有效果呢?且慢,仔細看圖的中間,已經有一些要裂開的痕跡了。我想到了一個可能的原因:裂縫帶的函數值還不夠大。心形圖形是由所有滿足 17 x^2 - 16|x|y + 17 y^2 小於 225 的點組成的,但是這些點的函數值並不是剛好 225 ,以至於加上了一個大數後仍然比 225 小。爲了擴大裂縫的影響,讓我們把 1/|5 x + sin(5 y)| 的分子改成 150 :

讓我們祈禱這次裂縫的函數值足以把心形破壞掉吧:

哈哈,這次成功了,裂開的心形!我原創的“分手方程”就此出爐了:17 x^2 - 16|x|y + 17 y^2 + 150/|5 x + sin(5 y)| < 225 。讓我們把這個不等式本身標在圖上,方便在網絡上傳播:

不過,這個分手函數有一些美中不足的地方:它用到了分式運算,不能和已有的部分很好地合併在一起,很容易看出這是由心形函數和裂縫函數拼合而成的,看上去有些平凡。另外,對於某些特殊的取值(比如 x 和 y 都爲 0 ),不等式左邊有可能因分母爲 0 而無意義,雖然在分母上加個很小的常數可以避免,但作爲完美主義者我仍然感覺很不爽。

這個方程有諸多不完美之處,如何構造一個看上去更酷的方程呢?寫了這麼多我也有些累了,腦子有點不夠使了。既然“情侶去死去死團”年年都少不了 Geek 方陣, Geek 戀愛睏境似乎百年不能動搖;如何尋找更完美的分手函數,不妨留着我們明年再來討論。

福利

700 頁的機器學習筆記火了!完整版開放下載

關注公衆號【程序員生活志】回覆“機器學習”

 

吳恩達機器學習全套視頻中文字幕完整版!!

關注公衆號【程序員生活志】回覆“機器學習視頻”

 

BAT面試題彙總:分佈式+Dubbo +JVM+微服務+多線程+Spring附答案

關注公衆號【程序員生活志】回覆“面試”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章