はじめに
三角形の外接円と内接円の半径には、ある不等式の関係性がある。内接円の半径は外接円の半径の0.5倍以下であるというオイラーの不等式である。今回は、これを数値計算で確認してみる。
具体的には、3辺の情報が与えられた三角形について正弦定理及び余弦定理を用いて外接円の半径$R$及び内接円の半径$r$をそれぞれ求める。その後、そのような三角形を大量に生成して、$\frac{r}{R}\le 0.5$を散布図で確認する。
導入
$\Delta ABC$が与えられたとき、以下の式がそれぞれ成立する。
正弦定理
\sin{A}=\frac{a}{2R}
余弦定理
\cos A=\frac{b^2+c^2-a^2}{2bc}
三角形の面積と内接円の半径
三角形の面積と内接円の半径は、以下のように与えられる。
三角形の面積
S=\frac{1}{2}bc \sin A
内接円の半径
S=\frac{1}{2} r(a+b+c)
より、
r=\frac{2S}{a+b+c}
三角関数の関係式
\sin^2 A+\cos^2 A=1
三角形の成立条件
余弦定理から、三角形の成立条件は以下のようになる。
|a-b|\le c \le a+b
計算条件
$0<a,b<1$の条件のもと三角形を$n$個生成し、$r,R$の関係性を調査する。
横軸$r$、縦軸$\frac{r}{R}$として散布図を作成する。
プログラム
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
import random
def delta_Rr(a,b,c):
if abs(a-b)< c < a+b:
cos_A=(b**2+c**2-a**2)/(2*b*c)
sin_A=(1-cos_A**2)**0.5
R=a/(2*sin_A)
r=a*b*c/(2*R*(a+b+c))
else:
R=np.nan
r=np.nan
return R,r
n=10000
a_ary=np.zeros(n)
b_ary=np.zeros(n)
c_ary=np.zeros(n)
R_ary=np.zeros(n)
r_ary=np.zeros(n)
for i in range(n):
a=random.random()
b=random.random()
c=random.random()
R_ary[i],r_ary[i]=delta_Rr(a,b,c)
plt.scatter(r_ary,r_ary/R_ary,color="blue",s=0.4)
plt.axhline(0.5,color="red")
plt.xlabel("r")
plt.ylabel("r/R")
plt.savefig("オイラーの不等式.png")
plt.show()
結果
このように、$\frac{r}{R}\le 0.5$を厳密に満たしていた。
三角形の外接円と内接円の描写
ある三角形が与えられたとき、その外接円と内接円を描写するプログラムを以下に作成した。
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
import random
plt.axes().set_aspect("equal")
def delta_Rr(a,b,c):
if abs(a-b)< c < a+b:
cos_A=(b**2+c**2-a**2)/(2*b*c)
sin_A=(1-cos_A**2)**0.5
R=a/(2*sin_A)
r=a*b*c/(2*R*(a+b+c))
else:
R=np.nan
r=np.nan
return R,r
#三角形の座標(複素数平面)
z_A=0+10j
z_B=70+0j
z_C=-3+0j
z_H=(z_B+z_C)/2
a=abs(z_B-z_C)
b=abs(z_A-z_C)
c=abs(z_A-z_B)
R,r=delta_Rr(a,b,c)
BC=z_C-z_B
z_G=(z_A+z_B+z_C)/3
# 外接円を描写するプログラムメイン
z_R1=z_H+(R**2-(abs(BC/2)**2))**0.5*1j*BC/abs(BC)
z_R2=z_H+(R**2-(abs(BC/2)**2))**0.5*(-1j)*BC/abs(BC)
if abs(abs(z_R1-z_A)-abs(z_R1-z_B))<1e-3 and abs(abs(z_R1-z_A)-abs(z_R1-z_C))<1e-3:
z_R=z_R1
else:
z_R=z_R2
theta=np.linspace(0,2*math.pi,100)
x_cc=R*np.cos(theta)+z_R.real
y_cc=R*np.sin(theta)+z_R.imag
# 内接円を描写するプログラムメイン
z_r1=z_B+BC/(abs(BC))*(a-b+c)/2+r*1j*BC/abs(BC)
z_r2=z_B+BC/(abs(BC))*(a-b+c)/2+r*(-1j)*BC/abs(BC)
if abs(z_r1-z_G)<abs(z_r2-z_G):
z_r=z_r1
else:
z_r=z_r2
x_ic=r*np.cos(theta)+z_r.real
y_ic=r*np.sin(theta)+z_r.imag
plt.plot([z_A.real,z_B.real,z_C.real,z_A.real],[z_A.imag,z_B.imag,z_C.imag,z_A.imag])
plt.plot(z_A.real,z_A.imag,"o",color="black")
plt.plot(z_B.real,z_B.imag,"o",color="orange")
plt.plot(z_C.real,z_C.imag,"o",color="green")
plt.plot(x_cc,y_cc,color="blue")
plt.plot(x_ic,y_ic,color="red")
plt.savefig("三角形の外接円と内接円.png")
plt.show()
まとめ
今回は、正弦定理と余弦定理を用いた応用ということで、オイラーの不等式を数値計算によって確認してみた。具体的には、計算機を用いて三角形を大量に作成して、その外接円の半径と内接円の半径を調査してみた。
参考文献

