You are on page 1of 16

1

BAB 3 FAKTORISASI DOOLITLE DENGAN PENUKARAN BARIS 3.1. Pendahuluan Metode faktorisasi ini mengalami kegagalan dan tidak dapat mencapai langkah akhir, jika pada sembarang langkah k dijumpai ukk = 0. Hal ini terjadi bukan karena persamaan Ax = b tidak memiliki penyelesaian. Jika hal itu dijumpai tentulah diperlukan upaya penyelamatan, agar faktorisasi masih dapat dilanjutkan. Demikian dijalankan langkah demi langkah, dengan upaya penyelamatan ditempuh jika ternyata perlu, ... sampai dicapai langkah terakhir. Pada langkah terakhir, k = n, dijumpai salah satu dari dua kemungkinan: (1) unn 0. Persamaan Ax = b dapat diselesaikan, dan nilai x yang memenuhi peersamaan tersebut diperoleh. (2) unn 0. Persamaan Ax = b tidak dapat diselesaikan, karena sebenarnya A tidak memiliki invers (matrix singular). Bagaimanakah upaya penyelamatan itu? Jika pada sembarang langkah k, termasuk k = 1, dijumpai ukk = 0, faktorisasi dari langkah k harus diulangi; didahului oleh operasi penukaran entry sembarang baris dibawahnya, baris dengan > k, sedemikian sehingga ukk = 0 tidak terjadi. Dalah hal ini b, vektor sisi kanan persamaan juga harus mengalami perlakuan sama; konkritnya, bk harus juga ditukar dengan b . Penyelamatan ini bertumpu pada kenyataan bahwa persamaan linear simultan tidak terubah, jika urutan peresamaan diubah. Tetapi apakah ada jaminan, bahwa operasi faktorisasi berjalan mulus? Jika pada suatu langkah k telah dilakukan suatu upaya penyelamatan, lewat penukaran baris k itu dengan baris lain , dapat terjadi bahwa pemilihan baris tersebut ternyata tidak bijaksana, karena pada langkah-langkah sesudahnya upaya penyelamatan seperti itu ternyata harus dilakukan lebih sering daripada jika penukaran pada langkah k itu dilakukan dengan baris lain. Kenyataan seperti ini, serta kepentingan membuat komputasi secara numeris bersifat stabil, mendorong dikembangkannya metode faktorisasi LU yang disempurnakan, seperti dijelaskan dibawah ini. Metode ini disebut metode faktorisasi dengan partial pivoting, atau faktorisasi dengan pembentukan elemen kunci. 3.2. Faktorisasi Doolittle dengan penukaran baris

Ungkapan lain atas apa yang telah dilakukan dalam proses faktorisasi adalah sebagai berikut. Persamaan matrix Ax = b diketahui dapat ditulis dalam bentuk terpartisi. A11 A12 x 1 b1 A x = b 21 A22 2 2 m n-m mxm x1, b1 R dan x2, b2 R , serta A11 R , A12 Rmx(n-m), A21 R(n-m)xm dan A22 R(n-m)x(n-m). Dalam rumusan terpartisi, faktorisasi adalah sebagai dibawah ini. Pada dasarnya diinginkan, bahwa : 0 U 11 U 12 A11 A12 L11 A = L 21 A22 21 L22 0 U 22 Dari persamaan ini muncul empat buah relasi, A11 = L11U11 A12 = L11U12 A21 = L21U11 A22 = L22U12 + L22U22 Untuk m = k - 1, matrix L11, U11, L21 dan U12 adalah submatrix yang terdapat di pojok kiri atas, kiri bawah dan kanan atas dari tabelgabungan. Matrix U22 dan L22 belum diketahui; dalam langkah k yang dapat dihitung hanya baris dan kolom pertama saja. (Dapatkah dari relasi keempat dijabarkan kembali rumus Doolittle untuk menghitung baris pertama U22 dan kolom pertama L22?) Sekarang dilakukan operasi penukaran baris, antara baris k dengan baris < k. Dalam rumusan terpartisi, operasi itu adalah seperti dibawah ini:

