You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于等周三角形平均面积特性的技术问询

关于等周三角形平均面积特性的技术问询

定义

等周三角形(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

运行注意事项

这段代码运行速度较慢,如果你的设备性能一般,可以调整accuracysamples参数来加快运行速度——这会略微降低估算精度,但整体的观察规律不会改变。

备注:内容来源于stack exchange,提问作者Nilotpal Kanti Sinha

火山引擎 最新活动