要想及时的了解数学信息,请中学师生关注公众号“中学究尽数学”;大学生关注公众号“究尽数学”

奇思妙想:多边形面积最值算法?

分析笔记 huijiaorz 459℃ 0评论

三角形面积

如果三角形$\Delta{ABC}$对应的三条边为$a、b、c$,那么三角形的面积如何求呢?

三角形是一个稳定的结构,三条边一旦确定,其面积也随之确定;那三角形的面积是否能用其边长的解析式表示呢?

给出一个解析过程,余弦定理:$cosC=\frac{a^2+b^2-c^2}{2ab}$

$$\begin{aligned}S_{\Delta}ABC &=\frac{1}{2}ab\cdot{sinC}\\&=\frac{1}{2}ab\cdot\sqrt{1-cos^2C}\\&=\frac{1}{2}ab\cdot\sqrt{1-(\frac{a^2+b^2-c^2}{2ab})^2}\\&=\sqrt{\frac{4a^2b^2-(a^2+b^2-c^2)^2}{16}}\\&=\sqrt{\frac{(a+b+c)(a+b-c)(a+c-b)(b+c-a)}{16}}\\&=\sqrt{p(p-a)(p-b)(p-c)}\\\end{aligned}$$

其中,$p=\frac{1}{2}(a+b+c)$。

这个公式就是鼎鼎大名的“海伦公式”

四边形面积

继续上面“求三角形面积”的思路:边长为$a、b、c、d$的四边形面积又是什么解析式呢?

与三角形不同的是,四边形是不稳定的(四个边确定后,四边形不唯一,其面积当然也不唯一);但是这个面积是有上限的、有限的,那这个面积应该会有一个最大值;接下来我们找出这个最值的解。

解析:连接$BD$,记
$$BD=x\\a+b+c+d=2p\\a+d+x=2m\\b+c+x=2n$$

四边形面积$S=\sqrt{m(m-x)(m-a)(m-d)}+\sqrt{n(n-x)(n-b)(n-c)}$

令$\sqrt{m(m-x)}=a_1,\sqrt{(m-a)(m-d)}=b_1,\sqrt{(n-b)(n-c)}=a_2,\sqrt{n(n-x)}=b_2$。由柯西不等式:
$$\begin{aligned}S^2 &\leq[m(m-x)+(n-b)(n-c)]\cdot[(m-a)(m-d)+n(n-x)]\\&=(p-a)(p-b)(p-b)(p-d)\\\end{aligned}$$

当且仅当$\frac{m(m-x)}{(m-a)(m-d)}=\frac{(n-b)(n-c)}{n(n-x)}$时,等号成立。即
$$x^2=\frac{(ac+bd)(ab+cd)}{ad+bc}\tag{1}$$

同理,设$AC=y$,可得当
$$y^2=\frac{(ac+bd)(ad+bc)}{ab+cd}\tag{2}$$

时,四边形面积最大。

(1)和(2)两边相乘得:$xy=ac+bd$。这表示当四边形内接于圆时,取到最大面积,最大面积为
$$\begin{aligned}S^2&=(p-a)(p-b)(p-b)(p-d)\\p&=\frac{a+b+c+d}{2}\end{aligned}$$

一般的N边形?

问题:对于给定边长$a_1,a_2,\cdots,a_n$的n边形,其最大面积是否能够使用其边长解析表达?

首先,可以确定最大面积是存在的。

克拉美定理:给定边长$a_1,a_2,\cdots,a_n$的一切n边形中,能内接于圆的面积最大。

还确定边长给定的一切多边形中,存在可内接于圆的多边形。由此可以确定这个圆的半径也是确定的,和边长什么关系呢?各位大神,有没有人能给出确定答案:边长给定的多边形,最大面积、内接圆半径是否可以由其边长表示?

先要讨论多边形是否能内接于圆?有些大兄弟可能会说:这不是秃子头上的王八——明摆着的么。但要给出严谨的数学推导,可能还是需要琢磨一下的;接下来就带大家一起琢磨一下下。

多边形内接圆

多边形是否能够内接于圆?

答案是肯定的,尝试去构造一下:

  • 选取足够大的一个圆,比如半径等于多边形的周长(为什么呢?)
  • 在多边形上任选一个顶点,然后断开,依次将所有的顶点都放到圆上(如图)
  • 然后再逐渐压缩圆的大小,使得顶点在圆上滑动(如图)
  • 当半径取到某值时,两头正好相遇:构成内接于圆的多边形
  • 第一条中,半径之所以要选取的大一些:是确保多边形的边作为弦能够不交叉的放置于圆中

这个动画可以辅助理解(动画制作请参考附录),接下来是把上面的构造过程使用数学语言完成描述。

分析:

在坐标系中,以原点为圆心,$r$为半径做一圆

选取多边形的一个端点$A$,从此点断开多边形,每个边依次为
$$\begin{aligned}AA_1=a_1,\\A_1A_2=a_2,\\\cdots,\\A_{n-1}A_{n}=a_n\end{aligned}$$

以$A$为圆心,$a_1$为半径作圆,两圆交点仍记$A_1$(交点为两个,选取从A沿着圆O逆时针旋转遇到的那个),$A_1$满足:
$$\begin{cases}x^2+y^2=r^2\\x^2+(y-r)^2=a_1^2\end{cases}$$