I 0 A11 A12 I 0 = 0 P 0 P A A22 K 21 K A12 A11 L11 = P A k 21 Pk A22 Pk L21

L11 L 21

0 U 11 U 12 U 22 L22 0

0 Pk L22

Tampak bahwa (k-1) baris pertama dalam tabel memang tidak harus tersentuh oleh operasi ini. Diinginkan agar pada setiap langkah k tidak terjadi ukk 0. Sebab situasi ini mendorong terbentuknya elemen-elemen L dengan nilai besar, yang pada gilirannya membuat elemen-elemen matrix U bernilai besar juga. Akibatnya, hasil akhir perhitungan tidak lagi memiliki ketelitian yang diharapkan. Dengan perkataan lain, demi stabilitas numeris, ukk 0 harus dihindari. Cara yang mudah untuk maksud itu, adalah dengan memilih baris yang memenuhi syarat
2

U 11 U 12 0 U 22

k i n yaitu pilihlah baris dengan elemen yang memiliki nilai absolut terbesar dalam kolom tersebut. Kegiatan ini disebut pembentukan elemen kunci; sebab cara ini merupakan kunci menuju hasil akhir komputasi yang teliti. Selain atas dasar baris, pembentukan elemen kunci dilaksanakan pula atas dasar pemilihan kolom, atau gabungan dari keduanya. Dalam praktek, pembentukan atas dasar baris sudah mencukupi. Algoritma Doolittle tersebut diatas disempurnakan menjadi sebagai dibawah ini. Pada asasnya, faktorisasi tidak dilakukan atas matrix A, tetapi atas matrix PA, dengan P = hasil perkalian (n-1) matrix permutasi. Karena PA = LU, maka persamaan linear Ax = b diselesaikan dengan menghitung y dari Ly = Pb (mengapa?), dan menghitung x dari Ux = y.

a k = max{ aik }

Algoritma Doolittle dengan penukaran baris. 0. Langkah awal: k : = 1, lakukan operasi penukaran baris; untuk j = 1, 2, ..., n, kerjakan u1j : = a1j j1 : = aj1/u11 1. Untuk langkah k = 2, 3, ... (n-1), kerjakan : Lakukan operasi penukaran baris; Untuk j = k, k+1, k+2, ... , n, kerjakan: ukj : = akj jk : = (ajk

k 1 r =1

kr u rj jr urk
nr u rn
) /ukk

k 1 r =1

2. Langkah terakhir, k = n, kerjakan: unn : = ann 5.3. Ilustrasi Atas matrix A tersebut dibawah ini ingin dilakukan operasi faktorisasi dengan penukaran baris.
n 1 r =1

1 2 A = 3 4 5

2 8 0 16 0

1 6 4 24 0

0 1 6 2 5 1 24 13 6 26

3 8 6 33 17

1. Langkah 1 a. Pemeriksaan atas kolom 1 mengisyaratkan perlunya penukaran baris 1 dengan baris 4 agar elemen kunci adalah maksimal. Sebagai hasilnya diperoleh sebagai berikut: 4 16 24 24 13 33 2 8 6 6 2 8 3 0 4 5 1 6 1 2 1 0 1 3 5 0 0 6 26 17

b. Mengikuti rumus yang diberikan, penetapan atas baris 1 dari U dan


kolom 1 dari L menghasilkan: 4 16 : 24 24 13 33 ... : ... ... ... ... 2 1 2 : 6 6 2 8 3 0 : 4 5 1 6 1 1 8 : 1 0 1 3 5 0 : 0 6 26 17 2. Langkah 2 a. Karena elemen kunci kolom kedua sudah maksimal, operasi penukaran tidak dilakukan. b. Penetapan baris 2 dari U dan kolom 2 dari L memberi hasil dibawah ini: 4 16 : 24 24 13 33 ... : ... ... ... ... 2 1 2 : 6 6 9 / 2 17 / 2 3 0 : 2 / 3 5 1 6 1 1 8 : 1 / 3 0 1 3 5 0 : 0 6 26 17

3. Langkah 3
Pada awal langkah ini proses faktorisasi telah menghasilkan:

