[快樂數(shù)學(xué)]面積有限而周長無限的曲線——科赫雪花及其推導(dǎo)
啊,標題暴露了全部內(nèi)容??蓯?。
我自己給我自己省流了

1.科赫雪花是啥子?xùn)|東?
既然如此咱也不用藏著掖著了。
第一個部分,如果你去某百科上搜索你會得到答案。

很簡單的一個東西但暗藏了不少玄只因機。
要得到科赫雪花首先你要有一個等邊三角形。
然后不斷地施加無數(shù)次科赫變換即:
在原來圖形的基礎(chǔ)上,選取每一邊的三等分段中間的那一段,以它為邊作等邊三角形。
當然,我們只要變換后最外延的曲線。
其實你看百科配的圖就知道了。
各個圖的黑線就是科赫雪花(或者也稱為科赫曲線)的低階近似曲線。
(理論上你要進行無數(shù)次科赫變換得到的圖形才叫科赫雪花,但我們實際只能畫出進行了有限次變換的曲線)
而科赫雪花有一個很重要的特質(zhì)。
你取科赫雪花的某一部分,你會發(fā)現(xiàn)它和整體相似。
這種性質(zhì)我們稱為自相似。
而某百科會告訴你,這樣的曲線就是分形曲線。

不過。。。

啊哈,還好問題不大。
反正說到底就是個名字而已。

2.科赫雪花的周長
我們的正題是科赫雪花的周長和面積是多少。
先來求比較簡單的周長。
因為圖形上各個邊的邊長都是相等的,
因此每一個低階近似曲線的周長cn=邊長an×邊數(shù)bn
而我們每一步邊長都是前一步的三分之一,因此
而bn,你可以好好數(shù)數(shù),每次都是前一次的四倍,因此
所以
顯然,cn是一個等比數(shù)列。我們假設(shè)原來的等邊三角形的周長是c0則、
那么現(xiàn)在我們令n→+∞就是科赫雪花的周長C了。
顯然,C發(fā)散于+∞。
也就是所謂的周長是正無窮大(或者你也可以認為不存在)。

3.科赫雪花的面積
下面的面積才是比較棘手的。
面積的觀察點一般不容易想到。
看看前面的圖1,2,3,4其實觀察點已經(jīng)標在上面了。
就是每一塊綠色線和黑色線包圍的小等邊三角形。
它們的面積都是它們附著在的三角形是九分之一。(所有等邊三角形也是相似的,面積與邊長的平方成正比,而每次邊長都是原來的三分之一)
而一個新生成的三角形下一輪又會在他們的邊上生成2個三角形。與此同時,又有等量的同樣大小的舊三角形會在下一輪生成同樣的2個三角形。
因此每次增加的三角形是個數(shù)是前一輪是4倍。
綜合一下,每次增加的面積都是前一次的九分之四。
因此有
因此Sn-Sn-1又是等比數(shù)列了。
這樣的話
啊哈,S1-S0不是賊容易?1/3S0啊。
不過下面拖著個S0式子有點難看,我就直接假設(shè)S0=1了。(你要求別的科赫雪花的面積直接利用各個科赫雪花相似,面積正比于邊長的平方就可以了)
因此
加下來只要用累加法就能求出Sn了。
(累加法是需要檢驗首項的,但這里沒必要,因為我們只需要n充分大的情況。也就是說前面的有限項不用在乎他是多少。不過你仍然可以檢驗就是了)
算出來,,顯然Sn收斂于五分之八。
因此科赫雪花的面積是有限的。
額,你如果去搜索科赫雪花的面積的話你會得到
(a為初始等邊三角形的邊長),實際上這和我得到的結(jié)論是一樣的。
因為我算的是時的特殊情況。

4.科赫雪花的繪制
利用python語言自帶的turtle作圖模塊我們可以很輕松的繪制出科赫雪花的樣子。
先拋出代碼,如果你不想聽這個代碼是怎么寫的那么直接拿去用就可以了。
import turtle
def koch(length, level):
? ?if level == 0:
? ? ? ?turtle.fd(length)
? ?else:
? ? ? ?for angle in [0, 60, -120, 60]:
? ? ? ? ? ?turtle.left(angle)
? ? ? ? ? ?koch(length / 3, level - 1)
turtle.setup(800, 800)
turtle.penup()
turtle.goto(-250, 100)
turtle.pendown()
turtle.pensize(1) ?# 調(diào)整畫筆粗細
turtle.pencolor("blue") ?# 調(diào)整畫筆顏色
n = turtle.numinput("by名浮半生", "你要畫幾層的科赫雪花?") ?# n為階數(shù)
size = 500 ?# 默認科赫雪花的大小為500
koch(size, n)
turtle.right(120)
koch(size, n)
turtle.right(120)
koch(size, n)
turtle.hideturtle()
turtle.done()
這個就是用這個程序跑出來的一個三階近似曲線了

下面是思路的介紹。
總的思路和前面計算周長面積是一樣的。
在周長和面積的計算中我們先得到的遞推公式再得到的通項公式。
那么在這里我們也是用的類似的想法,或者說得更專業(yè)一點就是遞歸算法。
代碼的核心就是koch()函數(shù)。
n層曲線上的每一邊都是n-1層曲線,這就是我們找到的“遞推公式”
而第0層只需要畫一條直線就可以了。
因此當層數(shù)>0的時候,我們先畫出它的4邊,當然4條邊雖然圖形一樣但需要旋轉(zhuǎn)(這就是函數(shù)里的for循環(huán)和列表的用意了)
當n=0時只需要畫一條直線就行了。
這樣當你想畫n層的時候程序會發(fā)現(xiàn),先畫n-1層,再畫n-2層.......一直到要畫1層就要畫0層,然后0層它就會畫了。
這里程序的思路和我們前面有些不同。
程序的思路相當于是要算an,先算an-1,......要算a1先算a0,然后a0已知。
我再倒回去,算a1是多少,a2是多少,......,最終得到an是多少。
至于下面的部分都是一些細節(jié)的設(shè)置和補充了。
然后還有一點就是,如果你真的用這個程序跑了一遍會發(fā)現(xiàn)畫得有點慢。
這個很正常。因為遞歸算法本身的就是一種效率比較低(時間復(fù)雜度高)的算法。
我們還有很多對遞歸再進行優(yōu)化的算法例如動態(tài)規(guī)劃(dp)算法,不過我不想多說,因為后面再說下去的話咱就變編程和算法專欄咧。(悲)