Julia(SymPy)でQR分解、正規直交系を計算する方法

どうも、木村(@kimu3_slime)です。

今回は、Julia(SymPy)でQR分解、正規直交系を計算する方法を紹介します。

 

準備

SymPyを使うので、持っていなければインストールしておきましょう。

準備として、以下のコードを実行しておきます。

 

QR分解、正規直交系を計算する方法

\[a_1,a_2,a_3 =\begin{pmatrix} 1\\ 2 \\1\end{pmatrix},\begin{pmatrix} 2\\ 1 \\2\end{pmatrix}, \begin{pmatrix} 2\\ 1 \\1\end{pmatrix}\]

といったベクトルを、グラム・シュミットの方法によって正規直交化したいとしましょう。

それはこれらのベクトルを並べた行列を作り、それをQR分解することで得られます。「行列.QRdecomposition()」でQR分解です。

\[\left[ \begin{array}{rrr}1&2&2\\2&1&1\\1&2&1\end{array}\right]\]

\[\left[ \begin{array}{rrr}\frac{\sqrt{6}}{6}&\frac{\sqrt{3}}{3}&\frac{\sqrt{2}}{2}\\\frac{\sqrt{6}}{3}&- \frac{\sqrt{3}}{3}&0\\\frac{\sqrt{6}}{6}&\frac{\sqrt{3}}{3}&- \frac{\sqrt{2}}{2}\end{array}\right]\]

\[\left[ \begin{array}{rrr}\sqrt{6}&\sqrt{6}&\frac{5 \sqrt{6}}{6}\\0&\sqrt{3}&\frac{2 \sqrt{3}}{3}\\0&0&\frac{\sqrt{2}}{2}\end{array}\right]\]

戻り値の第1成分が直交行列\(Q\)、第2成分が上三角行列\(R\)で、\(A=QR\)という関係になっています。

 

\(Q\)の列ベクトルが、ベクトル\(a_1,a_2,a_3\)を正規直交化したものです。

\[\left[ \begin{array}{r}\frac{\sqrt{6}}{6}\\\frac{\sqrt{6}}{3}\\\frac{\sqrt{6}}{6}\end{array} \right]\]

\[\left[ \begin{array}{r}\frac{\sqrt{3}}{3}\\- \frac{\sqrt{3}}{3}\\\frac{\sqrt{3}}{3}\end{array} \right]\]

\[\left[ \begin{array}{r}\frac{\sqrt{2}}{2}\\0\\- \frac{\sqrt{2}}{2}\end{array} \right]\]

これらが正規直交系であること、\(Q^{\top} Q =I\)となることは計算で確かめられます。

\[\left[ \begin{array}{rrr}1&0&0\\0&1&0\\0&0&1\end{array}\right]\]

 

確かに\(QR =A\)となっていることも、計算で検証できます。

\[\left[ \begin{array}{rrr}1&2&2\\2&1&1\\1&2&1\end{array}\right]\]

 

別の例として、4次のアダマール行列をQR分解してみましょう。

\[\left[ \begin{array}{rrrr}1&1&1&1\\1&-1&1&-1\\1&1&-1&-1\\1&-1&-1&1\end{array}\right]\]

\[\left[ \begin{array}{rrrr}\frac{1}{2}&\frac{1}{2}&\frac{1}{2}&\frac{1}{2}\\\frac{1}{2}&- \frac{1}{2}&\frac{1}{2}&- \frac{1}{2}\\\frac{1}{2}&\frac{1}{2}&- \frac{1}{2}&- \frac{1}{2}\\\frac{1}{2}&- \frac{1}{2}&- \frac{1}{2}&\frac{1}{2}\end{array}\right]\]

\[\left[ \begin{array}{rrrr}2&0&0&0\\0&2&0&0\\0&0&2&0\\0&0&0&2\end{array}\right]\]

 

検算してみると、

\[\left[ \begin{array}{rrrr}1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1\end{array}\right]\]

\[\left[ \begin{array}{rrrr}1&1&1&1\\1&-1&1&-1\\1&1&-1&-1\\1&-1&-1&1\end{array}\right]\]

QR分解がきちんと得られていることがわかります。

 

以上、Julia(SymPy)でQR分解、正規直交系を計算する方法を紹介してきました。

シュミットの直交化法は、手計算だとそれなりに計算量があるので、コンピュータのQR分解で求められると嬉しいですね。

木村すらいむ(@kimu3_slime)でした。ではでは。

 

1から始める Juliaプログラミング
進藤 裕之(著), 佐藤 建太(著)
コロナ社 (2020-03-26T00:00:01Z)
5つ星のうち4.5
¥7,353 (コレクター商品)

 

こちらもおすすめ

シュミットの直交化法とは:正規直交基底の具体的な求め方

QR分解とは:シュミットの直交化法による求め方

直交ベクトルの線形独立性、正規直交基底、直交行列について解説

上三角、下三角行列の性質:積、逆行列、固有値について