Algoritma Komputasi Transformasi Givens

Pengenalan Transformasi Givens

Transformasi Givens merupakan transformasi linear yang menggunakan matriks rotasi Givens. Salah satu kegunaan dari transformasi Givens ini adalah menyelesaikan sistem persamaan linear dengan mendekomposisikan matriks koefisien, katakan A menjadi QR, di mana Q adalah matriks persegi ortogonal dan R adalah matriks segitiga atas. \[ A=QR \]

Asal Mula Transformasi Givens

Dengan memanfaatkan transformasi geometri Rotasi, yaitu: \[ R_\theta= \begin{bmatrix} cos(\theta) & -sin(\theta)\\ sin(\theta) & cos(\theta) \\ \end{bmatrix} \] jika rotasi berlawanan jarum jam. Atau \[ R_\theta= \begin{bmatrix} cos(\theta) & sin(\theta)\\ -sin(\theta) & cos(\theta) \\ \end{bmatrix} \] jika rotasi searah jarum jam.
Transformasi ini bertujuan untuk membentuk matriks segitiga atas R terlebih dahulu. Untuk matriks Q akan mengikuti setelah diperoleh matriks segitiga atas R.

Untuk pembahasan kali ini digunakan rotasi yang searah jarum jam. Untuk rotasi berlawanan jarum jam proses pembuktiannya sama dengan pembuktian rotasi yang searah jarum jam.

Misalkan matriks rotasi Givens \[ R_\theta= \begin{bmatrix} cos(\theta) & sin(\theta)\\ -sin(\theta) & cos(\theta) \\ \end{bmatrix} \] dan misalkan \(cos(\theta)=c\) dan \(sin(\theta)=s\)

Sehingga: \[ R_\theta= \begin{bmatrix} c & s\\ -s & c\\ \end{bmatrix} \] Lalu dimiliki vektor \(\begin{bmatrix} a\\b \end{bmatrix}\). Kita ingin mengubah \(\begin{bmatrix} a\\b \end{bmatrix}\) menjadi \(\begin{bmatrix} r\\0 \end{bmatrix}\) dengan memanfaatkan transformasi dari \(R_\theta\). Secara matematis ditulis: \[ R_\theta \begin{bmatrix} a\\b \end{bmatrix} = \begin{bmatrix} r\\0 \end{bmatrix} ...(i) \] Karena rotasi tidak mengubah panjang vektor, maka \(\sqrt{r^2+0^2}=\sqrt{a^2+b^2}\) \[r=\sqrt{a^2+b^2}\] Kembali ke persamaan \((i)\)

\(\begin{bmatrix} c & s \\ -s & c\end{bmatrix} \begin{bmatrix} a\\b \end{bmatrix}= \begin{bmatrix} r\\0 \end{bmatrix}\)
\(ca+sb=r...(1)\)
\(-sa+cb=0...(2)\)

Kalikan persamaan \((1)\) dengan \(s\) dan persamaan \((2)\) dengan \(c\)
Sehingga persamaan \((1)\) menjadi
\(sca+s^2b=sr...(3)\)
dan persamaan \((2)\) menjadi \(-csa+c^2b=0...(4)\)

Jumlahkan persamaan \((3)\) dengan persamaan \((4)\), dan diperoleh hasil \(s^2b+c^2b=sr\)
\((s^2+c^2)b=sr\)

Ingat identitas trigonometri di mana \(sin^2(\theta)+cos^2(\theta)=1\).
Sehingga \(1b=sr\)
\(s=\frac{b}{r}\)
\(s=\frac{b}{\sqrt{a^2+b^2}}\)
Lakukan substitusi untuk mencari \(c\), sehingga diperoleh \(c=\frac{a}{\sqrt{a^2+b^2}}\)
Sehingga diperoleh persamaan yang akan digunakan untuk proses dekomposisi \[ s=\frac{b}{\sqrt{a^2+b^2}} \\ c=\frac{a}{\sqrt{a^2+b^2}} \]

Contoh

1.

Bentuk matriks segitiga atas R dengan Transformasi Givens dari \[ \begin{bmatrix} 2 & 1 & 1\\ 1 & 3 & 2\\ -1 & 1 & 2\\ \end{bmatrix} \]

> tgivens<-function(X){
+   if (ncol(X)>nrow(X)){
+     stop("The dimension row must equal or more than dimension column")
+   }
+   if (ncol(X)<nrow(X)){
+     for (i in (1:ncol(X))){
+       for (j in ((i+1):nrow(X))){
+         a=X[i,i]
+         b=X[j,i]
+         r=sqrt(a^2+b^2)
+         Uij<-matrix(c(a/r, -b/r, b/r, a/r), nrow=2)
+         U=diag(nrow(X))
+         U[c(i,j),c(i,j)]=Uij
+         X<-U%*%X
+       }
+     }
+   }
+   if (ncol(X)==nrow(X)){
+     for (i in (1:(ncol(X)-1))){
+       for (j in ((i+1):nrow(X))){
+         a=X[i,i]
+         b=X[j,i]
+         r=sqrt(a^2+b^2)
+         Uij<-matrix(c(a/r, -b/r, b/r, a/r), nrow=2)
+         U=diag(nrow(X))
+         U[c(i,j),c(i,j)]=Uij
+         X<-U%*%X
+       }
+     }
+   }
+ n=ncol(X)
+ R<-X[1:n,]
+ return(round(R,4))
+ }
> #_______________________________________________________________________________
> X<-matrix(c(2,1,-1,1,3,1,1,2,2), nrow=3, byrow = F)
> tgivens(X)
       [,1]   [,2]   [,3]
[1,] 2.4495 1.6330 0.8165
[2,] 0.0000 2.8868 2.6558
[3,] 0.0000 0.0000 1.1314

2.

Bentuk matriks segitiga atas R dengan Transformasi Givens dari \[ \begin{bmatrix} 2 & 0\\ 0 & 1\\ 1 & 2\\ \end{bmatrix} \]

> tgivens<-function(X){
+   if (ncol(X)>nrow(X)){
+     stop("The dimension row must equal or more than dimension column")
+   }
+   if (ncol(X)<nrow(X)){
+     for (i in (1:ncol(X))){
+       for (j in ((i+1):nrow(X))){
+         a=X[i,i]
+         b=X[j,i]
+         r=sqrt(a^2+b^2)
+         Uij<-matrix(c(a/r, -b/r, b/r, a/r), nrow=2)
+         U=diag(nrow(X))
+         U[c(i,j),c(i,j)]=Uij
+         X<-U%*%X
+       }
+     }
+   }
+   if (ncol(X)==nrow(X)){
+     for (i in (1:(ncol(X)-1))){
+       for (j in ((i+1):nrow(X))){
+         a=X[i,i]
+         b=X[j,i]
+         r=sqrt(a^2+b^2)
+         Uij<-matrix(c(a/r, -b/r, b/r, a/r), nrow=2)
+         U=diag(nrow(X))
+         U[c(i,j),c(i,j)]=Uij
+         X<-U%*%X
+       }
+     }
+   }
+ n=ncol(X)
+ R<-X[1:n,]
+ return(round(R,4))
+ }
> #_______________________________________________________________________________
> X<-matrix(c(2,0,1,0,1,2), nrow=3, byrow = F)
> tgivens(X)
       [,1]   [,2]
[1,] 2.2361 0.8944
[2,] 0.0000 2.0494