例
2次形式の係数は対称行列で表せる¶
2次形式の係数行列は対称行列で表すことができる。そのほうがシンプルになるし、対称行列で表せるという定理もある。
ここで は対称行列、 は反対称行列となっている。
証明
1. ならばは反対称行列
を第要素が1で残りが0のベクトルとし、に代入すると、となる。そのための対角要素は0となることがわかる。
を第要素と第要素が1で残りが0のベクトルを代入すると、となるが、対角要素は0なのですなわちとなり、は反対称行列となる。
2. が反対称行列なら
が反対称行列なら対角要素はゼロ()であるため、2次形式のうちの項はとなる。
また非対角要素はより、2次形式のうちの項は と打ち消し合って0になる。
以上から次の定理が導かれる
証明
反対称行列を係数とする2次形式は0なので、
2次形式の標準形¶
2次形式の標準形¶
固有ベクトルの行列 と変数の線形結合を と書く。 これは左からをかけてと書くこともできる。
このとき、2次形式は次のように変形できる
このような変数の2乗の線形結合を2次形式の 標準形 と呼ぶ
標準形にすると何が嬉しいのか? - 標準形による主軸変換の導出¶
標準形はの項がなく2乗の項だけになっている。
例えば
があるとする。これを書き換えると
となる。これは楕円の方程式と同じ形。ここから幾何学的な解釈が可能になる。
Source
import numpy as np
import matplotlib.pyplot as plt
# 楕円のパラメータ
a = 1 / np.sqrt(2) # 長軸半径
b = 1 / np.sqrt(7) # 短軸半径
# 楕円のプロット用データ生成
theta = np.linspace(0, 2 * np.pi, 300)
x = a * np.cos(theta)
y = b * np.sin(theta)
# 図の作成
fig, ax = plt.subplots(figsize=(4, 3))
ax.plot(x, y)
# 軸の設定
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
ax.set(
xlabel="$x'$",
ylabel="$y'$",
title=r'Plot of $\frac{x^{\prime 2}}{(1 / \sqrt{2})^2}+\frac{y^{\prime 2}}{(1 / \sqrt{7})^2}=1$',
aspect='equal'
)
ax.grid(True)
# 図を表示
plt.show()

Source
import numpy as np
import matplotlib.pyplot as plt
# グリッド範囲を設定
x_vals = np.linspace(-1, 1, 400)
y_vals = np.linspace(-1, 1, 400)
X, Y = np.meshgrid(x_vals, y_vals)
# 方程式 6x^2 + 4xy + 3y^2 = 1 の左辺
Z = 6 * X**2 + 4 * X * Y + 3 * Y**2 - 1
# 図の作成
fig, ax = plt.subplots(figsize=(3, 3))
ax.contour(X, Y, Z, levels=[0], colors='steelblue') # 楕円を描画(等高線プロット)
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
# 軸の設定
ax.set(
xlabel="$x$",
ylabel="$y$",
title=r"Plot of $6x^2 + 4xy + 3y^2 = 1$",
aspect='equal'
)
ax.grid(True)
# 図を表示
plt.show()

は をだけ回転させたもの。あるいはをだけ回転させたものがとなっている。
は直交行列なので、回転と鏡映をあわせた写像 ( 広義回転 )である。
「合同」とは形が変わらないこと、つまり広義回転だけをすること。
座標系をだけ回転すると、長軸と短軸に一致する。
単位ベクトルをで回転させると、なので、固有ベクトルは楕円の長軸と短軸(2つを合わせて 主軸 という)の方向ということ。
の固有ベクトルは、 楕円の主軸方向である ということ。
Source
import matplotlib.pyplot as plt
import numpy as np
# 固有ベクトルの描画 --------------------------------------------
A = np.array([[6, 2],
[2, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)
origin = np.array([0, 0]) # 原点
eigvec1 = eigenvectors[:, 0] # 固有値 7 に対応する固有ベクトル
eigvec2 = eigenvectors[:, 1] # 固有値 2 に対応する固有ベクトル
# 図の作成
fig, ax = plt.subplots(figsize=(4, 4))
ax.quiver(*origin, *eigvec1, color='r', angles='xy', scale_units='xy', scale=1, label="Eigenvector (λ=7)")
ax.quiver(*origin, *eigvec2, color='b', angles='xy', scale_units='xy', scale=1, label="Eigenvector (λ=2)")
# 楕円の描画 --------------------------------------------
# グリッド範囲を設定
x_vals = np.linspace(-1, 1, 400)
y_vals = np.linspace(-1, 1, 400)
X, Y = np.meshgrid(x_vals, y_vals)
# 方程式 6x^2 + 4xy + 3y^2 = 1 の左辺
Z = 6 * X**2 + 4 * X * Y + 3 * Y**2 - 1
# 図の作成
ax.contour(X, Y, Z, levels=[0], colors='steelblue') # 楕円を描画(等高線プロット)
# plot全体の設定 --------------------------------------------------
ax.axhline(0, color='black', linewidth=0.5)
ax.axvline(0, color='black', linewidth=0.5)
ax.set(
xlabel="$x$",
ylabel="$y$",
title="Eigenvectors of A",
xlim=(-1, 1),
ylim=(-1, 1),
aspect='equal'
)
ax.legend()
ax.grid(True)
# 図を表示
plt.show()