4 16 24 : 2 1 2 6 : ... ... : 3 0 23 : 1 1 8 1 3 : 5 0 0 :

24 13 33 6 9 2 17 2 ... ... ... 5 1 6 0 1 3 6 26 17

Oleh karena itu: a. Agar elemen kunci bernilai maximal, dilakukan penukaran atas baris 3 dengan baris 5, sehingga diperoleh sebagai dibawah ini: 4 16 24 : 24 13 33 1 2 6 : 6 9 2 17 2 2 ... ... ... ... : ... 5 0 0 : 6 26 17 1 1 8 1 3 : 0 1 3 3 0 2 3 : 5 1 6

b. Penetapan baris 3 dari U dan kolom 3 dari L membawa kepada


hasil dibawah ini: 4 2 5 1 3 16 24 1 2 6 ... ... 0 0 1 8 1 3 0 23 : 24 13 33 : 6 9 2 17 2 : ... ... ... : 6 26 17 : 1 6 1 3 : 1 6 1 6

4. Langkah 4 a. Keadaan pada awal langkah sebenarnya mengisyaratkan bahwa


penukaran baris tidaklah diperlukan, tetapi misalnya dilakukan operasi penukaran, maka diperoleh: 4 16 24 24 : 13 33 1 2 6 6 : 9 2 17 2 2 5 0 0 6 : 26 17 ... ... ... : ... ... 3 0 2 3 1 6 : 1 6 1 1 8 1 3 1 6 : 1 3

b. Penetapan baris 4 dari U, kolom 4 dari L memberi hasil dibawah ini:

: 13 33 : 9 2 17 2 : 26 17 : ... ... 3 : 8 1 3 3 1 6 1 : 58 3 5. Langkah 5 merupakan langkah terakhir: Penetapan elemen terakhir dari U (sesuai rumus) memberi hasil: 4 16 24 24 13 : 33 2 1 2 6 6 9 2 : 17 2 5 0 0 6 26 : 17 3 0 2 3 1 6 8 13 : 3 1 6 ... ... : ... ... ... 1 1 8 1 3 1 6 5 8 : 41 48 4 2 5 Matrix permutasi 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 P= 0 0 1 0 0 1 0 0 0 0 3.4. Beban komputasi dalam faktorisasi Ada dua macam beban komputasi: (1) cacah memori dan (2) cacah operasi aritmetik yang diperlukan dalam pelaksanaan komputasi. Komenar mengenai cacah memori ditunda sesudah pemahasan mengenai beban komputasi yang kedua. Operasi aritmetik yang sangat mempengaruhi lama komputasi adalah operasi perkalian dan pembagian. Operasi penambahan dan pengurangan biasanya menggunakan waktu yang relatif sangat kecil jika dibandingkan dengan waktu untuk perkalian dan pembagian. Khusus untuk faktorisasi, beban komputasi aritmetik dapat diperinci sebagai berikut: Untuk langkah pertama, n operasi pembagian harus dijalankan. Untuk langkah ke-k, 2 k (n-1), penetapan tiap elemen dari U memerlukan (k-1) operasi perkalian, sedang penetapan tiap elemen dari L memerlukan (k-1) operasi perkalian dan sebuah operasi pembagian. Pada langkah ke-k itu ada (n-k+1) elemen U dan (n-k) elemen L yang harus dihitung. Beban komputasi untuk langkah ini = (n-k+1)(k-1) + (n-k)(k-1+1) operasi. Selanjutnya, pada langkah

16 24 24 1 2 6 6 0 6 0 ... ... ... 0 2 3 1 6 1 8 1 3 1 6

terakhir ada tambahan beban komputasi (n-1) perkalian. Jadi beban komputasi seluruhnya adalah T = (n-1) +

[ ( n k + 1)( k 1) + ( n k )( k 1) ] + ( n 1)
k =2

n 1

