2020年3月20日金曜日

学習環境

解析入門(上) (松坂和夫 数学入門シリーズ 4) (松坂 和夫(著)、岩波書店)の第10章(n次元空間)、10.1(ユークリッド空間)、問題3の解答を求めてみる。


  1. 求める垂線の足の座標を

    x 0 , y 0 , z 0

    とする。

    これは平面上の点なので、

    a x 0 + b y 0 + c z 0 = k

    また、平面の法線ベクトルは、

    a , b , c

    原点から下ろした垂線の足なので、垂線の向きは

    x 0 , y 0 , z 0

    これが法線ベクトルの実数倍なので、

    x 0 , y 0 , z 0 = t a , b , c x 0 = t a y 0 = t b z 0 = t c

    よって、

    a t a + b t b + c t c = k t = k a 2 + b 2 + c 2

    ゆえに、求める原点から問題の平面に下ろした垂線の足の座標は、

    a k a 2 + b 2 + c 2 , b k a 2 + b 2 + c 2 , c k a 2 + b 2 + c 2

    である。

コード

#!/usr/bin/env python3
from unittest import TestCase, main
from sympy import symbols, solve, Matrix
from sympy.plotting import plot3d, plot3d_parametric_line

print('3.')

x, y, z, a, b, c, k = symbols('x, y, z, a, b, c, k', real=True)
x0, y0, z0 = [k * t / (a ** 2 + b ** 2 + c ** 2) for t in [a, b, c]]


class MyTestCase(TestCase):
    def test1(self):
        d = {s: t for s, t in zip([x, y, z], [x0, y0, z0])}
        self.assertEqual((a * x + b * y + c * z).subs(d).simplify(), k)

    def test2(self):
        t = symbols('t', real=True)
        ts = solve(t * Matrix([a, b, c]) - Matrix([x0, y0, z0]), t)
        self.assertEqual(len(ts), 1)


d = {a: 1, b: 2, c: 3, k: -1}
p = plot3d((k - (a + x + b * y) / c).subs(d), show=False)
u = symbols('u')
p.append(plot3d_parametric_line(*[o.subs(d) * u for o in [x0, y0, z0]],
                                (u, -100, 100),
                                legend=True,
                                show=False)[0])
p.xlabel = x
p.ylabel = y
p.show()
p.save('sample10.png')

if __name__ == "__main__":
    main()

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

% ./sample3.py -v
3.
test1 (__main__.MyTestCase) ... ok
test2 (__main__.MyTestCase) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.343s

OK
%

0 コメント:

コメントを投稿