欢迎光临散文网 会员登陆 & 注册

[快乐数学]面积有限而周长无限的曲线——科赫雪花及其推导

2023-08-13 20:00 作者:名浮半生  | 我要投稿

啊,标题暴露了全部内容。可恶。

我自己给我自己省流了

1.科赫雪花是啥子东东?

既然如此咱也不用藏着掖着了。

第一个部分,如果你去某百科上搜索你会得到答案。

很简单的一个东西但暗藏了不少玄只因机。

要得到科赫雪花首先你要有一个等边三角形。

然后不断地施加无数次科赫变换即:

在原来图形的基础上,选取每一边的三等分段中间的那一段,以它为边作等边三角形。

当然,我们只要变换后最外延的曲线。

其实你看百科配的图就知道了。

各个图的黑线就是科赫雪花(或者也称为科赫曲线)的低阶近似曲线。

(理论上你要进行无数次科赫变换得到的图形才叫科赫雪花,但我们实际只能画出进行了有限次变换的曲线)

而科赫雪花有一个很重要的特质。

你取科赫雪花的某一部分,你会发现它和整体相似。

这种性质我们称为自相似

而某百科会告诉你,这样的曲线就是分形曲线。

不过。。。

啊哈,还好问题不大。

反正说到底就是个名字而已。

2.科赫雪花的周长

我们的正题是科赫雪花的周长和面积是多少。

先来求比较简单的周长。

因为图形上各个边的边长都是相等的,

因此每一个低阶近似曲线的周长cn=边长an×边数bn

而我们每一步边长都是前一步的三分之一,因此a_%7Bn%7D%20%3D%5Cfrac%7B1%7D%7B3%7D%20a_%7Bn-1%7D

而bn,你可以好好数数,每次都是前一次的四倍,因此b_%7Bn%7D%20%3D4b_%7Bn-1%7D

所以c_%7Bn%7D%20%3Da_%7Bn%7Db_%7Bn%7D%3D%5Cfrac%7B4%7D%7B3%7D%20a_%7Bn-1%7Db_%7Bn-1%7D%3D%5Cfrac%7B4%7D%7B3%7Dc_%7Bn-1%7D

显然,cn是一个等比数列。我们假设原来的等边三角形的周长是c0则c_%7Bn%7D%3Dc_%7B0%7D%7B%5Cfrac%7B4%7D%7B3%7D%20%7D%5E%7Bn%7D%20

那么现在我们令n→+∞就是科赫雪花的周长C了。

显然,C发散于+∞。

也就是所谓的周长是正无穷大(或者你也可以认为不存在)。

3.科赫雪花的面积

下面的面积才是比较棘手的。

面积的观察点一般不容易想到。

看看前面的图1,2,3,4其实观察点已经标在上面了。

就是每一块绿色线和黑色线包围的小等边三角形。

它们的面积都是它们附着在的三角形是九分之一。(所有等边三角形也是相似的,面积与边长的平方成正比,而每次边长都是原来的三分之一)

而一个新生成的三角形下一轮又会在他们的边上生成2个三角形。与此同时,又有等量的同样大小的旧三角形会在下一轮生成同样的2个三角形。

因此每次增加的三角形是个数是前一轮是4倍。

综合一下,每次增加的面积都是前一次的九分之四。

因此有S_%7Bn%7D-S_%7Bn-1%7D%3D%5Cfrac%7B4%7D%7B9%7D%20(S_%7Bn-1%7D-S_%7Bn-2%7D)

因此Sn-Sn-1又是等比数列了。

这样的话S_%7Bn%7D-S_%7Bn-1%7D%3D%7B(%5Cfrac%7B4%7D%7B9%7D)%7D%5E%7Bn-1%7D%20(S_%7B1%7D-S_%7B0%7D)

啊哈,S1-S0不是贼容易?1/3S0啊。

不过下面拖着个S0式子有点难看,我就直接假设S0=1了。(你要求别的科赫雪花的面积直接利用各个科赫雪花相似,面积正比于边长的平方就可以了)

因此S_%7Bn%7D-S_%7Bn-1%7D%3D%5Cfrac%7B1%7D%7B3%7D%20%7B(%5Cfrac%7B4%7D%7B9%7D)%7D%5E%7Bn-1%7D

加下来只要用累加法就能求出Sn了。

(累加法是需要检验首项的,但这里没必要,因为我们只需要n充分大的情况。也就是说前面的有限项不用在乎他是多少。不过你仍然可以检验就是了)

算出来,S_%7Bn%7D%3D%5Cfrac%7B8%7D%7B5%7D%20-%5Cfrac%7B3%7D%7B5%7D%20(%5Cfrac%7B4%7D%7B9%7D%20)%5En,显然Sn收敛于五分之八。

因此科赫雪花的面积是有限的。

额,你如果去搜索科赫雪花的面积的话你会得到

S%3D%5Cfrac%7B2%5Csqrt%7B3%7D%20%7D%7B5%7D%20a%5E2(a为初始等边三角形的边长),实际上这和我得到的结论是一样的。

因为我算的是a%5E2%3D%5Cfrac%7B4%7D%7B%5Csqrt%7B3%7D%20%7D%20时的特殊情况。

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)算法,不过我不想多说,因为后面再说下去的话咱就变编程和算法专栏咧。(悲)

[快乐数学]面积有限而周长无限的曲线——科赫雪花及其推导的评论 (共 条)

分享到微博请遵守国家法律