1 3 = n + (n2). 3 Sangat bijaksana jika T dapat ditekan serendah mungkin untuk n >> 1. Sisi lain yang harus disoroti adalah penggunaan memori. Untuk matrix ukuran besar biasanya tidak tersedia memori cukup untuk menyimpan semua elemen matrix. Karena matrix seperti itu umumnya juga matrix jarang, maka sangat bijaksana untuk mencatat elemen-elemen taknol saja, mengikuti struktur penyimpanan yang ditentukan sebelumnya.Dalam proses faktorisasi tidak dapat dihindarkan terbentuknya elemen-elemen baru milik L dan U yang memerlukan jatah memori baru karena tidak dapat menempati lokasi yang telah tersedia dari matrix aslinya. Dalam proses komputasi selanjutnya elemen-elemen baru ini, disebut fill-in, cenderung untuk menambah waktu komputasi serta mengurangi ketelitian hitungan (oleh pembulatan-pembulatan yang terjadi). Sekedar untuk menggambarkan adanya interaksi antara memori dan waktu komputasi, tinjaulah matrix H dibawah ini, yang sekaligus telah difaktorisasi seperti dituliskan disebelah kanannya. Elemen dengan nilai nol tidak dicantumkan. 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 2 2 2 4 H= L+U-I= 8 1 1 1 1 4 4 4 1 1 1 1 1 8 8 16 1 1 1 1 1 1 1 15 Matrix H hanya memerlukan 3n lokasi penyimpanan, sedang matrix L+U- I memerlukan n2 elemen memori. Fill-in telah terjadi di semua elemen dalam matrix. Sebagai bahan renungan, dapatkah ditebak dimana (pada lokasi mana dalam matrix) fill-in itu akan terjadi? Peta lokasi taknol dalam matrix yang ditinjau dapat dipakai sebagai basis untuk menjawab pertanyaan ini. Selanjutnya, jika dihadapkan pada persamaan Hx = c, dengan vektor c diketahui, apakah yang dapat diperbuat? Cara yang sering ditempuh adalah menerapkan operasi permutasi P atas baris-baris persamaan,
7

dan menata kembali susunan variabel dalam x, dengan bantuan operator permutasi Q, yang pada gilirannya juga melakukan permutasi atas kolom-kolom dari H. Hal itu dilakukan agar syarat invarin tetap terpenuhi. Dalam hal ini, karena QTQ adalah matrix satuan, maka Hx = c PHQT(Qx) = Pc Peresamaan yang harus dipecahkan adalah Gy = d, dengan G = PHQT, y = Qx dan d = Pc. Pemilihan P dan Q yang jitu menghasilkan proses komputasi yang irit dan waktu dan memori atas Gy = d. Langkah selanjutnya, untuk mendapatkan x dan y, sangat murah biayanya. Untuk contoh diatas, tidak sulit untuk mendapatkan P dan Q yang menghasilkan G dibawah ini (disajikan pula, disisi kanannya L+U-I untuknya). Untuk memberikan tekanan atas unsur drama yang terdapat didalamnya, sekali lagi, nilai nol tidak dicantumkan. 1 2 1 2 4 4 1 1 8 1 8 1 H= L+U-I = 16 1 16 1 1 1 1 1 1 1 1 1 3 1 9 1 1 1 1 1 1 8 2 4 8 16 Paket-paket modern triangularisasi (dalam NAG atau IMSL) untuk penyelesaian persamaan linear menggunakan prinsip ini.

ALGORITMA DOOLITTLE DENGAN PENUKARAN BARIS function [l,u,p] = mylu(a) % faktorisasi Doolittle dengan penukaran baris; agar l*u = p*a n = size(a); r = 1:n; [u,i] = max(abs(a(:,1))); if i ~= 1 x = a(1,:); a(1,:) = a(i,:); a(i,:) = x; s = r(1); r(1) = r(i); r(i) = s; end; a(2:n, 1) = a(2:n,1)/a(1,1) for k = 2:n-1 [u,i] = max(abs(a(k:n,k))); j = i+k-1 if j ~= k x = a(k,:); a(k,:) = a(j,:); a(j,:) = x; s = r(k); r(k) = r(j); r(j) = s; end; v = a(k, 1:k-1); for j = k:n w = a(1:k-1, j); a(k,j) = a(k,j) - v*w; end; w = a(1:k-1, k); for j = k+1 : n v = a(j, 1:k-1); a(j,k) = (a(j,k) - v*w)/a(k,k); end; end; a(n,n) = a(n,n) - a(n, 1:n-1)*a(1:n-1, n); l = tril(a,-1) + eye(n,n); u = triu(a); p = zeros(n,n); for i = 1:n p(i,r(i)) = 1; end;