解出$A_1$的坐标$$\begin{cases}x_1=f(r,a_1)\\y_1=g(r,a_1)\end{cases}$$

以$A_1$为圆心,$a_2$为半径作圆,与圆$O$交点记为$A_2$(点的取法同上),$A_2$满足:
$$\begin{cases}x^2+y^2=r^2\\(x-x_1)^2+(y-y_1)^2=a_2^2\end{cases}$$

解出$A_2$的坐标
$$\begin{cases}x_2=f(r,a_1,a_2)\\y_2=g(r,a_1,a_2)\end{cases}$$

重复递归上面的过程,可以解出$A_n$的坐标
$$\begin{cases}x_n=f(r,a_1,a_2,\cdots,a_n)\\y_n=g(r,a_1,a_2,\cdots,a_n)\end{cases}$$

当$A$和$A_n$首次重合时,多边形内接于圆,意味着
$$\begin{cases}x_n=f(r,a_1,a_2,\cdots,a_n)=0\\y_n=g(r,a_1,a_2,\cdots,a_n)=r\end{cases}$$

“多边形是否能内接于圆”的问题转化为:上面那个方程是否有解的问题?如果有解,那么解中最大的那个,便是内接圆的半径了。关于方程的解且继续往下看。

这回是真的哭了,写文之前都木有完整的算过,没想到有好大的一个坑啊!第一个能帮我填坑的人,我发个大红包给你~

引理

如上图,两个圆O:$x^2+y^2=r^2$和圆:$(x-x_0)^2+(y-y_0)^2=a^2$相交于两点$A_1=(x_1,y_1),A_2=(x_2,y_2)$,其中$(x_0,y_0)$在圆O上;沿着圆O的逆时针方向,从$(x_0,y_0)$出发遇到的第一个交点A的坐标为:
$$(\frac{\Delta(x_1+x_2)+|\Delta|(x_1-x_2)}{2\Delta},\frac{\Delta(y_1+y_2)+|\Delta|(y_1-y_2)}{2\Delta})$$

其中
$$\begin{cases}x_1=\frac{y_0a\sqrt{4r^2-a^2}+(2r^2-a^2)x_0}{2r^2}\\y_1=\frac{-x_0a\sqrt{4r^2-a^2}+(2r^2-a^2)y_0}{2r^2}\\x_2=\frac{-y_0a\sqrt{4r^2-a^2}+(2r^2-a^2)x_0}{2r^2}\\y_2=\frac{x_0a\sqrt{4r^2-a^2}+(2r^2-a^2)y_0}{2r^2}\\\Delta=\sqrt{2}r-a\end{cases}$$

分析:解方程组:
$$\begin{cases}x^2+y^2=r^2\\(x-x_0)^2+(y-y_0)^2=a^2\\x_0^2+y_0^2=r^2\\\end{cases}$$

解得两圆交点坐标。

关于两点$A_1=(x_1,y_1),A_2=(x_2,y_2)$的位置(通过向量积来判断):
$$\begin{aligned}\Delta &=x_1*y_2-x_2*y_1\\&=\frac{ar^2\sqrt{4r^2-a^2}}{2}(r^2y_0^2+2x_0^2)(2r^2-a^2)\end{aligned}$$

因为只需要确定$\Delta$的符号,所以重新记
$$\Delta=\sqrt{2}r-a$$

若$\Delta<0,A_1$在$A_2$的逆时针方向;若$\Delta>0,A_1$在$A_2$的顺时针方向。整理为引理中的形式。

接下来使用上面的引理来逐步实现上一篇文章中的过程,不难预见将会得到一个关于r的很复杂的方程组,有哪位大神可以把计算继续下去?或另辟新径,找到解析解是否存?你要有正确答案,赶紧联系我,我发个一百块的大红包给你。

附录

  • 使用[geogebra](https://www.geogebra.org/geometry)在线作图
  • 先画大圆,再把多边形的边依次作为弦,然后保存图片为png格式
  • 把上面的圆半径压缩一下,重复上面的操作:画弦,导出png。多次重复该步骤
  • 将获取到的多张图片,使用下面的Python代码,合成为gif(将多张图片转为gif的工具有很多,这里选用Python是一个开始,后续我还会使用Python来解决其他问题)
#imageio为第三方库,需要通过pip安装
import imageio
def create_gif(image_list, gif_name, dur = 0.1):
    try:
        frames = []
        for image_name in image_list:
            frames.append(imageio.imread(image_name))
        imageio.mimsave(gif_name, frames, 'GIF', duration = dur)
        return '转换成功'
    except Exception as e:
        return e
    
if __name__ == "__main__":
    image_list = [str(i+1) + '.png' for i in range(16)]
    print(image_list)
    gif_name = 'duobianxing.gif'
    res = create_gif(image_list, gif_name)
    print(res)

转载请注明:究尽数学 » 奇思妙想:多边形面积最值算法?

喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. 有谁有好的想法,请联系我哈
    huijiaorz2019-06-17 09:28 回复
  2. 有谁能有漂亮的论述,我可以给你一个红包~
    huijiaorz2019-06-17 09:28 回复
  3. 希望大家转发~
    huijiaorz2019-06-17 09:29 回复