挑戰難度: ⭐⭐⭐
這集有點燒腦哦,大家想不想挑戰一下
Hello,大家好,我是趣派程式設計的新老師,恐刀酷老師♂️
今天呢,我想和大家聊點神奇東西
你們知道嗎?2018年,美國的天文學家團隊Cosmic Eye釋出了一則影片。影片將鏡頭對準一位名為“露易絲”的女子,並將鏡頭大倍率地放大縮小,展示了宇宙中極大與極小的不同景象
這是怎麼樣的一個影片呢?先給大家看張長長長圖~
這張圖片只是影片的一個小縮影,完整的影片要比圖片震撼的多,我們建議大家到趣派程式設計的Bilibili站觀看一下完整影片。
這是地址 https://www。bilibili。com/video/av77306827/
總之呢,這段宇宙由極大到極小的影片引發了人們無限的遐想
評論區中有人覺得不管宇宙多大,自己仍然能成為宇宙的中心
(最重要的是我是整個宇宙的中心。就是我!耶!!)
也有觀眾認為人在宇宙的尺度下顯得無足輕重
(很清楚地展示了我們在微不足道的同時又是多麼得偉大,最小的圖片中也是多個宇宙的集合。)
縱觀歷史,類似的從極大到極小的猜測也屢見不鮮。在1911年,英國物理學家盧瑟福在完成了α粒子散射實驗後,認為電子如行星一般,圍繞著原子進行運轉。
雖然這個模型在之後很快被量子軌道模型所取代,但從極大到極小的思維卻給當代的不同行業的人們帶來了無數啟發
其實,在數學上這種將極大與極小作嚴格意義類比的思維方式誕生的並不算太久遠,它來自1973年由法/美國數學家芒德勃羅創立的一個概念:分形❄
這也是我們今天要討論的主角
❄關於分形❄
分形可以這樣來理解:用鏡頭或其他裝置放大影象,從而發現以前不可見的、更精細的新結構。如果你放大一個分形的影象,則不會出現新的細節;影象沒什麼變化,相似的圖案一遍又一遍的重複出現。對於有些分形幾乎完全一樣的影象會不斷地重複。
同時,分形也是一種有名的藝術形態,下面的幾幅圖就是分形藝術的一些代表作
從科赫雪花開始瞭解分形
科赫雪花是一個簡單的分形幾何圖形,因其形狀與雪花❄類似而得名。它的巧妙之處在於,無論將其放大多少倍,其基本的構造都相同。
嘗試將其如下圖由內部的紅框擴大至外部紅框的大小,你會發現擴大後的圖片與之前完全一致!
科赫雪花所衍生出來的概念,也讓眾多科學家絞盡腦汁
比如“如何將有限的面積用無限長的線包圍?”,“介於1維和2維之間的1。5維的是什麼?”等。
感興趣的同學可以在文末的擴充套件閱讀中瞭解更多關於分形的知識。
那麼真正的問題來:如何用Python將科赫曲線繪製出來?
用Python繪製科赫曲線
我們可以將繪製曲線的過程想象成一個“鑿缺口⛏“的過程。從一條線開始,我們線上的中心鑿開一個缺口,讓他變成了四條線。然後我們再在四條線上分別鑿開⛏缺口,變成更多的線,然後依次類推。
按這樣的次序鑿無數次就能完成科赫曲線。但是要繪製出科赫曲線,每一次層鑿的次數都不一樣,第一次是1個,第二次是4個,第三次是16個。
如果鑿的次數是有限次,我們能夠透過for或while完成,但是要使圖形能夠無限拓展,我們就要使用到函式的遞迴功能。
完整程式碼如下
#匯入海龜畫圖功能
import turtle
#定義畫圖函式, 定義科赫曲線的層數以及長度
def koch_line(layer=3, length=300):
# 0層時畫一條直線
if layer == 0:
turtle。forward(length)
else:
for i in [0, 60, -120, 60]:
# 透過三次轉彎“鑿”出缺口
turtle。left(i)
# 在畫圖函式內部呼叫畫圖函式本身,在每一條直線上繪製“鑿”出的缺口
koch_line(layer - 1, length / 3)
#執行程式
koch_line()
與其複雜的幾何構造相反,科赫曲線的程式僅有簡單的8行,而精髓之處就在於其遞迴的設計思路,即函式koch_line()中呼叫了自己本身:koch_line(layer - 1, length / 3)。
而這樣的設計思路就好比我們聽到的和尚講故事:
從前有座山,山上有座廟⛩,廟裡有個和尚正在講故事:
從前有座山,山上有座廟⛩,廟裡有個和尚正在講故事:
從前有座山,山上有座廟⛩,廟裡有個和尚正在講故事:
…………
再回頭看程式
程式無法進行無窮無盡的計算,所以我們要再初始化函式中設定巢狀的層數:layer。
最裡層的layer為0,而當layer不為0時,就會持續地進行拓展,直到執行完最裡層的指令。
所以當layer不為0時,就會開始“鑿尖角”。轉彎4次就能完成一個鑿出的尖角。
for i in [0, 60, -120, 60]:
turtle。left(i)
每次轉彎都會產生一條新的直線,於是我們有在新的直線上開始展開我們的巢狀,新的巢狀中,層數為原層數-1,而長度為之前的1/3。
koch_line(layer - 1, lenth / 3)
當layer為0時則畫完最後一段直線並停止巢狀。
if layer == 0:
turtle。forward(lenth)
雖然程式無法幫助我們將這個無限拓展曲線真正地畫出來,但是我們可以嘗試改變layer這個引數來使我們的圖形更接近真實的圖形。程式中的層數越多,畫的結構越精密,當然畫的速度也就越慢。
一花一世界,一木一浮生。
宇宙極大與極小的秘密在冥冥之中似乎給了我們很多啟示,但有時卻又會讓我們有著坐井觀天卻通曉萬物的錯覺,讓人感嘆每當科學家氣喘吁吁爬上一個山頭,往往會發現山頂上坐著一位神仙。
而學習離不開科學嚴謹的方法和勇於實踐的態度,希望大家也能夠在程式設計學習中持之以恆,切身力行
♥拓展閱讀♥
分形不一定自相似:
https://www。bilibili。com/video/av9004414
上帝之眼——曼德博分形放大3。4E1091倍
https://www。bilibili。com/video/av50797775
無限迴圈插畫
https://www。bilibili。com/video/av21956301
☝長按看看,這兒有一個寶藏☝