3.5 Matrix Jarang: Sebuah ilustrasi unik dengan program FORTRAN Sebuah matrix A disebut jarang, jika sebagian terbesar dari elemennya bernilai nol, dan hanya sebagian kecil saja dari elemennya bernilai taknol. Sebagai contoh dibawah ini disajikan sebuah matrix A dari 6 baris dan 6 kolom = 36 elemen, dengan hanya 15 elemen saja yang bernilai taknol.

10

A =

0 1 0 0 0 4 5 2 0 0 7 0 3 0 8 6 0 0 5 4 0 0 1 0 2 0 0 0 1 0 0 0 6 0 9 0

Jika matrix jarang itu memiliki 5000 baris dan 1000 kolom = 5 juta elemen, pastilah merupakan masalah tersendiri bagaimana menyimpannya dalam memori komputer. Tentu saja tidak ada gunanya menyimpan elemen-elemen bernilai nol tersebut. Salah satu cara adalah hanya dengan menyimpan semua elemen yang bernilai taknol saja, dalam bentuk tabel 3 baris, dengan cacah kolom = cacah elemen taknol. Ketiga baris dalam tabel itu masingmasing dipakai untuk menyimpan nomor-baris, nomor-kolom, dan nilai elemen. Matrix A tersebut diatas, misalnya, akan disimpan dalam tabel T sebagai disajikan dibawah ini. Perhatikanlah bahwa tabel T tersebut telah di-sort menurut "primary key" = baris pertama dari tabel, dan "secondary key" = baris kedua tabel tersebut. --Periksalah dengan saksama tabel tersebut. Tabel T:
14 1 2 3 1 15 2 3 4 5 6 7 8 9 10 11 12 13

1 1 4

1 3 -1

2 1 5

2 2 2

2 5 7

3 1 -3

3 3 8

3 4 -6

4 2 -1

4 4 5

4 5 -4

5 1 2

5 5 -1

6 4 6

6 6 9

Keuntungan dari cara penyimpanan dalam tabel T tersebut dengan mudah dapat dikenali. Sesudah cacah-baris, cacah-kolom, dan cacahelemen taknol diinputkan ke komputer, elemen-elemen taknol itu dapat diinputkan ke komputer melalui "key-board" hanya dengan memasukkan (berturut-turut) nomor-baris, nomor-kolom, dan nilainya. Soal Nomor 1. Buatlah program untuk membentuk tabel T dalam memori, untuk matrix A dengan nb baris, nk kolom dan nz elemen taknol.
INTEGER BARIS, T1(2,100) REAL NILAI, T2(100) WRITE (*,*) 'MASUKKAN NB, NK, NZ' READ (*,*) NB, NK, NZ WRITE (*,*) 'MASUKKAN ELEMEN-ELEMEN' DO 100 I=1,NZ

10

11

READ (*,*) BARIS, KOLOM, NILAI T1(1,I) = BARIS T1(2,I) = KOLOM T2(I) = NILAI 100 CONTINUE * dibawah ini instruksi untuk menampilkan kembali tabel T (tidak ditanyakan) DO 200 I = 1,NZ WRITE (*,*) T1(1,I), T1(2,I), T2(I) 200 CONTINUE

Soal Nomor 2. Anggap tabel T sudah ada dalam memori. Buatlah pula program untuk menampilkan dari tabel itu semua elemen taknol dalam baris nbr.
WRITE (*,*) 'MASUKKAN NOMOR BARISNYA' READ (*,*) NBR DO 300 I=1,NZ IF (T1(1,I).EQ.NBR) WRITE (*,*) T1(1,I), T1(2,I), T2(I) 300 CONTINUE

