Steiner 椭圆及其结论

两个有趣的问题:

1)在△ABC的无数个外接椭圆中,哪一个的面积最小?

答:外接Steiner 椭圆

2)在△ABC的无数个内接椭圆中,哪一个的面积最大?

答:内接Steiner 椭圆

可以证明:

外接Steiner 椭圆的面积为
x=4π27

内接Steiner 椭圆的面积为
x=π27

几个有用的结论:

1)△ABC的内切Steiner 椭圆(以正、负老封点L,F为焦点的内切椭圆)切于该三角形三边的中点

2)设△ABC的三边长为a,b,c,面积为△,其正负Fermat线长为e,f,有

这里写图片描述

则该三角形的正负老封点L,F之间的距离(即内切Steiner 椭圆的焦距)

这里写图片描述

3)设△ABC的三边长为a,b,c,面积为△,其正负Fermat线长为e,f,则它的内切Steiner 椭圆的长短半轴的长度分别为

这里写图片描述
这里写图片描述

离心率为

这里写图片描述

4)设△ABC的三边长为a,b,c,内切Steiner 椭圆的长短半轴的长度分别为m,n,则有

这里写图片描述

其中3)、4)中的长短半轴公式等价,证明略。

三角形中与面积最大的内切椭圆相对偶的另一问题是:求三角形面积最小的外接椭圆。

这一问题是由瑞士数学家Steiner首先考虑的。

注记:三角形的Steiner点是由Steiner于1826年首先引进的,当时他考虑了如下问题:“经过△ABC三个顶点的所有椭圆中哪一个面积最小?”

达到最小面积的那个椭圆可称作“Steiner椭圆”,它恰以△ABC的重心为其中心;而Steiner椭圆与△ABC外接圆的第四个交点正是Steiner点。

1886年,J.Neuberg在“Sur le point de Steiner”一文中才重新研究Steiner点,给出了Steiner点的如下刻划:过△ABC的三个顶点分别作其第一Brocard三角形(它必与△ABC反相似)相应边的平行线,三线必交汇于外接圆上一点,它就是△ABC的Steiner点!

这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Prim算法的Steiner树求解代码实现,其中包括了注释和代码解释。注意,该代码实现是在完全图的基础上进行Steiner树求解的。 ```python import numpy as np import sys def steiner_tree_prim(n, m, edges, terminal_nodes): """ :param n: 图中总节点数 :param m: 图中总边数 :param edges: 边列表,每个元素为(u, v, w),表示u和v之间有一条权重为w的边 :param terminal_nodes: 终端节点列表,即需要包含在Steiner树中的节点列表 :return: 返回Steiner树的总权重和以及边列表 """ # 初始化邻接矩阵和终端节点集合 adj_matrix = np.zeros((n, n)) terminal_set = set(terminal_nodes) # 构建邻接矩阵,并且对终端节点集合进行去重 for edge in edges: u, v, w = edge adj_matrix[u][v] = w adj_matrix[v][u] = w terminal_set.add(u) terminal_set.add(v) # 重新计算节点数和终端节点数量 n = len(terminal_set) num_terminals = len(terminal_nodes) # 根据终端节点集合重新构造节点编号列表 idx_dict = {} node_idx = 0 for node in terminal_set: idx_dict[node] = node_idx node_idx += 1 # 初始化Steiner树的总权重和以及边列表 total_weight = 0 steiner_edges = [] # 初始化Prim算法需要使用的参数 visited = [False] * n dist = [sys.maxsize] * n parent = [-1] * n dist[0] = 0 # 从终端节点集合中任选一个节点开始遍历 current_node = idx_dict[terminal_nodes[0]] while not all(visited): # 将当前节点标记为已访问 visited[current_node] = True # 遍历当前节点的邻居 for neighbor_node in range(n): # 判断当前邻居是否已访问并且是否存在边相连 if not visited[neighbor_node] and adj_matrix[current_node][neighbor_node] > 0: # 计算新的距离 neighbor_dist = adj_matrix[current_node][neighbor_node] # 如果新的距离比之前的距离更短,则更新距离和父节点 if neighbor_dist < dist[neighbor_node]: dist[neighbor_node] = neighbor_dist parent[neighbor_node] = current_node # 找到下一个需要遍历的节点,即距离已知节点最近的未访问节点 min_dist = sys.maxsize for node in range(n): if not visited[node] and dist[node] < min_dist: min_dist = dist[node] current_node = node # 如果当前节点是终端节点,则将其与其父节点之间的边加入到Steiner树中 if idx_dict.get(current_node) in range(num_terminals): steiner_edges.append((idx_dict[current_node], parent[current_node], dist[current_node])) total_weight += dist[current_node] return total_weight, steiner_edges ``` 该代码实现依赖于Numpy和Sys库,因此在运行前需要先进行安装。在使用时,只需要传入总节点数、总边数、边列表和终端节点列表等参数即可求解Steiner树问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值