2017年12月28日木曜日

学習環境

数学読本〈5〉微分法の応用/積分法/積分法の応用/行列と行列式(松坂 和夫(著)、岩波書店)の第21章(もう1つの数学の基盤 - 行列と行列式)、21.4(行列式と面積・体積)、3次の行列式と体積、問43.を取り組んでみる。


  1. 3つのベクトル

    x i - x 1 , y i - y 1 , z i - z 1 i = 2 , 3 , 4

    で張られる平行六面体の体積は、4点が同一平面上にあるとき0になる。
    すなわち、

    det ( x 2 - x 1 y 2 - y 1 z 2 - z 1 x 3 - x 1 y 3 - y 1 z 3 - z 1 x 4 - x 1 y 4 - y 1 z 4 - z 1 ) = 0

    問題の等式の左辺の行列式を変形する。

    det ( 1 0 0 0 x 1 x 2 - x 1 x 3 - x 1 x 4 - x 1 y 1 y 2 - y 1 y 3 - y 1 y 4 - y 1 z 1 z 2 - z 1 z 3 - z 1 z 4 - z 1 ) = det ( x 2 - x 1 x 3 - x 1 x 4 - x 1 y 2 - y 1 y 3 - y 1 y 4 - y 1 z 2 - z 1 z 3 - z 1 z 4 - z 1 )

    よって必要十分条件である。

    (証明終)

コード(Emacs)

Python 3

#!/usr/bin/env python3
from sympy import pprint, symbols, Triangle, Point2D, Matrix

m = Matrix([[1, 1, 1, 1],
            [0, 1, 1, 2],
            [0, 1, 2, 2],
            [2, 2, 2, 2]])

pprint(abs(m.det()))

入出力結果(Terminal, Jupyter(IPython))

$ ./sample43.py
0
$

HTML5

<pre id="output0"></pre>
<br>
(<input id="x1" type="number" value="0">,
<input id="y1" type="number" value="0">,
<input id="z1" type="number" value="2">)
<br>
(<input id="x2" type="number" value="1">,
<input id="y2" type="number" value="1">,
<input id="z2" type="number" value="2">)
<br>
(<input id="x3" type="number" value="1">,
<input id="y3" type="number" value="2">,
<input id="z3" type="number" value="2">)
<br>
(<input id="x4" type="number" value="2">,
<input id="y4" type="number" value="2">,
<input id="z4" type="number" value="2">)
<br>
<button id="run0">run</button>
<button id="clear0">clear</button>

<script src="sample43.js"></script>

JavaScript

let pre0 = document.querySelector('#output0'),
    btn0 = document.querySelector('#run0'),
    btn1 = document.querySelector('#clear0'),
    input_x1 = document.querySelector('#x1'),
    input_y1 = document.querySelector('#y1'),
    input_z1 = document.querySelector('#z1'),
    input_x2 = document.querySelector('#x2'),
    input_y2 = document.querySelector('#y2'),
    input_z2 = document.querySelector('#z2'),
    input_x3 = document.querySelector('#x3'),
    input_y3 = document.querySelector('#y3'),
    input_z3 = document.querySelector('#z3'),
    input_x4 = document.querySelector('#x4'),
    input_y4 = document.querySelector('#y4'),
    input_z4 = document.querySelector('#z4'),
    inputs = [input_x1, input_y1, input_z1,
              input_x2, input_y2, input_z2,
              input_x3, input_y3, input_z3],
    p = (x) => pre0.textContent += x + '\n';

let det = (x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) =>
    (x2 - x1) * (y3 - y1) * (z4 - z1) +
    (z2 - z1) * (x3 - x1) * (y4 - y1) +
    (z3 - z1) * (y2 - y1) * (x4 - x1) -
    (x2 - x1) * (z3 - z1) * (y4 - y1) -
    (x3 - x1) * (y2 - y1) * (z4 - z1) -
    (z2 - z1) * (y3 - y1) * (x4 - x1);

let output = () => {
    let x1 = parseFloat(input_x1.value),
        y1 = parseFloat(input_y1.value),
        z1 = parseFloat(input_z1.value),
        x2 = parseFloat(input_x2.value),
        y2 = parseFloat(input_y2.value),
        z2 = parseFloat(input_z2.value),
        x3 = parseFloat(input_x3.value),
        y3 = parseFloat(input_y3.value),
        z3 = parseFloat(input_z3.value),
        x4 = parseFloat(input_x4.value),
        y4 = parseFloat(input_y4.value),
        z4 = parseFloat(input_z4.value);

    p(det(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4));
};

inputs.forEach((input) => input.onchange = output);
btn0.onclick = output;
btn1.onclick = () => pre0.textContent = '';
output()


(, , )
(, , )
(, , )
(, , )

0 コメント:

コメントを投稿