Soal Nomor 3. Anggap tabel T sudah ada dalam memori. Buatlah program untuk mencek, apakah elemen pada baris nbr, kolom nkc memiliki nilai taknol. Jika ya, tampilkan nilai itu.
WRITE (*,*) 'MASUKKAN NOMOR BARIS DAN KOLOM' READ (*,*) NBR, NKC VALUE = 0.0 DO 400 I=1,NZ IF (T1(1,I).EQ.NBR .AND. T1(2,I).EQ.NKC) VALUE = T2(I) 400 CONTINUE WRITE (*,*) VALUE

Soal Nomor 4. Untuk matrix A dalam contoh diatas, buat matrix B yang merupakan transpose dari matrix A. Buat pula tabel S yang merupakan representasi memori dari matrix B tersebut. Selanjutnya buatlah program untuk membuat tabel S yang merupakan representasi memori dari matrix B, yang merupakan transpose dari sembarang matrix A (yang terekam dalam tabel T). Dalam hal ini tabel T dianggap sudah tersedia dalam memori. Deklarasi dibawah ini mengganti deklarasi dalam soal nomor 1 diatas, dan digunakan untuk menjawab soal nomor 4 s/d 6. INTEGER BARIS, T1(2,100),S1(2,100),V1(2,100),INDEX(100) REAL NILAI, T2(100), S2(100), V2(100) Jawab untuk soal nomor 4 adalah dibawah ini (namun belum ter-sort):
11

12

DO 500 I = 1,NZ S1(1,I) = T1(2,I) S1(2,I) = T1(1,I) S2(I) = T2(I) 500 CONTINUE

Soal Nomor 5. Sekarang ingin dibuat program untuk menghitung penjumlahan dua buah matrix F dan matrix G menghasilkan matrix H. Matrix F sudah terekam dalam tabel FF, matrix G juga sudah terekam dalam tabel GG, dan hasilnya harus direkam dalam tabel HH. Buatlah program untuk membuat tabel HH dari tabel FF dan GG tersebut.
* siapkan tempat untuk matrix H = hasil penjumlahan matrix F dengan matrix G * direkam dalam larik S1+S2 NZT = NZ NZV = NZ NZS = NZT+NZV DO 700 I = 1,NZS S1(1,I) = 0 S1(2,I) = 0 S2(I) = 0.0 700 CONTINUE * penjumlahan matrix adalah operasi "merge" atas: * larik T1+T2 (untuk matrix F) dengan * larik V1+V2 (untuk matrix G) * kedua larik itu dianggap sudah ter-sort dengan baik (periksa soal nomor 6). * initialisasi "pointer" atas larik T1+T2, LOKT = 1 LOKV = 1 LOKS = 0 710 CONTINUE IF (LOKT.GT.NZT .AND. LOKV.GT.NZV) GOTO 770 LOKS = LOKS+1 INI = 10*T1(1,LOKT) + T1(2,LOKT) ITU = 10*V1(1,LOKV) + V1(2,LOKV) IF (INI .NE. ITU) GOTO 750 S1(1,LOKS) = T1(1,LOKT) S1(2,LOKS) = T1(2,LOKT) S2(LOKS) = T2(LOKT) + V2(LOKV) LOKT = LOKT+1 LOKV = LOKV+1 GOTO 710 750 CONTINUE IF (INI .GT. ITU) GOTO 760 S1(1,LOKS) = T1(1,LOKT) S1(2,LOKS) = T1(2,LOKT) S2(LOKS) = T2(LOKT) LOKT = LOKT+1

12

13

GOTO 710 760 CONTINUE S1(1,LOKS) = V1(1,LOKV) S1(2,LOKS) = V1(2,LOKV) S2(LOKS) = V2(LOKV) LOKV = LOKV+1 GOTO 710 770 CONTINUE * matrix H := F + G memiliki LOKS buah elemen taknol dan dapat ditampilkan DO 790 I = 1,LOKS WRITE (*,*) S1(1,I), S1(2,I), S2(I) 790 CONTINUE

