平成11年8月24日

[流れ星]

    第26回数学的な応募問題

 <解答募集期間:8月14日〜8月28日>

    [アルハゼンの定理の応用]

 太郎さんには、中学校へ通っている子供がいます。この夏休みの宿題に、次のような円に

関する問題が出ていました。前回の「アルハゼンの定理」の応用問題です。

[アルハゼンの定理の応用]です

<浜田 明巳>さんからの解答8月23日受信

 第26回数学的な応募問題

 いつもの通りにパソコンのプログラム(VISUAL BASIC)で解いてみました.

 

問題1:単位円で考えます.M(0,−1)とし,x軸とABが平行であるとします.A,S,Rの位置を乱数で決め,それぞれの場合のB,P,Qの位置を求めます.さらに∠PSR+∠PQRを計算し,それが180°に等しいことが分かれば,四角形PQRSが円に内接することが分かります.この試行を1000回(=kaisuu)繰り返し,どんな場合でも円に内接することを示します.

 

問題2:単位円で考えます.x軸とABが平行であるとします.A,Pの位置を乱数で決め,それぞれの場合のB,C,D,Q,Rの位置を求めます.さらにPQ/PRを計算し,それが1に等しいことが分かれば,△PQRが二等辺三角形であることが分かります.この試行を1000回(=kaisuu)繰り返し,どんな場合でも二等辺三角形であることを示します.

 

問題3:実はパソコンのプログラムで解こうとしたところ,あっという間に解答が出てしまったので,プログラムを作る気力がなくなってしまいました.

 円の中心をOとします.∠ADE=45°なので∠AOE=90°であり,OA=OEであるから,∠OAE=45°となるので,∠DAO=∠DAE−∠OAE=15°です.故に∠DFG=15°+90°=105°となります.アルハゼンの定理を使いませんでした.申し訳有りません.

 しかしこれでは,私の気がすまないので,グラフ作成ソフトGRAPES(友田勝久氏作成,インターネットからダウンロード可能,フリーソフトです)を使って,解いてみました.答の点をマウスでなぞって,指示通りx座標を100倍すると,答の105°が出て来ます.

 この図は次のように作成しました.単位円で考えます.A(0,−1),E(1,0),D(cos120°,sin120°)としたとき,直線ADとx軸のなす角が答になります.

 

問題4:単位円で考えます.中心をOとするとき,x軸とODのなす角tDを,90°<tD<180とします.それぞれのtDの値に対して,DF/GE=4となるAの位置を求めて,相似比を計算して,DF=8となるときのAFの長さを求めます.このプログラムにより,答は常にAF=4(p)となることが分かります.

 

 乱数がからむ問題1と2のプログラムは見ていて面白いものです.毎回動きが違うので,見ていて思わず「がんばれ!」と言ってしまいます.

 

                    

問題1プログラム

Option Explicit

Const pi = 3.14159265359

Const r = 1

Sub Form_Load()

Dim waku As Double: waku = 1.5 * r

Picture1.Scale (-waku, waku)-(waku, -waku)

End Sub

Sub Command1_Click()

'm26_1

' 弧AMの長さと弧BMの長さが等しいとき,

'四角形PQRSは円に内接していることを証明してください.

Randomize Timer

Dim j, iro0, iro1, iro2, kaisuu As Integer

iro0 = 50: iro1 = 100: iro2 = 200: kaisuu = 1000

Dim wt, wtt As Long: wtt = 150000

Dim w, tA, tB, tS, tR As Double: w = pi / 180

Dim xM, yM, xA, yA, xB, yB, xS, yS, xR, yR, xP, yP, xQ, yQ As Double

Dim dA, dS, dR As Double

Dim PS, SR, PR, PQ, QR, kakuPSR, kakuPQR, a, b, c, d, p, q, sa As Double

Dim xO, yO, rr As Double: sa = 15

xM = 0: yM = -r

tA = ((270 - sa) - (90 + 1.5 * sa)) * Rnd + (90 + 1.5 * sa)

tB = 180 - tA

tS = ((tA - sa) - (tB + 2 * sa)) * Rnd + (tB + 2 * sa)

tR = ((tS - sa) - (tB + sa)) * Rnd + (tB + sa)

dA = 2 * (1 - 2 * Rnd): dS = 2 * (1 - 2 * Rnd)

dR = 2 * (1 - 2 * Rnd)

