关于等周三角形平均面积特性的技术问询
关于等周三角形平均面积特性的技术问询
定义
等周三角形(Isoperimetric triangles)是指具有相同周长和相同外接圆半径的三角形。
等周面积曲线实验
我们知道,外接圆半径为$R$的圆内接三角形中,等边三角形的周长最大,为$3\sqrt{3}R$。针对区间$0 < p \le 3\sqrt{3}R$内的每个周长值$p$,我生成了若干随机三角形(周长近似为$p$)并计算它们的平均面积$A_p$。
由于随机生成的三角形几乎不可能有完全相等的周长,我采用了近似处理:将周长落在区间$(0.9999p,1.00001p)$内的三角形统一视为周长为$p$的三角形。
我尝试了多种分布(均匀分布、高斯分布等)来生成圆周上的随机点,得到的平均面积结果都很相似,这说明平均面积与随机点的分布无关。$p$与平均面积的关系曲线如下:
等周三角形平均面积-周长关系曲线
观察结果
随着$p$的增大,平均面积呈现凹曲线增长的趋势,但这个规律会突然被打破:在$p=4R$附近似乎存在一个拐点,之后平均面积在$p \approx 4R$处降至局部最小值,随后又线性增长到最大值——对应等边三角形的面积$\frac{3 \sqrt{3}}{4}R^2 \approx 1.299 R^2$。
问题
我有三个相互关联的问题:
- 等周三角形的平均面积是否真的在$p=4R$处存在局部最小值?
- 拐点的具体位置在哪里?
- 为什么在$p = 4R$之后,曲线会呈现近乎线性的增长趋势?
源代码
import random as rn import math from datetime import datetime import numpy as np rng = np.random.default_rng() # Function to calculate the area of a triangle given its vertices def triangle_area(x1, y1, x2, y2, x3, y3): return 0.5 * abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) # Function to calculate the perimeter of a triangle given its vertices def triangle_perimeter(x1, y1, x2, y2, x3, y3): side1 = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) side2 = math.sqrt((x3 - x2)**2 + (y3 - y2)**2) side3 = math.sqrt((x1 - x3)**2 + (y1 - y3)**2) return side1 + side2 + side3 theta1 = 0 k = 2 * math.pi accuracy = 0.9999 samples = 10000 R = 1.5 max_perimeter = 5.19615242270663*R fixed_perimeter = max_perimeter while fixed_perimeter >= 0.01: fp = 0 total_perimeter = total_area = 0 lower = fixed_perimeter*accuracy upper = fixed_perimeter/accuracy prev_time_a = prev_time_p = datetime.now() while fp < samples: theta2 = k * rn.random() theta3 = k * rn.random() # theta2 = k * rng.random() # for normally distibuted random numbers # theta3 = k * rng.random() # for normally distibuted random numbers x1 = R*math.cos(theta1) y1 = R*math.sin(theta1) x2 = R*math.cos(theta2) y2 = R*math.sin(theta2) x3 = R*math.cos(theta3) y3 = R*math.sin(theta3) perimeter = triangle_perimeter(x1, y1, x2, y2, x3, y3) # Fixed perimeter mean area if lower <= perimeter <= upper: area = triangle_area(x1, y1, x2, y2, x3, y3) total_area = total_area + area fp = fp + 1 curr_time = datetime.now() print('peri', round(fixed_perimeter,4), total_area / fp, curr_time - prev_time_p) prev_time_p = curr_time fixed_perimeter = fixed_perimeter - 0.001*R
运行注意事项
这段代码运行速度较慢,如果你的设备性能一般,可以调整accuracy和samples参数来加快运行速度——这会略微降低估算精度,但整体的观察规律不会改变。
备注:内容来源于stack exchange,提问作者Nilotpal Kanti Sinha