Soal Nomor 6. Anggap tabel T untuk sembarang matrix jarang A sudah ada dalam memori, namun belum ter-sort menurut baris dan kolom. Buatlahlah program untuk melakukan operasi sort tersebut.
* siapkan index untuk membantu proses sort DO 800 I = 1,NZ INDEX(I) = 10*S1(1,I) + S1(2,I) 800 CONTINUE * proses sort dimulai DO 820 K = 1,NZ MAX = 0 DO 810 I = 1,NZ IF (INDEX(I) .LE. MAX) GOTO 810 MAX = INDEX(I) LOK = I 810 CONTINUE INDEX(LOK) = 0 KK = NZ + 1 - K V1(1,KK) = S1(1,LOK) V1(2,KK) = S1(2,LOK) V2(KK) = S2(LOK) 820 CONTINUE * hasil proses sort ditampilkan ... DO 830 I = 1,NZ WRITE (*,*) V1(1,I), V1(2,I), V2(I) 830 CONTINUE

Cara lain, yang sering dikerjakan pula, adalah merekam matrix jarang itu dalam struktur data yang terdiri atas 3 larik berdimensi satu. Larik pertama, terdiri atas nb+1 elemen, disebut larik BAR, sedang kedua larik lainnya, masing-masing disebut larik KOL dan VAL, terdiri atas atas nz elemen; dengan nb = cacah-baris, dan nz = cacah elemen taknol. Untuk matrix A dalam contoh dimuka, struktur data itu adalah sebagai berikut:
Larik BAR:
1 2 3 4 5 6 7

13

14

1
1

3
2

6
3

9
4

12
5 6

14
7

16
8 9 10 11 12 13 14 15

Larik KOL: 1
1

3
2

1
3

2
4

5
5

1
6

3
7

4
8

2
9

4
10

5
11

1
12

5
13

4
14

6
15

Larik VAL: 4 -1

-3

-6

-1

-4

-1

Perhatikanlah bahwa entri dalam larik VAL adalah entri baris ketiga tabel T, dan entri dalam larik KOL adalah entri baris kedua tabel T terrsebut. Index untuk VAL dan KOL adalah index kolom dari tabel T tersebut. Index itu dapat dibaca sebagai "elemen tak nol yang ke ...". Larik BAR juga dikontruksi dari tabel T. Larik BAR pada dasarnya berisi "pointer" ke larik KOL dan VAL. Melalui entri dalam larik BAR dapat diperoleh semua informasi yang diinginkan tentang matrix A. Untuk memahaminya, nyatakan [VAL(i)] = entri ke-i dalam larikVAL, [KOL(j)] = entri ke-j larik KOL, dan [BAR(k)] = entri ke-k dari BAR. BAR(5) berisi lokasi pertama elemen taknol dalam baris 5 matrix A, BAR(6) = berisi lokasi pertama dari elemen taknol dalam baris 6. Karena itu [BAR(6)] - [BAR(5)] = 14 - 12 = 2 = cacah elemen taknol dalam baris 5 matrix A. Dapat juga dikatakan, bahwa elemen taknol baris 5 dari matrix A terdapat pada kolom yang terekam dalam entri KOL ke-12 dan 13, dan nilainya terekam dalam entri VAL yang ke-12 dan 13 juga. -- Sebagai latihan, periksalah elemen taknol baris ke-3 ada di kolom mana dan bernilai berapa? Elemen baris ke-3 kolom ke-4 matrix A berapa nilainya? Jawab: [BAR(3)] = 6, [BAR(4)] = 9. Elemen taknol baris ke-3 itu terekam dalam entri ke-6, 7 dan 8 dari KOL dan BAR. Karena ternyata [KOL(8)] = 4, maka VAL(8) = -6 adalah nilai yang ditanyakan. -- Sebagai latihan, periksalah bahwa elemen baris ke-2 kolom ke-6 dari matrix A memang tak terekam dalam struktur data, jadi nilainya adalah nol. Demikian juga elemen baris ke-6 kolom ke-1. Jika tabel T memerlukan 3 nz lokasi dalam memori komputer, maka struktur data BAR-KOL-VAL hanya memerlukan 2 nz + nb + 1 lokasi saja. Deklarasi dibawah ini mengganti deklarasi dalam soal nomor 4 tersebut diatas. (Pada prinsipnya hanya ditambahkan deklarasi untuk struktur BAR-KOL-VAL): INTEGER BARIS, T1(2,100),S1(2,100),V1(2,100),INDEX(100),BAR(100), * KOL(100)
14

