[快乐数学]面积有限而周长无限的曲线——科赫雪花及其推导
啊,标题暴露了全部内容。可恶。
我自己给我自己省流了

1.科赫雪花是啥子东东?
既然如此咱也不用藏着掖着了。
第一个部分,如果你去某百科上搜索你会得到答案。

很简单的一个东西但暗藏了不少玄只因机。
要得到科赫雪花首先你要有一个等边三角形。
然后不断地施加无数次科赫变换即:
在原来图形的基础上,选取每一边的三等分段中间的那一段,以它为边作等边三角形。
当然,我们只要变换后最外延的曲线。
其实你看百科配的图就知道了。
各个图的黑线就是科赫雪花(或者也称为科赫曲线)的低阶近似曲线。
(理论上你要进行无数次科赫变换得到的图形才叫科赫雪花,但我们实际只能画出进行了有限次变换的曲线)
而科赫雪花有一个很重要的特质。
你取科赫雪花的某一部分,你会发现它和整体相似。
这种性质我们称为自相似。
而某百科会告诉你,这样的曲线就是分形曲线。

不过。。。

啊哈,还好问题不大。
反正说到底就是个名字而已。

2.科赫雪花的周长
我们的正题是科赫雪花的周长和面积是多少。
先来求比较简单的周长。
因为图形上各个边的边长都是相等的,
因此每一个低阶近似曲线的周长cn=边长an×边数bn
而我们每一步边长都是前一步的三分之一,因此
而bn,你可以好好数数,每次都是前一次的四倍,因此
所以
显然,cn是一个等比数列。我们假设原来的等边三角形的周长是c0则、
那么现在我们令n→+∞就是科赫雪花的周长C了。
显然,C发散于+∞。
也就是所谓的周长是正无穷大(或者你也可以认为不存在)。

3.科赫雪花的面积
下面的面积才是比较棘手的。
面积的观察点一般不容易想到。
看看前面的图1,2,3,4其实观察点已经标在上面了。
就是每一块绿色线和黑色线包围的小等边三角形。
它们的面积都是它们附着在的三角形是九分之一。(所有等边三角形也是相似的,面积与边长的平方成正比,而每次边长都是原来的三分之一)
而一个新生成的三角形下一轮又会在他们的边上生成2个三角形。与此同时,又有等量的同样大小的旧三角形会在下一轮生成同样的2个三角形。
因此每次增加的三角形是个数是前一轮是4倍。
综合一下,每次增加的面积都是前一次的九分之四。
因此有
因此Sn-Sn-1又是等比数列了。
这样的话
啊哈,S1-S0不是贼容易?1/3S0啊。
不过下面拖着个S0式子有点难看,我就直接假设S0=1了。(你要求别的科赫雪花的面积直接利用各个科赫雪花相似,面积正比于边长的平方就可以了)
因此
加下来只要用累加法就能求出Sn了。
(累加法是需要检验首项的,但这里没必要,因为我们只需要n充分大的情况。也就是说前面的有限项不用在乎他是多少。不过你仍然可以检验就是了)
算出来,,显然Sn收敛于五分之八。
因此科赫雪花的面积是有限的。
额,你如果去搜索科赫雪花的面积的话你会得到
(a为初始等边三角形的边长),实际上这和我得到的结论是一样的。
因为我算的是时的特殊情况。

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) # 调整画笔粗细
turtle.pencolor("blue") # 调整画笔颜色
n = turtle.numinput("by名浮半生", "你要画几层的科赫雪花?") # n为阶数
size = 500 # 默认科赫雪花的大小为500
koch(size, n)
turtle.right(120)
koch(size, n)
turtle.right(120)
koch(size, n)
turtle.hideturtle()
turtle.done()
这个就是用这个程序跑出来的一个三阶近似曲线了

下面是思路的介绍。
总的思路和前面计算周长面积是一样的。
在周长和面积的计算中我们先得到的递推公式再得到的通项公式。
那么在这里我们也是用的类似的想法,或者说得更专业一点就是递归算法。
代码的核心就是koch()函数。
n层曲线上的每一边都是n-1层曲线,这就是我们找到的“递推公式”
而第0层只需要画一条直线就可以了。
因此当层数>0的时候,我们先画出它的4边,当然4条边虽然图形一样但需要旋转(这就是函数里的for循环和列表的用意了)
当n=0时只需要画一条直线就行了。
这样当你想画n层的时候程序会发现,先画n-1层,再画n-2层.......一直到要画1层就要画0层,然后0层它就会画了。
这里程序的思路和我们前面有些不同。
程序的思路相当于是要算an,先算an-1,......要算a1先算a0,然后a0已知。
我再倒回去,算a1是多少,a2是多少,......,最终得到an是多少。
至于下面的部分都是一些细节的设置和补充了。
然后还有一点就是,如果你真的用这个程序跑了一遍会发现画得有点慢。
这个很正常。因为递归算法本身的就是一种效率比较低(时间复杂度高)的算法。
我们还有很多对递归再进行优化的算法例如动态规划(dp)算法,不过我不想多说,因为后面再说下去的话咱就变编程和算法专栏咧。(悲)