행렬 대수학 요소
행렬의 기본 정의
행렬은 직사각형 형태로 수들을 배열한 대수적 객체다. 일반적으로 실수(real)나 복소수(complex)로 구성되며, 제어공학에서 시스템을 해석하거나 설계할 때 다양한 방식으로 활용된다. 예를 들어 시스템 상태 방정식을 표현하거나, 전달함수에서의 특성식을 다루는 과정에서 행렬을 사용한다. 행렬을 대문자 $A$, $B$, $C$ 등으로 나타내고, 그 구성 요소(원소)는 소문자 $a_{i j}$, $b_{i j}$ 등으로 표기한다.
행렬 $\mathbf{A}$의 크기는 행과 열의 개수로 정의된다. 예를 들어 $m \times n$ 크기의 행렬이라면, $m$은 행(row)의 수, $n$은 열(column)의 수를 의미한다.
행렬에서 중요한 구조는 벡터와 밀접하다. $n \times 1$ 행렬(즉, $n$행 1열)은 열벡터(column vector)이며, $1 \times n$ 행렬은 행벡터(row vector)다. 제어공학에서 시스템 상태를 나타내는 경우, 보통 열벡터로 표현한다.
행렬 연산
행렬 간의 기본 연산으로는 덧셈과 곱셈이 있으며, 이외에도 스칼라배, 전치, 역행렬 등이 있다.
행렬 덧셈과 스칼라배
동일한 크기를 가진 두 행렬 $\mathbf{A}$와 $\mathbf{B}$가 있을 때, 그 합 $\mathbf{A} + \mathbf{B}$는 대응하는 원소끼리 더한 것으로 정의한다.
스칼라배(스칼라 $c$와 행렬 $\mathbf{A}$의 곱) 역시 각 원소에 대해 스칼라를 곱하는 방식으로 정의된다.
행렬 곱셈
행렬 곱셈은 제어공학에서 매우 자주 등장한다. 예를 들어 선형시스템의 상태공간 모델에서 상태벡터의 변화는 행렬 곱셈으로 표현된다. 두 행렬 $\mathbf{A}$와 $\mathbf{B}$를 곱하려면, $\mathbf{A}$의 열 개수와 $\mathbf{B}$의 행 개수가 같아야 한다. 즉 $\mathbf{A}$가 $m \times n$ 행렬이고 $\mathbf{B}$가 $n \times p$ 행렬이라면, 곱 $\mathbf{C} = \mathbf{A}\mathbf{B}$는 $m \times p$ 크기의 행렬이 된다. 이때 $\mathbf{C}$의 원소 $c_{i j}$는 다음과 같이 계산한다.
행렬 곱셈은 일반적으로 교환법칙이 성립하지 않는다. 즉 $\mathbf{A}\mathbf{B}$와 $\mathbf{B}\mathbf{A}$는 서로 다른 크기이거나, 크기가 같아도 값이 다를 수 있다. 하지만 결합법칙과 분배법칙은 성립한다.
전치와 대각행렬
행렬 $\mathbf{A}$의 전치(transpose)란 행과 열을 바꾼 행렬이다. 전치는 보통 $\mathbf{A}^T$로 표기하며,
로 정의된다. 이를 통해 여러 성질을 유도할 수 있다. 예를 들어 어떤 행렬이 자기자신의 전치와 같을 때 그 행렬을 대칭 행렬(symmetric matrix)이라 하며, $\mathbf{A} = \mathbf{A}^T$라 표현한다.
대각행렬(diagonal matrix)은 대각 원소 이외의 모든 원소가 0인 행렬이다. 예를 들어 $n \times n$ 대각행렬 $\mathbf{D}$가 있을 때,
와 같이 나타난다. 이때 행렬 곱셈 계산이 단순해지므로, 제어공학에서 시스템의 직교대각화(orthogonal diagonalization) 등을 통해 행렬을 대각형태로 만드는 과정을 자주 활용한다.
항등행렬과 역행렬
단위행렬(identity matrix)은 대각 원소가 모두 1이고, 나머지 원소가 0인 정사각 행렬이다. 대개 $\mathbf{I}_n$으로 표기한다. 행렬 곱셈에서 단위행렬은 스칼라에서의 1과 같은 역할을 하며,
가 성립한다.
역행렬(inverse matrix)은 정사각 행렬 $\mathbf{A}$에 대해 $\mathbf{A}\mathbf{A}^{-1} = \mathbf{A}^{-1}\mathbf{A} = \mathbf{I}$를 만족하는 행렬 $\mathbf{A}^{-1}$를 말한다. 역행렬이 존재하기 위한 필요충분조건은 $\mathbf{A}$가 풀랭크(full rank)를 가져야 한다는 것이다. 풀랭크라는 것은 행렬 $\mathbf{A}$의 행렬식(determinant)이 0이 아니거나, 행렬의 계수(rank)가 행 또는 열의 수와 동일하다는 의미다.
역행렬을 직접 구하는 대표적 방법으로는 가우스-조던 소거법(Gauss-Jordan elimination)을 이용하는 것이 있다. $\mathbf{A}$를 확장행렬 $\bigl[ \mathbf{A} ;; \mathbf{I} \bigr]$로 만들어 기본행렬연산을 반복 적용해 $\bigl[ \mathbf{I} ;; \mathbf{A}^{-1} \bigr]$ 형태로 변환한다. 그러면 확장행렬의 우측 부분이 $\mathbf{A}$의 역행렬이 된다.
계수와 행렬식
계수(rank)는 행렬을 이루는 벡터(행벡터 혹은 열벡터)들이 선형 독립성을 가지는 최대 개수로 정의된다. 제어공학에서 전달함수 행렬이나 상태방정식의 해석을 할 때, 어떤 매트릭스가 풀랭크인지 여부는 시스템의 해 존재성이나 해의 유일성에 직접적으로 연결된다.
행렬식(determinant)은 정사각행렬 $\mathbf{A}$에 대해 정의되는 스칼라값으로, $\det(\mathbf{A})$ 또는 $|\mathbf{A}|$로 표기한다.
위 식에서 $\sigma$는 순열(permutation)을 의미하고, $\mathrm{sgn}(\sigma)$는 그 순열의 부호(짝수 순열이면 +, 홀수 순열이면 -)이다. 작은 차원의 행렬에 대해서는 전개식이나 공식이 자주 쓰이지만, 차원이 커질수록 가우스 소거법 등으로 계산한다.
행렬식은 역행렬의 존재성과 밀접하게 연관되어 있다. $\det(\mathbf{A}) \neq 0$면 $\mathbf{A}$는 역행렬을 가지며, $\det(\mathbf{A}) = 0$면 역행렬이 존재하지 않는다. 행렬식은 제어공학에서 고유다항식을 구할 때도 활용된다. 예컨대 $\lambda \mathbf{I} - \mathbf{A}$의 행렬식 $\det(\lambda \mathbf{I} - \mathbf{A})$가 고유다항식이 되며, 이 다항식의 근은 행렬 $\mathbf{A}$의 고유값(eigenvalue)이 된다.
고유값과 고유벡터
정사각행렬 $\mathbf{A}$에 대해, 어떤 스칼라 $\lambda$와 영이 아닌 벡터 $\mathbf{x}$가
를 만족하면, $\lambda$를 $\mathbf{A}$의 고유값(eigenvalue), $\mathbf{x}$를 $\mathbf{A}$의 고유벡터(eigenvector)라 한다. 고유값과 고유벡터는 제어공학의 동특성(dynamic characteristics)을 분석하는 핵심 도구다.
행렬 $\mathbf{A}$가 갖는 고유값들을 찾으려면 특성방정식
을 풀어야 한다. 고유값을 구한 뒤, 각 고유값 $\lambda_i$에 대해
의 해를 구하면 고유벡터를 구할 수 있다. 시스템 행렬의 고유값은 안정성, 응답 속도 등 시스템 전반의 거동을 결정하므로, 제어계 설계에서 매우 중요하게 다뤄진다.
특잇값 분해(SVD)와 대각화
특잇값 분해(Singular Value Decomposition)는 임의의 $m \times n$ 실수 행렬 $\mathbf{M}$을 세 행렬의 곱으로 나타내는 방법이다.
여기서 $\mathbf{U}$는 $m \times m$ 정사각행렬로서 직교행렬(orthogonal matrix), $\mathbf{\Sigma}$는 직사각 대각행렬, $\mathbf{V}$는 $n \times n$ 정사각행렬이면서 역시 직교행렬이다. 특잇값(singular values)은 $\mathbf{\Sigma}$의 대각 원소로서 모두 0 이상인 실수이며, 행렬의 노름(norm)이나 조건수(condition number)를 정의하는 데 사용된다.
만약 행렬이 정사각행렬이고 대각화(diagonalization)가 가능하다면,
꼴로 나타낼 수 있다. 여기서 $\mathbf{D}$는 대각행렬이며, 그 대각원소가 곧 $\mathbf{A}$의 고유값이 된다. 대각화가 가능하다는 것은 행렬이 기저를 적절히 바꾸면 대각행렬로 표현될 수 있음을 뜻하며, 이는 시스템을 분석하거나 제어기를 설계할 때 계산 편의를 크게 높여 준다.
블록행렬
큰 차원의 행렬을 블록(block) 단위로 나누어 표현하면, 여러 연산 및 해석을 효율적으로 진행할 수 있다. 예를 들어 2x2 블록행렬 형태로 쪼갠 다음, 블록 단위로 역행렬을 구하거나 곱셈을 정의하는 등의 기법을 많이 쓴다. 상태공간 모델에서도 다중입출력(MIMO) 시스템의 상태행렬, 입출력행렬 등을 블록 구조로 다루게 된다.
블록 행렬의 연산 규칙은 각각의 블록을 하나의 행렬 원소로 보는 관점에서 일반 행렬 연산 규칙을 그대로 적용하면 된다. 예컨대 블록 행렬의 곱셈은,
와 같이 계산한다. 다만 블록의 크기가 곱셈이 유효하도록 서로 맞아야 한다는 점에 주의해야 한다.
양의 정부호 행렬과 에르미트 행렬
행렬 $\mathbf{A}$가 양의 정부호(Positive Definite)라는 것은, 임의의 비영 벡터 $\mathbf{x}$에 대해 $\mathbf{x}^T \mathbf{A} \mathbf{x} > 0$를 만족하는 대칭 행렬(실수인 경우) 혹은 에르미트(Hermitian) 행렬(복소수인 경우)을 말한다. 제어공학에서 시스템 안정성 및 에너지를 정의할 때 양의 정부호 행렬이 빈번히 나타난다. 예컨대, 라이apunов(Lyapunov) 안정성 이론에서, 오차동역학의 에너지를 나타내는 지표로 상태벡터에 대응하는 2차 형식(quadratic form)이 사용되는데, 이때 사용되는 가중 행렬이 양의 정부호 조건을 만족해야 한다.
에르미트 행렬은 복소수를 원소로 하는 정사각 행렬 $\mathbf{A}$에 대해, $\mathbf{A}^H = \mathbf{A}$를 만족하는 행렬이다. 여기서 $\mathbf{A}^H$는 에르미트 전치(Hermitian transpose)로, 전치 연산과 함께 복소수 켤레를 취한 것이다. 복소수 행렬에서 양의 정부호 조건을 다룰 때는 대칭 대신 에르미트 성질이 대응되며, 임의의 복소 벡터 $\mathbf{x}$에 대해 $\mathbf{x}^H \mathbf{A} \mathbf{x} > 0$가 성립해야 한다.
만약 행렬이 양의 반정부호(Positive Semidefinite)라면, 같은 형태의 2차 형식을 취해도 0보다 크거나 같은 값이 나온다. 즉 $\mathbf{x}^T \mathbf{A} \mathbf{x} \ge 0$가 성립한다. 이 개념은 H∞\infty 제어나 강인 제어에서 시스템의 안정성 조건을 완화하여 적용할 때 중요하게 다루어진다.
조던 표준형(Jordan Canonical Form)
복잡한 선형연산자를 가장 간단한 형태로 표현하는 유용한 도구가 조던 표준형(Jordan Canonical Form)이다. 정사각행렬 $\mathbf{A}$가 기약(Jordan block) 형태의 블록 대각행렬로 변환될 수 있다는 것이 핵심이며, 이를 요약하면 아래와 같은 형태를 갖는다.
여기서 $\mathbf{J}$는 조던 블록을 대각으로 배열한 행렬이다. 예를 들어 어떤 고유값 $\lambda$에 대응하는 하나의 조던 블록이 아래처럼 구성된다.
조던 표준형은 행렬 $\mathbf{A}$의 기저 변환을 통해서만 정의되는 유일한(단, 조던 블록의 순서가 다른 경우는 제외) 표준형이다. 이러한 표현은 행렬의 지수행렬 $\exp(\mathbf{A} t)$나 선형시스템의 해석 등에 크게 기여한다. 예를 들어 미분방정식의 해를 명시적으로 쓸 때 조던 블록 형태가 되면 특정 항들이 다항식과 지수함수의 곱으로 표현되어, 모드(mode) 간 결합관계를 쉽게 파악할 수 있다.
슈어 분해(Schur Decomposition)
정사각행렬 $\mathbf{A}$가 복소수 행렬일 때, 슈어 분해(Schur Decomposition)를 통해
의 꼴로 나타낼 수 있다. 여기서 $\mathbf{Q}$는 유니터리(unitary) 행렬(즉 $\mathbf{Q}^H \mathbf{Q} = \mathbf{I}$)이고, $\mathbf{T}$는 상삼각행렬(upper triangular)이다. $\mathbf{T}$의 대각원소가 곧 $\mathbf{A}$의 고유값이며, 이는 행렬을 대각화하지 않고도 고유값을 모두 포함하는 삼각 형태로 변환할 수 있음을 의미한다.
실수행렬인 경우에는 직교행렬 $\mathbf{Q}$와 실수 상삼각행렬 $\mathbf{T}$로 분해하는 실수 슈어 분해(Real Schur Decomposition)가 사용된다. 어떤 경우에도 분해는 고유값 분포를 확인하거나, 수치 안정성 관점에서 행렬 계산을 진행할 때 매우 유용하다.
무어-펜로즈 유사역행렬(Moore-Penrose Pseudoinverse)
행렬의 역행렬이 존재하지 않는 경우라도, 일반화된 역행렬(generalized inverse)을 활용할 수 있다. 가장 대표적인 것이 무어-펜로즈 유사역행렬(Moore-Penrose pseudoinverse)이다. $m \times n$ 행렬 $\mathbf{A}$에 대해, 무어-펜로즈 유사역행렬 $\mathbf{A}^+$는 다음 성질들을 모두 만족하는 유일한 행렬이다.
첫째, $\mathbf{A} \mathbf{A}^+ \mathbf{A} = \mathbf{A}$. 둘째, $\mathbf{A}^+ \mathbf{A} \mathbf{A}^+ = \mathbf{A}^+$. 셋째, $(\mathbf{A} \mathbf{A}^+)^H = \mathbf{A} \mathbf{A}^+$. 넷째, $(\mathbf{A}^+ \mathbf{A})^H = \mathbf{A}^+ \mathbf{A}$.
상태방정식이나 신호 처리에서 최소제곱해(least squares solution)를 구할 때 유사역행렬이 자주 등장한다. $\mathbf{A}$가 풀랭크가 아닐 때, $\mathbf{A} \mathbf{x} = \mathbf{b}$의 해를 구할 수 없거나 무한히 많을 수 있으므로, $|\mathbf{A} \mathbf{x} - \mathbf{b}|$를 최소화하는 관점에서 접근한다. 이때 $\mathbf{x} = \mathbf{A}^+ \mathbf{b}$가 최소 제곱해를 준다는 사실이 중요하다.
특잇값 분해(SVD)를 사용하면 유사역행렬을 쉽게 구할 수 있다.
라 하면,
가 된다. 여기서 $\mathbf{\Sigma}^+$는 $\mathbf{\Sigma}$의 역에 해당하는 값들을 대각선에 배치하고, 차원이 맞지 않는 부분은 0으로 채워 구성한다.
행렬 노름(Matrix Norm)
행렬에 대한 노름(norm)은 특정 벡터 공간 위에서 선형연산자(행렬)가 미치는 크기나 효과를 측정하는 척도다. 여러 가지 정의가 있지만, 제어공학에서 가장 흔히 다루는 것은 다음과 같은 노름들이다.
스펙트럴 노름(또는 2-노름)은 벡터의 2-노름을 통해 정의되며, 어떤 벡터 $\mathbf{x}$에 대해 $|\mathbf{A}\mathbf{x}|_2 \le |\mathbf{A}|_2 |\mathbf{x}|_2$가 성립하도록 하는 최소의 상수 $|\mathbf{A}|_2$로 정의된다. 이 값은 $\mathbf{A}^T \mathbf{A}$의 최대 고유값의 제곱근(실수행렬일 때) 혹은 $\mathbf{A}^H \mathbf{A}$의 최대 고유값의 제곱근(복소행렬일 때)과 같다. 사실상 제일 큰 특잇값과 동일하기도 하다.
프로베니우스 노름(Frobenius norm)은 행렬을 이루는 모든 원소의 제곱합의 제곱근으로,
로 정의된다. 이는 계수들을 하나의 긴 벡터로 나열했을 때 그 벡터의 2-노름과 동일하다. 최소제곱 해석, 확률론적 접근 등에서 자주 쓰인다.
무한 노름(또는 최대 행 합 노름), 1-노름(또는 최대 열 합 노름) 등은 시스템의 특정 민감도를 평가할 때 쓰이기도 한다. 특히 제어 이득(gain)을 추정하거나, 시스템 변동(perturbation)에 대한 민감도를 파악할 때 노름을 활용한다.
컨디션 넘버(Condition Number)
행렬이 수치 계산(특히 역행렬을 구하거나, 선형 방정식을 푸는 과정)에서 얼마나 민감한지 측정하는 척도가 컨디션 넘버다. 보통 2-노름을 기준으로
로 정의한다. $\mathrm{cond}(\mathbf{A})$가 크다는 것은 작은 오차가 해에 크게 증폭될 수 있음을 의미한다. 이를테면, $\mathrm{cond}(\mathbf{A})$가 매우 큰 경우에 수치적 불안정이 발생할 가능성이 높아진다. 제어공학에서도 파라미터 추정(Identification)이나 상태추정(State Estimation)을 할 때 매트릭스 조건수가 크다면, 측정 혹은 계산 과정에서 수치오차가 매우 커질 수 있다는 점에 주의해야 한다.
예제: C++로 무어-펜로즈 유사역행렬 계산하기
실수 행렬 $\mathbf{A}$에 대해 특잇값 분해를 이용하여 유사역행렬을 구하는 간단한 C++ 예제를 제시하면 아래와 같다.
행렬 지수(Matrix Exponential)
행렬 지수는 해석학에서 다루는 지수함수를 행렬로 확장한 개념이다. 정사각행렬 $\mathbf{A}$에 대해, 지수 행렬 $e^{\mathbf{A}}$은 스칼라 지수함수의 거듭제곱 급수 정의를 그대로 적용하여
로 정의된다. 제어공학에서 상태방정식
의 해를 구할 때 지수 행렬이 등장한다. 즉
가 동차방정식의 일반해다. 유한 차원 벡터공간에서 선형미분방정식을 해석하는 핵심적인 도구이며, $\exp(\mathbf{A} t)$가 바로 상태전이행렬(State Transition Matrix)로서 시스템 시간응답을 결정한다.
지수 행렬 계산법
지수 행렬을 직접 계산하는 것은 일반적인 경우 쉽지 않다. 그러나 여러 가지 수치적 방법이 연구되어 있으며, 실무에서는 보통 아래와 같은 방식들을 쓴다.
테일러 급수 전개를 직접 사용해 일정 차수까지 근사값을 구할 수도 있지만, 수렴 속도가 느린 경우가 생길 수 있다. 따라서 교재나 실무에서는 파데 근사(Padé approximation)나 대각화(Diagonalization), 조던 표준형 등을 활용하는 방식을 배운다. 예컨대 $\mathbf{A}$가 대각화 가능하다면,
이 성립하므로
가 되고, $e^{\mathbf{D}}$는 대각행렬에서 각각의 대각 원소에 지수함수를 적용하면 된다. 만약 조던 표준형을 사용해야 하는 상황이면, 조던 블록에 대해서는 다항식을 곱한 형태로 지수함수가 표현되어야 하므로 계산 절차가 조금 복잡해진다.
예제: C++로 지수 행렬 근사하기
아래 간단한 예제는 테일러 급수를 일정 차수까지 써서 근사적으로 지수 행렬을 계산하는 데모 코드다. 실제 현업에서는 안정적인 라이브러리나 고급 알고리즘을 쓰길 권장한다.
행렬 미분
행렬 또는 벡터를 변수로 할 때, 그 도함수를 정의하는 것이 행렬 미분이다. 제어 이론에서 민감도 해석(sensitivity analysis)이나 시스템 식의 해석적 미분 계산에 행렬 미분이 이용된다. 편의상 실수행렬이나 벡터를 변수로 삼을 때를 예로 들면,
의 경우, $\mathbf{x}$에 대한 $f(\mathbf{x})$의 미분은 (적절히 구성된) 행렬 $\mathbf{A}$ 자체가 된다. 물론 좀 더 복잡한 행렬 식이나 다변수 미분에서, 각 원소별로 편미분(partial derivative)을 구조화하는 형태가 필요하다.
스칼라함수에 대한 행렬의 미분
스칼라 $y$가 어떤 행렬 $\mathbf{X}$의 원소들에 의해 결정될 때, 그 미분
는 보통 $\mathbf{X}$와 같은 차원을 가지거나(또는 그 전치를 가져야 할 수도 있음), 연산자 형태(4차원 텐서 등)로 다룬다. 예컨대
에서 $\mathbf{A}$가 상수 행렬일 때, $\mathbf{X}$에 관한 편미분은 $\mathbf{A}^T$가 된다.
행렬함수의 미분
행렬함수 자체에 대한 미분은 더 복잡한 구조를 가진다. 예를 들어 $\mathbf{F}(\mathbf{X}) = \mathbf{A}\mathbf{X}\mathbf{B}$ 형태의 함수라면, $\mathbf{X}$의 미소 변화 $\delta \mathbf{X}$에 대해
와 같은 식을 쓸 수 있다. 시스템의 야코비(Jacobian)이나 헤시안(Hessian)을 구할 때, 이러한 개념이 확장되어 사용된다.
행렬 방정식
선형시스템의 해석과 설계 과정에서 자주 등장하는 대표적인 행렬 방정식으로 실베스터(Sylvester) 방정식, 라이apunов(Lyapunov) 방정식, 리카티(Riccati) 방정식 등이 있다. 계통사적으로 이들은 복잡한 시스템 해석을 간단히 하기 위해 고안된 것으로, 시스템의 안정성, 제어 이득, 관측기 설계 등과 직접 연결된다.
실베스터 방정식(Sylvester Equation)
실베스터 방정식은 일반적으로
의 형태를 갖는다. 행렬 $\mathbf{A}$, $\mathbf{B}$, $\mathbf{C}$는 모두 알려져 있으며, 미지행렬 $\mathbf{X}$를 구하는 문제다. 차원은 $\mathbf{A}$가 $m \times m$, $\mathbf{B}$가 $n \times n$, $\mathbf{C}$가 $m \times n$, 그에 따라 $\mathbf{X}$도 $m \times n$ 행렬로 설정된다. 시스템 블록 다이어그램에서 다중경로의 상호 결합이 있는 경우, 혹은 복합 형식의 고유방정식을 풀 때 이렇게 표현된다.
실베스터 방정식은 고유값 분포나 노름 분석에서 유용한 성질을 가진다. 예컨대 $\mathbf{A}$와 $-\mathbf{B}$가 공통된 고유값을 갖지 않으면(즉, $\sigma(\mathbf{A}) \cap \sigma(-\mathbf{B}) = \varnothing$), 유일해(Unique)한 해 $\mathbf{X}$가 존재함을 보장할 수 있다. 여기서 $\sigma(\cdot)$는 해당 행렬의 스펙트럼(고유값 집합)을 의미한다.
라이apunов 방정식(Lyapunov Equation)
선형시스템 안정성 분석에서 많이 쓰이는 방정식이다. 보통 연속시간 시스템에서 대칭행렬 $\mathbf{P}$를 만족하는
의 꼴(혹은 이를 변형한 꼴)로 나타난다. 여기서 $\mathbf{A}$와 $\mathbf{Q}$는 주어진 행렬이며, $\mathbf{Q}$가 양의 정부호 행렬이면 $\mathbf{P}$가 양의 정부호인지 여부에 따라 시스템 안정성을 판별할 수 있다.
라이apunov 2차 형식
가 시간에 따라 줄어드는지(즉 $\dot{V} < 0$)를 확인해 시스템의 안정성을 보장하는데, 방정식 해 $\mathbf{P}$가 양의 정부호이면, $\mathbf{A}$가 안정(고유값의 실수가 모두 음수)임을 뜻한다. 이때 $\mathbf{A}$가 안정이면, 라이apunov 방정식은 언제나 유일한 양의 정부호 해 $\mathbf{P}$를 가진다.
리카티 방정식(Riccati Equation)
리카티 방정식은 비선형성(2차 형태)의 항이 들어가 일반 선형 방정식과 구분된다. 제어공학에서는 이산시간 혹은 연속시간 최적제어 문제에서 결정적인 역할을 한다. 예컨대 연속시간 무조건(무한수평선) LQR 문제에서 폐루프 최적 이득을 구하기 위해 다음과 같은 대수 리카티 방정식(Algebraic Riccati Equation)을 풀어야 한다.
여기서 $\mathbf{Q}$, $\mathbf{R}$은 각각 상태 및 제어 입력에 대한 가중 행렬이며, $\mathbf{P}$는 최적비용함수의 기울기를 결정하는 중요한 역할을 한다. 이렇게 구한 $\mathbf{P}$가 양의 정부호가 되면, 최적 상태피드백 이득
를 통해 안정적이면서도 비용함수가 최소화되는 폐루프 시스템을 구성할 수 있다.
연산적으로 대수 리카티 방정식을 푸는 것은 안정성과 비용 최적화를 동시에 고려하는 작업이다. 이때 $\mathbf{A}$의 안정성 가정, $\mathbf{Q}$, $\mathbf{R}$의 양의 정부호성 등을 만족하면 유일해(또는 특정 조건에서 여러 해가 존재하더라도 물리적으로 유효한 해가 유일)진다. 이 해가 관측기 설계(Kalman Filter)에도 대응되어, 측정 잡음과 상태 추정 오차 사이의 최적균형을 달성하는 역할을 한다.
크로네커 곱(Kronecker Product)과 벡 연산자(vec operator)
행렬들을 보다 확장된 방식으로 다루는 대표적인 연산으로 크로네커 곱(Kronecker product)이 있다. 크로네커 곱을 통해 블록 구조를 가지는 대규모 행렬, 혹은 다중 지표를 가진 텐서(tensor) 구조를 보다 체계적으로 표현할 수 있다. 제어공학에서 시간응답 해석을 블록구조로 전개하거나, 다차원 필터 설계(예: 2D 시스템), MIMO(다중입출력) 계의 표현 등에 응용된다.
정의
두 행렬 $\mathbf{A}$가 $m \times n$, $\mathbf{B}$가 $p \times q$ 행렬일 때, 크로네커 곱 $\mathbf{A} \otimes \mathbf{B}$는 다음과 같이 정의되는 $(m p) \times (n q)$ 행렬이다.
즉, $\mathbf{A}$의 각 원소 $a_{ij}$에 대해 $\mathbf{B}$를 그 배만큼 스칼라배한 블록을 대응 위치에 배치해 만든다.
크로네커 곱에는 다음과 같은 유용한 성질이 있다.
$(\mathbf{A} \otimes \mathbf{B})(\mathbf{C} \otimes \mathbf{D}) = (\mathbf{A}\mathbf{C}) \otimes (\mathbf{B}\mathbf{D})$
$(\mathbf{A} \otimes \mathbf{B})^T = \mathbf{A}^T \otimes \mathbf{B}^T$
행렬 미분이나, 실베스터 방정식을 풀 때의 대규모 블록 구조를 단순화하는 데 중요하다.
vec 연산자
행렬 $\mathbf{X} \in \mathbb{R}^{m \times n}$을 $mn \times 1$ 크기의 열벡터로 일렬 나열하는 연산을 vec 연산자라고 한다. 예를 들어
일 때,
즉, 열벡터를 구성할 때 열(column)을 기준으로 순차적으로 쌓는다(열 우선 열벡터).
크로네커 곱과 vec 연산자가 결합되면, 행렬 방정식을 다루는 강력한 공식이 성립한다. 예를 들어
형식이 있을 때, 양변에 vec 연산자를 적용하면,
이고, 크로네커 곱과 vec의 성질에 의해
이를 이용하면, $\mathrm{vec}(\mathbf{X})$를 푸는 문제로 전환이 가능하다. 이론적으로 실베스터 방정식도 이를 통해 재구성할 수 있으며, 다양한 고차 시스템 해석에서 이 기법이 활용된다.
예제: C++에서 vec 연산자 구현
단순히 행렬을 열벡터로 펴는 vec 연산자를 직접 코드로 보여주면 아래와 같다.
고등 응용: 텐서(Tensor)로의 확장
실제 MIMO 시스템이나 고차원 다변량 데이터 처리(예: 이미지, 동영상, 다차원 신호)에서는 행렬을 넘어서 텐서 구조를 다뤄야 할 때가 많다. 크로네커 곱은 고차 텐서를 2차원 행렬 형태로 다루는 핵심 단계를 제공해준다. 이를 통해 텐서 분해(Tensor Decomposition)나 다중선형 연산(Multilinear algebra) 기법 등이 발전해왔으며, 제어공학 뿐 아니라 신호처리, 머신러닝 등에서 응용된다.
여기까지가 제어공학에서 자주 활용되는 확장된 행렬 연산 기법의 일부다. 실제로는 알고리즘적 안정성, 복소행렬(에르미트 연산 포함), 대규모 행렬의 희소성(sparsity) 활용 등 다양한 세부 주제가 존재한다.
Last updated