For j = 0 To kaisuu

If j > 0 Then

dA = inf(dA + 1 - 2 * Rnd): tA = tA + dA

If tA > 270 - sa Then

tA = 270 - sa: dA = -dA

ElseIf tA < 90 + 2 * sa Then

tA = 90 + 2 * sa: dA = -dA

End If

tB = 180 - tA

dS = inf(dS + 1 - 2 * Rnd): tS = tS + dS

If tA - tS < sa Then

tS = tA - sa: dS = -dS

ElseIf tS < tB + 2 * sa Then

tS = tB + 2 * sa: dS = -dS

End If

dR = inf(dR + 1 - 2 * Rnd): tR = tR + dR

If tS - tR < sa Then tR = tS - sa: dR = -dR

If tR - tB < sa Then tR = tB + sa: dR = -dR

End If

xA = r * Cos(tA * w): yA = r * Sin(tA * w)

xB = r * Cos(tB * w): yB = r * Sin(tB * w)

xS = r * Cos(tS * w): yS = r * Sin(tS * w)

xR = r * Cos(tR * w): yR = r * Sin(tR * w)

If xS <> xM Then

a = (yS - yM) / (xS - xM): b = yM - xM * a

xP = (yA - b) / a: yP = yA

Else

xP = 0: yP = r

End If

If xR <> xM Then

a = (yR - yM) / (xR - xM): b = yM - xM * a

xQ = (yB - b) / a: yQ = yB

Else

xQ = 0: yQ = r

End If

PR = Sqr((xR - xP) * (xR - xP) + (yR - yP) * (yR - yP))

PS = Sqr((xS - xP) * (xS - xP) + (yS - yP) * (yS - yP))

SR = Sqr((xR - xS) * (xR - xS) + (yR - yS) * (yR - yS))

kakuPSR = kaku(PS, SR, PR)

PQ = Sqr((xQ - xP) * (xQ - xP) + (yQ - yP) * (yQ - yP))

QR = Sqr((xR - xQ) * (xR - xQ) + (yR - yQ) * (yR - yQ))

kakuPQR = kaku(PQ, QR, PR)

a = xP - xQ: b = yP - yQ: c = xP - xR: d = yP - yR

p = (xP * xP - xQ * xQ + yP * yP - yQ * yQ) * 0.5

q = (xP * xP - xR * xR + yP * yP - yR * yR) * 0.5

xO = (d * p - b * q) / (a * d - b * c)

yO = (a * q - c * p) / (a * d - b * c)

rr = Sqr((xP - xO) * (xP - xO) + (yP - yO) * (yP - yO))

Picture2.Cls

Picture2.Print "∠PSR+∠PQR="; shishagonyuu(kakuPSR + kakuPQR); "°"

Picture3.Cls: Picture3.Print "残り"; kaisuu - j; "回"

Picture1.Cls

Picture1.Circle (0, 0), r, iro0

Picture1.Line (xA, yA)-(xB, yB), iro1

Picture1.Line (xM, yM)-(xS, yS), iro1

Picture1.Line -(xR, yR), iro1: Picture1.Line -(xM, yM), iro1

Picture1.Line (xP, yP)-(xR, yR), iro1

Picture1.Circle (xO, yO), rr, iro2

Picture1.CurrentX = xA: Picture1.CurrentY = yA

Picture1.Print "A"

Picture1.CurrentX = xB: Picture1.CurrentY = yB

Picture1.Print "B"

Picture1.CurrentX = xM: Picture1.CurrentY = yM

Picture1.Print "M"

Picture1.CurrentX = xS: Picture1.CurrentY = yS

Picture1.Print "S"

Picture1.CurrentX = xR: Picture1.CurrentY = yR

Picture1.Print "R"

Picture1.CurrentX = xP: Picture1.CurrentY = yP

Picture1.Print "P"

Picture1.CurrentX = xQ: Picture1.CurrentY = yQ

Picture1.Print "Q"

For wt = 0 To wtt: Next

Next

End Sub

Private Sub Command2_Click()

End

End Sub

Private Function shishagonyuu(ByVal x As Double) As Double

Dim keta As Long: keta = 1000000

shishagonyuu = Int(x * keta + 0.5) / keta

End Function

