[ベクトル]プログラミングでよー使うベクトル
ソース
参考
参考文献
二次元ベクトルの場合
$$
\mathbf v=
\begin{bmatrix}
x \\
y \\
\end{bmatrix}
$$
三次元ベクトルの場合
$$
\mathbf v=
\begin{bmatrix}
x \\
y \\
z
\end{bmatrix}
$$
大きさ(Magnitude)
ベクトルの長さ。大きさ。
成分の2乗和の平方根。
$${\mathbf v(x,y)}$$の場合
$$
|\mathbf v|=\sqrt{x^2+y^2}=\sqrt{xx+yy}=\sqrt{\mathbf v \cdot \mathbf v}
$$
$${\mathbf v(x,y,z)}$$の場合
$$
|\mathbf v|=\sqrt{x^2+y^2+z^2}=\sqrt{xx+yy+zz}=\sqrt{\mathbf v \cdot \mathbf v}
$$
長さの2乗=同一ベクトルの内積。
$$
|\mathbf v|^2=\mathbf v \cdot \mathbf v
$$
単位ベクトル
長さ1のベクトル。
$$
|\bm e|=1\\
$$
内積しても1
$$
\bm e \cdot \bm e=|\bm e|^2=1^2=1
$$
正規化(Normlize)、
単位ベクトルを作る操作。
正規化は色々な領域で使われる語ではあるが、ベクトル界における正規化は単位ベクトルをつくる操作をいう。
単位ベクトルを作るにはベクトルをその長さで割る。
すなわち各成分をベクトルの長さで割る。
$${\mathbf v(x,y)}$$の場合
$$
\hat{\mathbf v}=\frac{\mathbf v}{|\mathbf v|}=\frac{x}{|\mathbf v|}\bm e_1+\frac{y}{|\mathbf v|}\bm e_2
$$
また、$${\frac{x}{|\mathbf v|}}$$と$${\frac{y}{|\mathbf v|}}$$は方向余弦(あるベクトルが座標系の各軸と成す$${\cos}$$。成す角でなく、角によって得られる斜辺(あるベクトルの長さ$${|\mathbf v|}$$)とあるベクトルが各座標軸に落とす影の大きさ(例えばx軸なら$${x}$$)の比、つまり成す$${\cos}$$)であるから、方向余弦の一般的な表記$${l, m}$$を用いると
$$
\hat{\mathbf v}=l\bm e_1+m\bm e_2
$$
でもある。
内積(Dot)
成分同士の積の総和。出力はスカラー。
総和が含まれるので総和記号シグマの代替となることがある。また、ある種の線形方程式は内積で表すことができる。
直交性
内積=0ならば$${cosθ=0}$$
この時ベクトルは直交している。
$${cosθ=0}$$の時、$${ \quad θ=\frac{1}{2}\pi,\frac{3}{2}\pi}$$
法線ベクトル
2次元、3次元上で考えられるもの。
直線や平面に垂直、直交するベクトル。曲線や曲面に対する場合は接線や接面に直交するベクトル。
2次元の場合、あるベクトルに直交するベクトルは2パターン考えられるため、どっち方向に法線をとるかはあらかじめ決めておかなければならない。
3次元の場合、あるベクトルに直交するベクトルは無数にあり、ある面に直交するベクトルは2パターンある。
大きさと角度による定義
この定義により
角度情報が無くとも、成分情報だけからcosの機能(2つのベクトルの角度、転じて2つの座標の位置関係を調べる)を使うことができる。
$$
\bm a \cdot \bm b = |\bm a||\bm b| \cos\theta\\
\cos\theta=\frac{ \bm{a} \cdot \bm b}{|\bm a||\bm b|}
$$
成分による定義
この定義により
ある種の方程式が内積記号で圧縮される。
$${ax_1+bx_2+cx_3+dx_4...= なんとか}$$みたいな方程式、
$${ax+bx^2+cx^3+dx^4=なんとか}$$みたいな方程式は内積にまとめることができる。あまつさえ
$${af(x)+bf(x)+cf(x)+df(x)...}$$やら
$${af(x)+bg(x)+ch(x)+di(x)...}$$やらも表すことができる。
二次ベクトルの場合
$$
\bm a \cdot \bm b = a_1b_1+a_2b_2
$$
三次ベクトルの場合
$$
\bm a \cdot \bm b = a_1b_1 + a_2b_2 + a_3b_3
$$
n次ベクトルの場合
$$
\bm a \cdot \bm b = \sum_{i=1}^{n} a_ib_i
$$
プログラムにする時はインデックスがずれます。
また
$$
\sqrt{\bm a\cdot \bm a}=|\bm a|\\
\bm a\cdot \bm a=|\bm a|^2
$$
$$
|\bm a\cdot \bm b|\leq|\bm a|\cdot|\bm b| \quad (\text{シュワルツの不等式})\\
|\bm a + \bm b|\leq |\bm a| +|\bm b| \quad (\text{三角不等式})
$$
内積による位置判定
疑似外積(2次元ベクトルの外積)
Perp内積、おそらくPerpendicular(垂直)の略。
Perpendicular Dot Productなど。
$$
\bm a\times \bm b = a_1b_2-a_2b_1 =
\begin{bmatrix}
a_1 & a_2 \\
b_1 & b_2 \\
\end{bmatrix}
$$
xyで書くと$${x_1y_2-x_2y_1}$$
この外積みたいな操作は
片方のベクトルを90度回転させてから内積をとったものとなる。
$$
\bm a \times \bm b = \bm a^\perp \cdot \bm b
$$
$$
\bm a^\perp = (-a_2, a_1)=(-y,x)
$$
$$
\bm a^\perp \cdot \bm a = 0
$$
疑似外積による位置判定
3点使った疑似外積
上記疑似外積で用いるベクトルは原点から生えていることが前提だが、プログラムで用いる場合は任意の点からベクトルが生えていると考えると便利なことがある。これは単純にベクトルを平行移動することとなる。
$$
(a_1-o_1)(b_2-o_2)-(a_2-o_1)(b1-o_2)\\
(a_1b_2-a_1o_2-o_1b_2+o_1o_2)-(a_2b_1-a_2o_2-o_1b_1+o_1o_2)\\
a_1b_2-a_1o_2-o_1b_2+o_1o_2-a_2b_1+a_2o_2+o_1b_1-o_1o_2\\
a_1(b_2-o_2)+a_2(o_2-b_1)+o_1(b_1-b_2)
$$
xyで書くと
$${x_1(y_2-y_0)+x_2(y_0-y_1)+x_0(y_1-y_2)}$$
外積(Cross)
$$
\bm{a} \times \bm{b} = |\bm{a}||\bm{b}|\sin \theta\\
\bm{a} \times \bm{b} = (a_2 b_3 - a_3 b_2)\bm{e}_1 + (a_3 b_1 - a_1 b_3)\bm{e}_2 + (a_1 b_2 - a_2 b_1)\bm{e}_3\\
\bm{a} \times \bm{b} = (a_2 b_3 - a_3 b_2, a_3 b_1 - a_1 b_3, a_1 b_2 - a_2 b_1)
$$
(x,y,z)表記の場合
$$
\bm{a} \times \bm{b} = (y_1 z_2 - z_1 y_2, z_1 x_2 - x_1 z_2, x_1 y_2 - y_1 x_2)
$$
(以下あってるかどうか分かんないやつ)
ベクトルの成分同士のズレ、ねじれを表す。
2次疑似外積(x1y2-x2y1)は成分を取り替えた2つの矩形の比較。
2つのベクトルが一致しているならばその成分取り替えた矩形も一致するので差はゼロ。2つのベクトルがずれている時の成分取り替えた矩形の差はゼロにはならず、結果は入力ベクトルが作る平行四辺形の面積となって現れる。そのまま一般化していくと行列式になるが、例えば3*3行列の行列式はベクトル3本から体積を作っていることになる。
通常の3次外積は2つのベクトルの演算であって、これは行列式で言うと1行抜いたというか、1行だけ単位ベクトルになった場合に相当する。
あるいは式をそのまま汲み取って、軸毎にその軸に垂直な平面上に焼付いたベクトルのズレが平行四辺形の面積となって最終出力ベクトルの成分となると考えても良い。
外積と行列式
$$
\bm{a} \times \bm{b} =
\begin{vmatrix} \bm{i} & \bm{j} & \bm{k} \\
a_1 & a_2 & a_3 \\
b_1 & b_2 & b_3 \\
\end{vmatrix}
$$
$$
xa_2b_3+ya_3b_1+za_1b_2-za_2b_1-ya_1b_3-xa_3b_2
=x(a_2b_3-a_3b_2)+y(a_3b_1-a_1b_3)+z(a_1b_2-a_2b_1)
$$
二つのベクトルの成す角度
$$
\cos \theta = \frac{\bm{a} \cdot \bm{b}}{|\bm{a}||\bm{b}|}\\
\theta = \cos^{-1} \left( \frac{\bm{a} \cdot \bm{b}}{|\bm{a}||\bm{b}|} \right)
$$
特にaとbが単位ベクトルなら長さ1で分母が消える。
$$
\cos \theta = \bm{a} \cdot \bm{b}\\
\theta = \cos^{-1}(\bm{a} \cdot \bm{b})
$$
射影ベクトル
$$
\text{projection}
= \frac{\bm a}{|\bm a|} \frac{ |\bm{a}||\bm{b}|\cos \theta}{|\bm{a}|}
= \frac{\bm a}{|\bm a|} \frac{\bm a \cdot \bm b}{ |\bm a| }\\
= \bm a \frac{\bm a \cdot \bm b }{|\bm a ||\bm a |} = \bm a\frac{\bm{a} \cdot \bm{b}}{|\bm{a}|^2}\\
= \bm{a} \frac{ \bm a \cdot \bm b}{ \bm{a} \cdot \bm{a}}
$$
ベクトル$${\bm a}$$にベクトル$${\bm b}$$の影を落とす。
この時ベクトル$${\bm b}$$の影となるベクトルは正射影という。
正射影=$${\bm a}$$の単位ベクトル$${\bm e=\frac{\bm a}{|\bm a|}}$$
かけることの
$${\bm b}$$が落とす影の長さ$${|\bm b| \cos\theta}$$、
特に$${\bm b}$$が影を落とす先が単位ベクトルである場合、その影の長さは$${\bm e \cdot \bm b}$$
$$
\frac{\bm a}{|\bm a|}|\bm b| \cos\theta\\
=\bm e|\bm b| \cos\theta\\
=(\bm e\cdot \bm b)\bm e=(\frac{\bm a}{|\bm a|}\cdot \bm b)\frac{\bm a}{|\bm a|}
$$
垂直射影ベクトル
$$
\text{perpendicular}=\bm b -\text{projection}=\bm b - (\bm e\cdot \bm b)\bm e=\bm b -\bm a \frac{\bm a \cdot b}{\bm a \cdot \bm a}
$$
この操作はベクトル$${\bm b}$$からベクトル$${\bm a}$$に垂直なベクトルを作ることから、ベクトル$${\bm b}$$のベクトル$${\bm a}$$に対する直交化という。
また、垂直ベクトルの正規化
$$
\frac{\text{perpendicular}}{|\text{perpendicular}|}=\frac{\bm b - (\bm e\cdot \bm b)\bm e}{|\bm b - (\bm e\cdot \bm b)\bm e|}
$$
を正規直交化という。
p11, 理工系の数理 ベクトル解析 Kindle版
山本 有作 (著), 石原 卓 (著)
鏡映変換
交点座標
交差するか否かを判定してからt値を求める方法と、t値を求めてからその値が0から1にどのように収まるかを判定する方法がある。
t値は線分の始点から終点に向かうベクトルを伸縮させるために用いるが、交差を判定している2つの線分のうち、どちらに属するt値であるか気を付ける必要がある。
内積の場合
外積の場合
ベクトルをtで微分
ベクトル関数$${\mathbf v(t)=(f(t),g(t)) }$$があるとき、このベクトル関数の微分$${\frac{d\mathbf v}{dt}}$$ は以下のようになります:
$$
\frac{d\mathbf{v}}{dt} = \left( \frac{df(t)}{dt}, \frac{dg(t)}{dt} \right)\\
\frac{d\mathbf{v}}{dt} = \left( \frac{df(t)}{dt}, \frac{dg(t)}{dt}, \frac{dh(t)}{dt} \right)
$$
内積の微分
$$
\frac{d(\bm a \cdot \bm b)}{dt}=\frac{d \bm a}{dt} \cdot \bm b+\bm a \cdot \frac{d \bm b}{dt}
$$
外積の微分
$$
\frac{d(\bm a \times \bm b)}{dt} = \frac{d \bm a}{dt} \times \bm b + \bm a \times \frac{d \bm b}{dt}
$$
スカラー値関数をベクトルで微分する(勾配:grad)
スカラー出力関数の勾配
3次元
$$
\nabla f = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z}\right)
$$
n次元
$$
\nabla f = \left(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n}\right)
$$
ベクトル値関数をベクトルで微分する(ヤコビアン)
$$
\bm{f}(\bm{x}) =
\begin{bmatrix}
f_1(\bm{x}) \\
f_2(\bm{x}) \\
\vdots \\
f_n(\bm{x}) \\
\end{bmatrix}
$$
があるとする。
ここで
$$
\bm x =
\begin{bmatrix}
x_1\\
x_2\\
\vdots\\
x_n
\end{bmatrix}
$$
であって、
$$
f_i(\bm {x})
$$
はスカラー値関数。
ヤコビアンは
$$
\nabla \bm{f}(\bm{x}) = \begin{bmatrix}
\frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \ldots & \frac{\partial f_1}{\partial x_n} \\
\frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \ldots & \frac{\partial f_2}{\partial x_n} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial f_n}{\partial x_1} & \frac{\partial f_n}{\partial x_2} & \ldots & \frac{\partial f_n}{\partial x_n} \\
\end{bmatrix}
$$
行列の各項は各$${f_i}$$を各$${x_j}$$で偏微分したものになります。
行列微分
$$
\frac{\partial \bm x^T\bm a}{\partial \bm x}=\bm a
$$
の形式。
これはまず内積(スカラー値関数)を
$$
\bm x^T\bm a=x_1a_1+x_2a_2+…+x_na_n
$$
と表すとき、
$$
\frac{\partial}{\partial x_i}(x_1a_1+x_2a_2+…+x_na)=a_i
$$
としたもの。
すなわち勾配をとるのと同じ。
この記事が気に入ったらサポートをしてみませんか?