1*1*2の直方体があるとします。
一つの頂点から最も離れた表面上の点はどこでしょうか。
おそらく誰もが「立体の反対側にある点」と答えると思います。
下の図の場合、左上の赤い点から最も離れた点は右下の赤い点だと思うでしょう。
どれだけ離れているかは展開図で考えます。
展開図にして直線で結んだ長さになりますので、この図のように二通り考えられます。
ところが正解は違います。
実は、下の図のように、下から0.25、左から0.25の点になります。
これは直感と実際が違う面白い問題だと思います。
これを確認してみます。
数学的には、おそらく偏微分を使って求めるのだと思いますが、ここではPythonを使います。
右側の面にあることは明らかです。右側の面の全ての点について左上の点からの長さを求めてみます。厳密に言うと全てではないですが。
念のため展開図の4通りのコースでそれぞれ計算して最も短い長さを求めます。
def main():
m=0
m_pos=[]
for j in range(1001):
for k in range(1001):
x=2
y=j/1000
z=k/1000
result=nagasa(x,y,z)
if result>m:
m=result
m_pos=[x,y,z]
print(m)
print(m_pos)
def nagasa(x,y,z):
a=2
b=1
c=1
p=((a+y)**2+z**2)**(1/2)
q=((a+(c-z))**2+(c+y)**2)**(1/2)
r=((a+z)**2+y**2)**(1/2)
s=((a+(b-y))**2+(b+z)**2)**(1/2)
return min([p,q,r,s])
if __name__ == "__main__":
main()
m=0
m_pos=[]
for j in range(1001):
for k in range(1001):
x=2
y=j/1000
z=k/1000
result=nagasa(x,y,z)
if result>m:
m=result
m_pos=[x,y,z]
print(m)
print(m_pos)
def nagasa(x,y,z):
a=2
b=1
c=1
p=((a+y)**2+z**2)**(1/2)
q=((a+(c-z))**2+(c+y)**2)**(1/2)
r=((a+z)**2+y**2)**(1/2)
s=((a+(b-y))**2+(b+z)**2)**(1/2)
return min([p,q,r,s])
if __name__ == "__main__":
main()
実行結果
2.850438562747845
[2, 0.75, 0.75]
x=0、y=0、z=0からの長さを4通り計算し最小値を求めています。
面の縦と横をそれぞれ1000等分して全ての点を計算して最大値を求めています。
結果はx=2、y=0.75、z=0.75となり、先程の答えが正しいことが分かりました。
長さは約2.85となりました。
x=2、y=1、z=1までの長さは約2.83なので最大値ではありません。
繰り返しますが、直感と実際が異なる面白い問題です。よく正解に気付いたと思います。
数学の証明で「明らか」「自明」と言って途中を省略してしまうことがありますが気を付けないといけません。
コメント