그람-슈미트는 비뚤어진 기저를 곧게 편다
두 벡터가 비스듬히 붙어 있다고 하자. 같은 평면을 펼치지만 서로 직각이 아니고 길이도 제각각이라 계산이 불편하다. 그람-슈미트는 이 비뚤어진 기저를 곧게 펴는 절차예요. 첫 방향은 그대로 두고, 둘째 벡터에서 첫째 쪽으로 드리운 그림자, 곧 사영을 뺀다. 그러면 첫째와 수직인 성분만 남는다. 마지막으로 둘의 길이를 1로 맞추면 직각으로 만나는 단위 프레임이 나와요. 기울어진 두 벡터가 정규직교가 되는 과정을 단계 그림이 밟아 간다. 이렇게 펴낸 틀이 QR 분해의 Q예요. 골드가 사영이고 주황이 뺀 나머지다. 초록이 먼저 길이를 맞춘 단위벡터다.
버튼으로 단계를 밟는다. 0단계는 비스듬한 입력 a1, a2 그대로다. 1단계는 a1을 길이 1로 줄여 첫 초록 단위벡터 u1을 만든다. 2단계는 a2가 u1 쪽으로 드리우는 그림자, 곧 사영 (a2·u1)u1을 골드로 그려요. a2 안에 u1 방향이 얼마나 들어 있는지를 보여 준다. 3단계는 a2에서 그 사영을 빼 남은 수직 성분 w를 주황으로 만들고, 길이를 1로 맞춰 둘째 단위벡터 u2를 얻는다. 이제 u1과 u2가 정확히 직각으로 만나요. 비뚤어진 둘이 곧은 정규직교 한 쌍으로 펴진다. 버튼의 순서가 곧 절차의 순서다.
그람-슈미트의 핵심 동작 하나만 집어 든다. u1을 x축 위 단위벡터로 고정하고 파란 벡터 a2를 끌어 본다. 골드 화살표는 a2가 u1 위에 드리우는 사영 (a2·u1)u1이에요. a2 안에 들어 있는 u1 성분만 뽑은 것이다. 주황 화살표는 그 사영을 뺀 나머지 a2 − 사영이다. a2를 어디로 끌든 이 주황 나머지는 늘 u1과 정확히 직각을 이뤄요. 사영을 빼면 나란한 성분이 사라지고 수직 성분만 남기 때문이다. 이 한 번의 빼기가 비뚤어진 둘째 벡터를 세우는 심장이에요. 파란 화살표를 돌릴수록 골드 사영의 길이가 변한다.
입력이 얼마나 비뚤어져도 출력은 곧다는 것을 본다. a1은 고정하고 슬라이더로 a2의 기울기 각을 돌린다. 흐릿한 두 벡터가 비스듬한 입력 a1, a2이고, 진하게 그린 직각의 단위 프레임 u1, u2가 그람-슈미트가 편 출력이에요. 입력을 아무리 기울여도 출력 u1과 u2는 언제나 길이 1에 서로 직각을 유지한다. 위험한 자리가 하나 있다. a2를 a1과 거의 나란하게 만들면 펼 평면이 사라지고 수직 성분이 0에 가까워져요. 그 순간 정규직교 프레임을 만들 수 없어 경고가 뜬다. 거의 평행한 기저는 곧게 펼 수 없다. 경고가 뜨는 자리는 두 화살표가 포개지는 자리다.
그람-슈미트는 어느 벡터에서 출발하느냐에 따라 결과가 달라진다. 첫 벡터의 방향은 그대로 남기 때문이에요. 버튼으로 출발 순서를 바꾼다. a1 먼저로 두면 u1이 a1 방향을 따라가고 u2는 거기에 직각으로 선다. a2 먼저로 바꾸면 u1이 a2 방향을 따라가고 u2가 그 직각이 돼요. 같은 두 입력으로 같은 평면을 펼쳐도 만들어진 정규직교 프레임은 서로 다르게 돌아 있다. 둘 다 올바른 정규직교 기저다. 첫 방향을 닻으로 삼는 절차라, 누구를 첫째로 부르느냐가 답을 정해요.
펴낸 두 단위벡터를 한 행렬에 모은다. 버튼으로 u1, u2를 하나씩 켜면 각각 행렬 Q의 1열과 2열로 자리를 잡아요. 아래 숫자판에 그 2×2 Q가 뜨고, 초록 열이 u1, 주황 열이 u2다. Q의 두 열은 서로 직각인 단위벡터라 Q는 길이도 각도도 건드리지 않는 회전, 곧 직교행렬이다. 그래서 Qᵀ Q = I가 성립해요. 이렇게 모은 Q가 QR 분해의 Q다. 어떤 행렬 A든 A = QR로 쪼개고, Q는 그람-슈미트로 편 이 정규직교 열이고 R은 그 과정에서 뺀 사영의 계수들을 담은 위삼각 행렬이에요. 숫자판의 열이 그림의 두 화살표와 같다. 초록 열과 주황 열이 단위벡터 둘이다. 주황 나머지가 둘째 방향을 만든다.