🔰
Python初心者がグラム・シュミットの正規直交化法をコードでゼロから書いてみた
こんにちは、きょーじゅです。
今日は線形代数に登場するグラム・シュミットの正規直交化法をPythonでコーディングすることにチャレンジしました。
コードを書き上げた後にChatGPTに聞いたらNumPyという便利技があったようですが、そのようなものを全く知らなかったので手計算のプロセスをそのままコードにしました。読み辛いのはご容赦ください。
グラム・シュミットの正規直交化法とは
グラムシュミットの正規直交化法とは線形代数に登場する計算手法で、複数のベクトルから「互いに直交する(=直角に交わる)基底となるベクトルを作るものです。
元のベクトルがバラバラな方向を向いていても、順番に直交化しながら整理していくことで最終的に「直交かつ長さ1(正規直交基底)」のベクトルたちを得られます。直交化と正規化を繰り返すことで、何次元であっても正規直交基底を得られるのがこの手法のいいところです。
自作コード
import math
x1 = input("x1:") #1本目のベクトルのx座標
y1 = input("y1:") #1本目のベクトルのy座標
x2 = input("x2:") #2本目のベクトルのx座標
y2 = input("y2:") #2本目のベクトルのy座標
number_x1= float(x1)
number_y1= float(y1)
number_x2= float(x2)
number_y2= float(y2)
norm_e1 = math.sqrt((number_x1)**2+((number_y1)**2)) #ベクトルの大きさ
ex1 = number_x1/norm_e1 #1本目の単位ベクトルのx座標
ey1 = number_y1/norm_e1 #1本目の単位ベクトルのy座標
cx1 = (ex1*number_x2+ey1*number_y2)*ex1 #正射影ベクトルのx座標
cy1 = (ex1*number_x2+ey1*number_y2)*ey1 #正射影ベクトルのy座標
bx1 = number_x2-cx1 #直交ベクトルのx座標
by1 = number_y2-cy1 #直交ベクトルのy座標
norm_e2 = math.sqrt((bx1)**2+((by1)**2)) #ベクトルの大きさ
ex2=bx1/norm_e2 #2本目の単位ベクトルのx座標
ey2=by1/norm_e2 #2本目の単位ベクトルのy座標
print(f"正規直交化ベクトル: ({ex1:.3f}, {ey1:.3f}), ({ex2:.3f}, {ey2:.3f})") #小数第3位まで結果を出力
出力例
x1:2
y1:1
x2:-4
y2:3
正規直交化ベクトル: (0.894, 0.447), (-0.447, 0.894)
今回は2次元ベクトル(2,1)と(-4,3)から正規直交基底を作りました。求めたいベクトルの数値を入力して正規直交基底を計算してもらうようにしました。
おわりに
それこそNumPyを駆使すれば一瞬で済む(らしい)のですが、頭の整理も兼ねて計算手法をコードに逐一落とし込んでみました。今後もPythonと数学を上手く結びつけながら学習が進められればと思います。
Discussion