0199 迭代画圆
* * * *
拉格朗日计划
* * * *
迭代画圆

在一个大圆内放入三个半径相同的圆,使这四个圆两两相切,如此则大圆内就有四块未被小圆所覆盖的“空隙”,可以继续在其中放入更小的圆,并使之与周围的圆都相切。



以在这四块空隙中放入圆作为第一轮,三轮后大圆中一共有$108$个空隙,其面积与最外层大圆面积之比、四舍五入到八位小数后为$0.06790342$。

十轮后这一比例是多少?四舍五入到八位小数。

本题难度:



解答

本题用到笛卡尔圆定理(Descartes Circle Theorem),即设有三个两两相切且半径分别为$r_1, r_2, r_3$的圆,则与这三个圆都相切的第四个圆的半径$r_4$满足 $$2(k_1^2+k_1^2+k_3^2+k_4^2)=(k_1+k_2+k_3+k_4)^2,$$ 其中$k_i=1/r_i$是圆的曲率,负数解表示第四个前三个圆外侧包含前三个圆,正数解表示第四个圆在前三个圆之间与三者都外切。

将其视作关于$k_4$的二次方程,易得 $$k_4=k_1+k_2+k_3\pm2\sqrt{k_1k_2+k_2k_3+k_1k_3}.$$ 设最外层大圆的半径是$1$,则由上述公式可得第一轮之前就已存在的三个肤色圆的半径是$2\sqrt3-3$。

容易看出,若空隙由三个曲率分别为$k_1,k_2,k_3$的圆围成,那么所放入圆的曲率$k_4$可以由上述公式获得,放入后原空隙被分割为三个新的空隙,分别由曲率为$(k_1,k_2,k_4), (k_2,k_3,k_4), (k_1,k_3,k_4)$的圆围成。

迭代计算,记录并汇总每次放入的圆的面积,即得结果$0.00396087$。

import math
k=(math.sqrt(3)*2+3)/3
r=math.sqrt(3)*2-3
s=r*r*3

f=lambda a,b,c: a+b+c+2*math.sqrt(a*b+b*c+a*c)

holes=[(-1,k,k),(-1,k,k),(-1,k,k),(k,k,k)]
i=0

while i < 10:
    newHoles=[]
    for a,b,c in holes:
        d=f(a,b,c)
        s+=1.0/(d*d)
        newHoles.append((a,b,d))
        newHoles.append((a,c,d))
        newHoles.append((b,c,d))
    holes=newHoles
    i+=1

print "%.8f" %(1-s)