Private Function kaku(ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double

Dim cs As Double: cs = (a * a + b * b - c * c) / a / b * 0.5

If cs = 0 Then

kaku = 90

Else

kaku = Atn(Sqr(1 / cs / cs - 1)) / pi * 180

If cs < 0 Then kaku = 180 - kaku

End If

End Function

Private Function inf(ByVal x As Double) As Double

If Abs(x) > 2 Then inf = Sgn(x) * 2 Else inf = x

End Function

 

 

問題2プログラム

Option Explicit

Const pi = 3.14159265359

Const r = 1

Sub Form_Load()

Dim waku As Double: waku = 1.5 * r

Picture1.Scale (-waku, waku)-(waku, -waku)

End Sub

Sub Command1_Click()

'm26_2

' 弧APの長さと弧ACの長さが等しく,

'また弧BPの長さと弧BDの長さが等しいとき,

'三角形PQRは二等辺三角形であることを証明してください.

Randomize Timer

Dim j, iro0, iro1, kaisuu As Integer

iro0 = 50: iro1 = 200: kaisuu = 1000

Dim wt, wtt As Long: wtt = 200000

Dim w, tA, tB, tP, tC, tD As Double: w = pi / 180

Dim xA, yA, xB, yB, xC, yC, xD, yD, xP, yP, xQ, yQ, xR, yR As Double

Dim dA, dP, PQ, PR, a, b, sa As Double: sa = 10

tA = ((180 - sa) - (90 + sa)) * Rnd + (90 + sa)

tB = 180 - tA

tP = ((tA - sa) - (tB + sa)) * Rnd + (tB + sa)

dA = 2 * (1 - 2 * Rnd): dP = 2 * (1 - 2 * Rnd)

For j = 0 To kaisuu

If j > 0 Then

dA = inf(dA + 1 - 2 * Rnd): tA = tA + dA

If tA > 180 - sa Then

tA = 180 - sa: dA = -dA

ElseIf tA < 90 + sa Then

tA = 90 + sa: dA = -dA

End If

tB = 180 - tA

dP = inf(dP + 1 - 2 * Rnd): tP = tP + dP

If tA - tP < sa Then

tP = tA - sa: dP = -dP

ElseIf tP < tB + sa Then

tP = tB + sa: dP = -dP

End If

End If

tC = 2 * tA - tP: tD = 2 * tB - tP

xA = r * Cos(tA * w): yA = r * Sin(tA * w)

xB = r * Cos(tB * w): yB = r * Sin(tB * w)

xC = r * Cos(tC * w): yC = r * Sin(tC * w)

xD = r * Cos(tD * w): yD = r * Sin(tD * w)

xP = r * Cos(tP * w): yP = r * Sin(tP * w)

a = (yP - yC) / (xP - xC): b = yP - xP * a

xQ = (yA - b) / a: yQ = yA

a = (yP - yD) / (xP - xD): b = yP - xP * a

xR = (yB - b) / a: yR = yB

PQ = Sqr((xQ - xP) * (xQ - xP) + (yQ - yP) * (yQ - yP))

PR = Sqr((xR - xP) * (xR - xP) + (yR - yP) * (yR - yP))

Picture2.Cls

Picture2.Print "PQ / PR="; shishagonyuu(PQ / PR)

Picture3.Cls: Picture3.Print "残り"; kaisuu - j; "回"

Picture1.Cls

Picture1.Circle (0, 0), r, iro0

Picture1.Line (xA, yA)-(xB, yB), iro1

Picture1.Line (xC, yC)-(xP, yP), iro1

Picture1.Line -(xD, yD), iro1

Picture1.CurrentX = xA: Picture1.CurrentY = yA

Picture1.Print "A"

Picture1.CurrentX = xB: Picture1.CurrentY = yB

Picture1.Print "B"

Picture1.CurrentX = xC: Picture1.CurrentY = yC

Picture1.Print "C"

Picture1.CurrentX = xD: Picture1.CurrentY = yD

Picture1.Print "D"

Picture1.CurrentX = xP: Picture1.CurrentY = yP

Picture1.Print "P"

Picture1.CurrentX = xQ: Picture1.CurrentY = yQ

Picture1.Print "Q"

Picture1.CurrentX = xR: Picture1.CurrentY = yR

Picture1.Print "R"

For wt = 0 To wtt: Next

Next

End Sub

Private Sub Command2_Click()

End

End Sub

Private Function shishagonyuu(ByVal x As Double) As Double

Dim keta As Long: keta = 1000000

shishagonyuu = Int(x * keta + 0.5) / keta

End Function

Private Function inf(ByVal x As Double) As Double

If Abs(x) > 2 Then inf = Sgn(x) * 2 Else inf = x

End Function

 

 

問題4プログラム

Option Explicit

Const pi = 3.14159265359

Const r = 1

Sub Form_Load()

Dim waku As Double: waku = 1.5 * r

Picture1.Scale (-waku, waku)-(waku, -waku)

End Sub

Sub Command1_Click()

'm26_4

' 辺DF=8,辺EG=2のとき,辺AFの長さを求めてください.

Dim j, iro0, iro1, owari As Integer: iro0 = 50: iro1 = 200

Dim wt, wtt As Long: wtt = 10000000

Dim w, tA, tB, tC, tD, tE, kizami As Double

w = pi / 180: kizami = 0.1

Dim xA, yA, xB, yB, xC, yC, xD, yD, xE, yE, xF, yF, xG, yG As Double

Dim range(2), sa(2), DF, GE, AF, a, b, gosa As Double: gosa = 10 ^ (-6)

For tD = 180 - kizami To 90 + kizami Step -kizami

tE = 180 - tD

xD = r * Cos(tD * w): yD = r * Sin(tD * w)

xE = r * Cos(tE * w): yE = r * Sin(tE * w)

range(0) = tE + kizami: range(1) = tD - kizami: owari = 0

While owari = 0: range(2) = (range(0) + range(1)) * 0.5

For j = 0 To 2: tA = range(j)

tB = 2 * tD - tA: tC = 2 * tE - tA

xA = r * Cos(tA * w): yA = r * Sin(tA * w)

xB = r * Cos(tB * w): yB = r * Sin(tB * w)

xC = r * Cos(tC * w): yC = r * Sin(tC * w)

a = (yB - yA) / (xB - xA): b = yA - xA * a

xF = (yD - b) / a: yF = yD

a = (yC - yA) / (xC - xA): b = yA - xA * a

xG = (yE - b) / a: yG = yE

DF = xF - xD: GE = xE - xG

sa(j) = DF / GE - 8 / 2

Next

If Abs(sa(2)) < gosa Or range(1) - range(0) < gosa Then

owari = 1

ElseIf Sgn(sa(2) * sa(0)) < 0 Then

range(1) = range(2)

Else

range(0) = range(2)

End If

Wend

If Abs(sa(2)) < 1 Then

AF = Sqr((xF - xA) * (xF - xA) + (yF - yA) * (yF - yA))

Picture2.Cls: Picture2.Print "DF/GE ="; shishagonyuu(DF / GE)

Picture3.Cls: Picture3.Print "AF="; shishagonyuu(8 * AF / DF); "p"

Picture4.Cls: Picture4.Print "半径="; shishagonyuu(8 * r / DF); "p"

Picture1.Cls: Picture1.Circle (0, 0), r, iro0

Picture1.Line (xB, yB)-(xA, yA), iro1

Picture1.Line -(xC, yC), iro1

Picture1.Line (xD, yD)-(xE, yE), iro1

Picture1.CurrentX = xA: Picture1.CurrentY = yA

Picture1.Print "A"

Picture1.CurrentX = xB: Picture1.CurrentY = yB

Picture1.Print "B"

Picture1.CurrentX = xC: Picture1.CurrentY = yC

Picture1.Print "C"

Picture1.CurrentX = xD: Picture1.CurrentY = yD

Picture1.Print "D"

Picture1.CurrentX = xE: Picture1.CurrentY = yE

Picture1.Print "E"

Picture1.CurrentX = xF: Picture1.CurrentY = yF

Picture1.Print "F"

Picture1.CurrentX = xG: Picture1.CurrentY = yG

Picture1.Print "G"

For j = 0 To wt: Next

End If

Next

End Sub

Private Sub Command2_Click()

End

End Sub

Private Function shishagonyuu(ByVal x As Double) As Double

Dim keta As Long: keta = 100000

shishagonyuu = Int(x * keta + 0.5) / keta

End Function

<水の流れ:コメント> 8月24日

浜田さんから、パソコンのプログラム(VISUAL BASIC)を頂いていますが、

不勉強をお許しください。動画画像が皆さんに見てもらえないのが、心苦しいです。

         

    <自宅>  mizuryu@aqua.ocn.ne.jp

 最初のページへもどる