2020年7月26日日曜日

学習環境

新装版 数学読本3 (松坂 和夫(著)、岩波書店)の第12章(放物線・だ円・双曲線 - 2次関数)、12.2(2次曲線と直線)、だ円・双曲線と直線の問22の解答を求めてみる。



    1. 点 P を通り傾き m の直線の方程式は

      y = m ( x - x 0 ) + y 0

      この直線 c が問題のだ円と接する場合を考える。

      x 2 a 2 + ( m ( x - x 0 ) + y 0 ) 2 b 2 = 1
      b 2 x 2 + a 2 ( m ( x - x 0 ) + y 0 ) 2 - a 2 b 2 = 0
      ( a 2 m 2 + b 2 ) x 2 + a 2 ( - 2 x 0 m 2 + 2 y 0 m ) x + a 2 ( m x 0 2 - 2 m x 0 y 0 + y 0 2 - b 2 ) = 0
      ( a 2 m 2 + b 2 ) x 2 - 2 a 2 m ( m x 0 - y 0 ) x + a 2 ( ( m x 0 - y 0 ) 2 - b 2 ) = 0
      D 4 = ( a 2 m ( m x 0 - y 0 ) ) 2 - ( a 2 m 2 + b 2 ) a 2 ( ( m x 0 - y 0 ) 2 - b 2 ) = 0
      ( a 4 m 2 - a 4 m 2 - a 2 b 2 ) ( m x 0 - y 0 ) 2 + a 2 b 2 ( a 2 m 2 + b 2 ) = 0
      a 2 b 2 ( ( a 2 m 2 + b 2 ) - ( m x 0 - y 0 ) 2 ) = 0
      ( a 2 - x 0 2 ) m 2 + 2 x 0 y 0 m + ( b 2 - y 6 2 ) = 0

      よって、

      x 0 = ± a

      のとき、 点 P からだ円にひいた2本の線線の傾きは、 m についての2次方程式

      ( a 2 - x 0 2 ) m 2 + 2 x 0 y 0 m + ( b 2 - y 6 2 ) = 0

      の2つの解である。

      (証明終)


    2. 問題の仮定より、

      x 0 2 + y 0 2 = a 2 + b 2

      2本の接線の傾きの積は、2次方程式の解と係数の関係により、

      b 2 - y 0 2 a 2 - x 0 2 = x 0 2 + y 0 2 - a 2 - y 0 2 a 2 - x 0 2 = - 1

      よって、 2本の接線は直交する。

      (証明終)

コード

#!/usr/bin/env python3
import math
import matplotlib.pyplot as plt
from matplotlib import animation
from sympy import pi, sin, cos, solve, symbols
import numpy as np

print('22.')

a: float = 2
b: float = 1
r = float(math.sqrt(a ** 2 + b ** 2))


def ellipse1(x: float) -> float:
    return float(math.sqrt((1 - x ** 2 / a ** 2) * b ** 2))


def ellipse2(x: float) -> float:
    return -ellipse1(x)


def circle1(x: float) -> float:
    return float(math.sqrt(r ** 2 - x ** 2))


def circle2(x: float) -> float:
    return -1 * circle1(x)


frames = 50
m = symbols('m', real=True)


thetas = [2 * pi / frames * i for i in range(frames)]
x0s = [r * cos(theta) for theta in thetas]
y0s = [r * sin(theta) for theta in thetas]
ms = [solve((a ** 2 - x0 ** 2) * m ** 2 +
            2 * x0 * y0 * m +
            (b ** 2 - y0 ** 2), m)
      for x0, y0 in zip(x0s, y0s)]


def update(i: int, c):
    x0 = x0s[i]
    y0 = y0s[i]
    xs = [-r - 1, r + 1]
    m1, m2 = ms[i]
    plt.plot(xs, [m1 * (x - x0) + y0 for x in xs],
             xs, [m2 * (x - x0) + y0 for x in xs])
    c.center = x0, y0


fig = plt.gcf()
ax = plt.axes(xlim=(-r - 1, r + 1), ylim=(-r - 1, r + 1), aspect='equal')
xs = np.arange(-a, a, 0.1)
plt.plot(xs, [ellipse1(x) for x in xs],
         xs, [ellipse2(x) for x in xs])
xs = np.arange(-r, r, 0.1)
plt.plot(xs, [circle1(x) for x in xs],
         xs, [circle2(x) for x in xs])
c = plt.Circle((r, 0), 0.1)
ax.add_patch(c)
anim = animation.FuncAnimation(fig,
                               update,
                               fargs=(c,),
                               frames=frames,
                               interval=100,
                               repeat=True)
plt.show()
anim.save('sample22.gif', writer='imagemagick')

入出力結果(Zsh、PowerShell、Terminal、Jupyter(IPython))

% ./sample22.py
22.
%

0 コメント:

コメントを投稿