15

REAL

NILAI, T2(100), S2(100), V2(100), VAL(300)

Soal Nomor 7. Dengan tabel T untuk sembarang matrix A telah tersimpan dalam memori, buat program untuk membuat merekam matrix itu dalam struktur data BAR-KOL-VAL.
WRITE (*,*) 'SOAL NOMOR 7 - MEMBENTUK BAR-KOL-VAL' DO 1100 J = 1,NZ KOL(J) = T1(2,J) VAL(J) = T2(J) CONTINUE BAR(1) = 1 DO 1150 I = 2,NB DO 1120 J = 1, NZ IF (I .NE. T1(1,J)) GOTO 1120 BAR(I) = J GOTO 1150 CONTINUE CONTINUE BAR(NB+1) = NZ+1

1100 1110

1120 1150

Soal nomor 8. Dengan rekaman BAR-KOL-VAL telah terbentuk dalam memori, buat program untuk menetapkan nilai matrix A pada baris nbr dan kolom nkc.
WRITE (*,*) 'MASUKKAN NOMOR BARIS DAN KOLOM' READ (*,*) NBR, NKC MULAI = BAR(NBR) MANDEG = BAR(NBR+1) - 1 DO 1200 J = MULAI, MANDEG IF (KOL(J) .NE. NKC) GOTO 1200 VALUE = VAL(J) GOTO 1220 1200 CONTINUE 1220 CONTINUE WRITE (*,*) VALUE

Soal nomor 9. Dengan rekaman BAR-KOL-VAL telah terbentuk dalam memori, buat program untuk menetapkan cacah-baris dan cacah-kolom dari matrix yang diwakilinya.
WRITE (*,*) 'NOMOR 9 - MENETAPKAN DIMENSI MATRIX' DO 1300 I = 1,100 IF (BAR(I) .NE. 0) GOTO 1300 NBARIS = I-2 GOTO 1330 1300 CONTINUE 1330 CONTINUE NONZRO = BAR(NBARIS+1) - 1 NKOLOM = 0

15

16

DO 1350 J = 1,NONZRO IF (KOL(J) .GE. NKOLOM) NKOLOM = KOL(J) 1350 CONTINUE WRITE (*,*) NBARIS, NKOLOM

Soal nomor 10. Dengan rekaman BAR-KOL-VAL telah terbentuk dalam memori, buat program untuk menampilkan semua elemen-taknol pada kolom nkc.
WRITE (*,*) 'SOAL 10 - TAMPILKAN NOMOR KOLOM YANG DIINGINKAN' READ (*,*) NKC DO 1500 I = 1,NBARIS MULAI = BAR(I) MANDEG = BAR(I+1) - 1 DO 1400 J = MULAI, MANDEG IF (KOL(J) .NE. NKC) GOTO 1400 WRITE (*,*) I, NKC, VAL(J) GOTO 1500 1400 CONTINUE 1500 CONTINUE

Soal nomor 11. Misal matrix G telah tersimpan dalam struktur BAR1-KOL1-VAL1, dan matrix H telah tersimpan dalam BAR2KOL2-VAL2. Buat program untuk menetapkan struktur data BAR3-KOL3-VAL3 untuk matrix hasil penjumlahan dari G dan H. (harap dikerjakan sebagai latihan -- ide jawaban seperti soal nomor 5) Soal nomor 12. Sekarang buatlah program untuk melaksanakan faktorisasi Doolittle dengan penukaran baris, seperti yang telah dilakukan dalam anak bab sebelum ini ? Soal ini dapat dipandang sebagai soal yang rumit. Namun ada juga cara untuk mengerjakannya sehingga menjadi soal yang sebenarnya sangat sederhana! Dapatkah anda menyelesaikannya?

16

You might also like