ASISTENSI GEOTOMOGRAFI
Disusun Oleh
Kelompok 5, Kelas B
2
DAFTAR GAMBAR
Gambar 2.1 Diagram alir fungsi BPT ...................................................................................... 11
Gambar 2.2 Diagram alir fungsi ART ..................................................................................... 12
Gambar 2.3 Diagram alir fungsi SIRT ..................................................................................... 13
Gambar 2.4 Diagram alir fungsi pseudo invers inversion ....................................................... 14
Gambar 2.5 Diagram alir fungsi LSQR inversion ................................................................... 15
Gambar 2.6 Diagram alir fungsi Bi-CG inversion ................................................................... 16
Gambar 3.1 Model sebenarnya ................................................................................................ 17
Gambar 3.2 Ray path ............................................................................................................... 17
3
BAB I
DASAR TEORI
1.1 Back Projection Technique (BPT)
Back Projection Technique (BPT) yang disebut juga sebagai teknik proyeksi ke
belakang adalah metode paling sederhana dalam tomografi inversi linear. Metoda ini
menggunakan prinsip trigonometri yang dirancang untuk meniru proses akuisisi data dengan
cara terbalik (reverse). Dasar dari metode ini adalah menerapkan secara langsung slowness
rata-rata dari suatu sinar ke dalam slowness lokal yang dilaluinya. Misalnya sejumlah
gelombang seismik yang merambat dari sumber ke penerima dicatat sebagai N, selanjutnya
masing-masing gelombang direpresentasikan oleh gelombang-i (i= 1,2,…,N). Medum dibagi
atas M sel. Rata-rata slowness (Si) yang dilalui gelombang ini dapat dituliskan sebagai
(Monalia, 2011):
𝑇𝑜𝑖
𝑠̅𝑖 = (1.1)
𝐿𝑖
dengan:
𝐿𝑖 = ∑ 𝑙𝑖𝑗 (1.2)
𝑗=1
yang mana 𝑇𝑜𝑖 adalah waktu tempuh dari gelombang ke – i berdasarkan pengamatan, dan
𝐿𝑖 adalah total panjang lintasan gelombang ke – i dari titik sumber ke titik penerima. Jika 𝑙𝑖𝑗
adalah panjang lintasan gelombang– i di sel– j (j = 1,2,.…,M), maka slowness pada sel ke– j
(Sj) dapat ditulis sebagai:
∑𝑁 ̅
𝑖=1 𝑙𝑖𝑗 𝑆𝑖
𝑆𝑗 = 𝑁 (1.3)
∑𝑖=1 𝑙𝑖𝑗
Bedanya dengan rekonstruksi inversi matriks, algoritma pada rekonstruksi back
projection dapat ‘mengetahui’ sudut akuisisi serta posisi dari susunan detektor yang ebrkaitan
dengan masing-masing jejak gelombang. Metoda ini memungkinkan proses dilakukan dengan
cepat namun memiliki hasil yang kurang baik (Gideon, 2015)
4
perhitungan koreksi, pembaharuan nilai dan tes konvergensi. Proses ART disajikan dalam
langkah berikut ini (Oliveira dkk., 2011):
1. Pembuatan model sinar awal dengan “N” elemen terparameterisasi j, biasanya bernilai
0.
2. Perhitungan proyeksi P’(i) untuk semua gelombang berdasarkan persamaan:
∑𝑁 𝑖
𝑗=1 𝑓 (𝑗). 𝑤𝑖𝑗 = 𝑃′𝑖 i = 1,2,3…...M (1.4)
3. Dilakukan perhitungan untuk menentukan perbedaan nilai antara poyeksi original P(i)
dan P’(i)
4. Dilakukan penjumlahan bobot tiap gelombang
𝑊𝑖 = ∑𝑁 2
𝑗=1 𝑤𝑖𝑗 (1.5)
∆𝑃𝑖
𝛼𝑖 = (1.6)
𝑊𝑖
𝑓1𝑘 −𝑓1𝑘−1
Δ𝑓 = ∑𝑁
𝑗−1 (1.8)
𝑓1𝑘
5
Teknik ini menghitung secara iterasi, yakni satu persamaan dianalisa dalam waktu
bersamaan, slowness residual lintasan ke-I pada iterasi ke-k dihitung dengan mengurangi waktu
rambat observasi (Toi) dengan waktu rambat perhitungan (Tci) sebagai berikut (Monalia,
2011):
(𝑘) (𝑘)
𝑇𝑐𝑖 = ∑𝑀
𝑗=1 𝐼ϋ 𝑆𝑗 (1.9)
Yang mana:
(𝑘)
𝑇𝑐𝑖 = waktu rambat perhitungan lintasan ke-I pada iterasi ke-k
(𝑘)
𝑆𝑗 = slowness sel ke-j pada iterasi ke-k
M = jumlah sel/grid
Maka waktu tempuh residual yang dilalui oleh lintasan gelombang ke-I pada iterasi ke-k
(𝑘)
∆𝑡ϋ = 𝑇𝑜𝑖 − 𝑇𝑐𝑖 (1.10)
Waktu rambat residual dalam setiap lintasam gelombang kemudian di distribusikan ke setiap
sel dengan persamaan:
(𝑘)
𝐼ϋ ∆𝑇𝑐𝑖
∆𝑡ϋ = (1.11)
𝐿𝑖
Yang mana:
∆𝑡ϋ = Waktu rambat residual lintasan ke-I yang terdistribusikan pada sel ke-j
𝐿𝑖 = Panjang total lintasan ke-i
Selanjutnya factor korelasi slowness tiap sel (∆𝑆𝑗) dihitung dari semua waktu rambat residual
dan dari Panjang lintasan setiap sel dengan persamaan:
∑𝑁
𝑖=1 ∆𝑡ϋ
∆𝑆𝑗 = ∑𝑁
(1.12)
𝑖=1 𝐼ϋ
Yang mana:
N = jumlah lintasan gelombang
Maka slowness sel-j setelah iterasi ke-k+1:
(𝑘)
𝑆𝑗𝑘+1 = 𝑆𝑗 + ∆𝑆𝑗 (1.13)
6
1.4 Pseudo-invers Inversion
Inversi ini merupakan salah satu teknik inversi non-linier dengan pendekatan linier,
yang mana prinsip inversi ini adalah melakukan proses singular value decomposition (SVD).
SVD adalah teknik mendekomposisi matriks yang berukuran apa saja dengan hasil berupa
singular value yang disimpan dalam sebuah matriks diagonal dalam urutan yang sesuai dengan
korespondensi singular vektornya. Dekomposisi nilai singular matruks riil Amxn adalah
faktorisasi 𝐴 = 𝑈 ∑ 𝑉 𝑇 dengan U matriks orthogonal m x m, V matriks orthogonal n x n dan
Σ matriks diagonal m x n bernilai rill tak negatif yang disebut nilai singular.
𝐴 = 𝑈𝑆𝑉 𝑇 (1.14)
Yang mana A adalah matriks ukuran m x n, U adalah singular vektor dari matriks A dan vektor
ini orthonormal, S merupakan diagonal vektor yang menyusun singular value dari
korespondensi singular vektornya dan VT adalah singular vektor dari matriks A yang juga
orthonormal (Sihombing dkk., 2018).
Langkah-langkah penentuan SVD dijelaskan sebagai berikut:
1. Definisikan matriks A (matriks dengan dimensi m x m)
2. Mencari eigen value A melalui persamaan karakteristik:
|𝐴 = 𝜆𝐼| = 0 (1.15)
𝐴 = 𝑈𝑆𝑉 𝑇 (1.16)
𝐴−1 = 𝑉𝑆 −1 𝑈 𝑇 (1.18)
Berdasarkan hasil dari proses SVD maka dapat ditentukan model sesuai persamaan:
7
𝑚 = 𝐴−1 𝑏 (1.19)
𝑚 = 𝑉𝑆 −1 𝑈 𝑇 𝑏 (1.20)
Yang berbeda disini ialah pada Bi-Conjugate subruang L diproyeksikan tegak lurus terhadap
subruang K, subruang ini didefinisikan sebagai:
Ini menghilangkan masalah yang terjadi pada konjugasi gradien, satu tidak dibutuhkan matriks
simetris, karena kita memproyeksikan ke transpose terkonjugasi. Pada metode Bi-CG
dikenalkan 2 vektor bintang r* & p*. Vektor bintang ini digunakan untuk membuat subruang
𝐿𝑚 ke dua dengan perhitungan sebagai berikut:
∗
𝑟𝑖∗ = 𝑟(𝑖−1) − 𝛼𝑖 𝐴𝑇 𝑝𝑖∗ (1.23)
∗ ∗
𝑝𝑖∗ = 𝑟(𝑖−1) − 𝛽𝑖 𝑝(𝑖−1) (1.24)
Algoritma Bi-CG melakukan iterasi hingga didapatkan nilai vektor dengan ketentuan sebagai
berikut
(𝑟𝑖∗ , 𝑟𝑗 ) = 0, 𝑖 ≠ 𝑗 (1.25)
Tujuan umum dari metode Bi-CG adalah membuat tegak lurus vektor residual r,p kedalam
vektor r* & p*. Vektor r dan p pada subruang K, sedangkan r* & p* pada subruang L.
Kekurangan dari metode Bi-CG adalah nilai numerikal yang tidak stabil. Langkah metode Bi-
CG disajikan dalam uraian berikut ini (Yuvashankar Vinay dkk., 2016):
8
1: Compute 𝑟0 ≔ 𝑏 − 𝐴𝑥0 . Choose 𝑟0∗ such that 𝑟0 , 𝑟0∗ ≠ 0
2: set, 𝑝0 = 𝑟0 , 𝑝0∗ = 𝑟0∗
3: For 𝑗 = 0,1, …, until convergence do
(𝑟𝑖∗ ,𝑟𝑗 )
4: 𝛼𝑗 ≔ 𝐴𝑝𝑗 ,𝑝𝑗∗
5: 𝑥𝑗+1 ≔ 𝑥𝑗 + 𝛼𝑗 𝑝𝑗
6: 𝑟𝑗+1 ≔ 𝑟𝑗 − 𝛼𝑗 𝐴𝑝𝑗
∗
7: 𝑟𝑗+1 ≔ 𝑟𝑗∗ − 𝛼𝑗 𝐴𝑇 𝑝𝑗∗
∗
(𝑟𝑗+1 ,𝑟𝑗+1 )
8: 𝛽𝑗 ≔ 𝑟𝑗 ,𝑟𝑗∗
9: 𝑝𝑗+1 ≔ 𝑟𝑗+1 + 𝛽𝑗 𝑝𝑗
∗ ∗
10: 𝑝𝑗+1 ≔ 𝑟𝑗+1 − 𝛽𝑗 𝑝𝑗∗ ; end for
Nilai dari,
𝑥𝑘 = 𝑉𝑘 . 𝑦𝑘 (1.27)
𝑟𝑘 = 𝑏 − 𝐴𝑥𝑘 (1.28)
𝑡𝑘+1 = 𝛽1 𝑒1 − 𝐵𝑘 𝑦𝑘 (1.29)
Didefinisikan sebagai vektor yk. Persamaan tersebut sesuai dengan persamaan rk,
9
(1.32)
Dimana Qk = Qk, Qk+1,…… Nilai Q2,3 Q1,2 adalah produk dari rotasi planar didesain untuk
mengeliminasi subdiagonal β2, β3,….. dari Bk. Vektor dari yk dan tk+1 dapat diketahui dari;
𝑅𝑘 𝑦𝑘 = 𝑓𝑘 (1.33)
0 (1.34)
𝑡𝑘+1 = 𝑄𝑘 𝑇 [ ̅ ]
𝑄𝑘+1
Namun, yk di persamaan 1.32 normalnya tidak mempunyai elemen yang sama dengan yk-1.
Sebagai gantinya dapat dicatat bahwa [Rk fk] adalah sama dengan [Rk-1 fk-1] dengan
ditambahkan baris dan kolom baru. Oleh karena itu, salah satu mengkombinasikan persamaan
1.26 dan 1.32 secara efisien dilakukan menurut dengan;
𝑥𝑘 = 𝑉𝑘 𝑅𝑘 −1 𝑓𝑘 = 𝐷𝑘 𝑓𝑘 (1.35)
Dimana kolom dari Dk= [d1 d2 d3….dk] dapat ditemukan dari sistem 𝑅𝑘𝑇 𝐷𝑘𝑇 = 𝑉𝑘𝑇 dengan
substitusi forward. Dengan d0 = x0 = 0, didapatkan
1 (1.36)
𝑑𝑘 = (𝑉 − 𝜃𝑘 𝑑𝑘−1 )
𝜌𝑘 𝑘
𝑥𝑘 = 𝑥𝑘−1 + 𝜃𝑘 𝑑𝑘 (1.37)
Dan hanya iterasi terbaru yang perlu disimpan.
10
BAB II
METODOLOGI PENELITIAN
Pada bagian ini akan ditunjukkan diagram alir dari beberapa fungsi sebagai berikut:
2.1 Back Projection Technique (BPT)
11
2.2 Algebraic Reconstruction Technique (ART)
12
2.3 Simultaneous Iterative Reconstruction Technique (SIRT)
13
2.4 Pseudo-invers Inversion
14
2.5 LSQR Inversion
15
2.6 Bi-Conjugate Gradient (Bi-CG) Inversion
16
BAB III
HASIL DAN PEMBAHASAN
3.1 Model dan Raypath
17
3.2 Back Projection Techniques (BPT)
Hasil Running
18
Metode rekonstruksi BPT menggunakan konsep menghitung nilai slowness dari nilai
waktu yang dihasilkan dari proses Forward Modeling. Hasil rekonstruksi menggunakan
metode BPT tidak dapat menggambarkan kontras nilai slowness secara akurat. Pada nilai True
Model, terdapat nilai slowness 0.022 pada lapisan 1, sedangkan pada model hasil lapisan
tersebut tidak terlihat kontras warnanya, dan menunjukkan nilai slowness sebesar 0.015. Hal
ini dikarenakan metode BPT melakukan iterasi 1 kali saja dalam melakukan pencarian nilai
slowness, sehingga model slowness yang didapatkan kurang akurat. Nilai error yang
dihasilkan dari metode rekonstruksi ini yaitu sebesar 0.54958% dengan membutuhkan waktu
selama 0.0036809 sekon.
19
Pada metode ART, model awal menggunakan hasil rekonstruksi dari metode BPT.
Kemudian dilakukan iterasi pada nilai waktu yang dihasilkan dari model slowness kemudian
dilakukan pengurangan antara time hasil model dan dari proses forward, kemudian dilakukan
update nilai slowness untuk tiap ray dengan menggunakan nilai slowness lama. Dari hasil
metode ini memiliki error yang lebih kecil dari metode BPT. Dari hasil running, memiliki
tingkat kesamaan yang tinggi. Hasil ART dapat menunjukkan batas lapisan melalui kontras
warna yang berkorelasi dengan nilai slowness dan dapat menggambarkan posisi fold secara
akurat. Untuk metode ART ini nilai error sebesar 0.014509% selama 1.0389 second. Error
tersebut didapat ketika mencapai iterasi ke 23 dengan nilai konvergensi (kesamaan model
dengan iterasi sebelumnya sebesar 9.8883x10-6.
20
Metode rekosntruksi SIRT memiliki kesamaan dengan metode ART, hanya
perbedaannya penghitungan nilai slowness terbaru dihitung setelah perhitungan tersebut
diselesaikan. Kemudian dilakukan perhitungan t ulang untuk seluruh ray, lalu dihitung nilai
slowness ter-update tiap ray. Metode ini memberikan model rekonstruksi dengan baik. Dapat
menunjukkan batas-batas lipatan melalui nilai slowness, tetapi pada beberapa grid tidak
menunjukkan slowness yang seharusnya. Oleh karena itu, metode ini menghasilkan nilai RMS
yang lebih besar dari metode ART yaitu sebesar 0.12333% dan mencapai titik konvergensi
lebih lama dari ART yaitu selama 0.28092 second, hal ini dapat dilihat dari jumlah iterasi yang
dilakukan. Metode ini juga memerlukan waktu yang relatif lebih lama dari ART karena proses
iterasi dilakukan setelah nilai slowness awal untuk tiap ray didapatkan semua.
21
Proses inversi menggunakan metode LSQR menghasilkan model dengan nilai RMS
sebesar 0.1918% dengan lama processing 0.036791 seconds. Metode ini tidak dapat
menggambarkan model awal secara baik, hal ini terlihat dari masih acaknya nilai slowness yang
dihasilkan dari model rekonstruksi. Model hasil rekonstruksi tidak dapat menunjukkan batas
antar lapisan 1 dan 2. Hal ini dikarenakan metode ini tidak dilakukan proses iterasi. Perhitungan
hanya dilakukan 1 kali sehingga waktu yang dibutuhkan pun juga tidak terlalu lama dan error
yang dihasilkan juga masih relatif besar. Pada hasil rekonstruksi masih ditemukan nilai
slowness rendah pada lapisan 1 dimana seharusnya pada lapisan tersebut tidak ada nilai
slownesss rendah karena kecepatan yang masih relatif rendah terhadap lapisan 2.
3. 6 Inversi BiCG
Hasil Running
22
Metode inversi Bi-CG menghasilkan nilai error sebesar 0.029511% dalam 0.076144
seconds. Metode ini melakukan iterasi 2 kali, sehingga menghasilkan model mendekati model
awal dengan nilai RMS error sebesar 0.029511% dalam 0.076144 second. Karena adanya
iterasi selama 2 kali tersebut sehingga membutuhkan waktu lebih lama dari LSQR. Tetapi
model yang dihasilkan juga memiliki kualitas yang lebih baik dari LSQR.
Metode PInv dilakukan ketika (𝐺 𝑇 𝐺) berupa matriks singular sehingga tidak dapat
dilakukan proses inversi. Metode ini dilakukan dengan memecah matriks yang akan di invers
menjadi 3 komponen yaitu matriks S, V, dan U. Matrik S berisi matriks yang berukuran sama
23
dengan matriks awal, dan berisi nilai Eigen Value. Sedangkan matriks U dan V, merupakan
matriks persegi. Metode Pinv memberikan hasil model yang sangat mirip dengan model awal.
Metode Pinv memiliki nilai RMS error yang sangat kecil yaitu 1,3223 × 10−14 % nilai ini
jauh berbeda dengan nilai error yang didapatkan dari metode inversi Bi-CG yang menghasilkan
model hamper sama dengan metode PInv. Sedangkan untuk lama waktu prosesing, metode
Pinv membutuhkan waktu 0,087477 sekon.
Pada script yang dibuat diperoleh nilai Memory used by MATLAB yang semakin
meningkat untuk setiap metode yang dilakukan, di asumsikan hal ini dapat terjadi karena dari
metode ART hingga INV_SVD memerlukan perhitungan dan iterasi yang banyak serta
kompleks sehingga beban workload yang dibutuhkan akan memakan memori pada RAM.
Sedangkan waktu yang dibutuhkan untuk menyelesaikan setiap metode bervariasi dan tidak
memiliki trend naik maupun turun, lamanya waktu yang diperlukan pada suatu metode
bergantung metode bergantung pada banyaknya operasi perhitungan yang dilakukan metode
tersebut. Nilai Memory used by MATLAB dan waktu yang dibutuhkan setiap metode apabi;a
dilakukan running script akan selalu berubah, namun pada Memory used by MATLAB selalu
memiliki trend yang meningkat.
Dapat disimpulkan bahwa Memory used by MATLAB tidak dapat menjadi acuan yang
baku untuk melihat apakah program/script tersebut efisien.
24
3.9 Rekapitulasi Semua Metode
25
26
27
28
BAB IV
KESIMPULAN
Berdasarkan analisis yang telah dilakukan, dapat disimpulkan bahwa:
1. Untuk metode rekonstruksi, metode yang paling efisien adalah metode ART dengan
RMS error 0.014% yang diselesaikan dalam waktu 0.95 detik.
2. Untuk metode inversi, metod eyang paling efisien adalah metode pseudoinvers dengan
RMS error 1.3x10-14 yang diselesaikan dalam waktu 0.06 detik.
3. Penentuan efisiensi metode berdasarkan memori tidak dapat dilakukan, karena nilai
Memory used by MATLAB fluktuatif yang disebabkan memori pada RAM digunakan
secara bersamaan dengan OS (Operating System) sehingga memori yang dibutuhkan
untuk jalannya suatu metode tidak dapat dilihat secara langsung. Namun semakin
kompleks suatu program atau script maka resource memori (RAM) yang dibutuhkan
besar.
29
DAFTAR PUSTAKA
Gideon, S. (2015), Pembelajaran Simulasi Pencitraan Ct Dengan Menggunakan Prinsip
Monalia, P. (2011), Analisis Model Kecepatan Berdasarkan Tomografi Refleksi Waktu Tempuh
Oliveira, E.F., Melo, S.B., Dantas, C.C., Vasconcelos, D.A.A. dan Cadiz, F. (2011),
hal. 14.
Sihombing, W.L., Ratih N. A. C. Putri Pratama, Yosua H. Lumban Gaol, Istiqomah, Sasti, A.F.
http://doi.org/10.6084/m9.figshare.5946976.
Yuvashankar Vinay, Liu Ash dan Sayari Nejad Mojdeh (2016), Understanding the Bi
30
LAMPIRAN
Main Script
%Geotomografi B - Kelompok 5
%Simultaneous Iterative Reconstruction Technique_Ver. 03
%==========================================================================
%--------------------- 1. Inisiasi Parameter Model-------------------------
%==========================================================================
start=tic;
%======================== 1.a. Slowness Model==============================
%-------Input Parameter Model---------
X=(imread('fold_fix.bmp'));
X2= imresize(X,[15 15]);
v=double(X2);
sz_model=size(v);
31
SxSyRxRy(n_ray_hor:end,2)=1;
SxSyRxRy(n_ray_hor:end,4)=max(baris_s);
n_ray_hv = size(SxSyRxRy,1);
n_ray = size(SxSyRxRy,1);
disp(['Total number of rays : ' num2str(n_ray)])
%==========================================================================
%--------------- 2. Forward Modelling : Travel Time Calculation -----------
%==========================================================================
disp('-------------------------------------------------------')
disp(' ... Forward Modelling ...')
tic_forward=tic;
G = zeros(1,n_sel);
bobot = zeros(sz_model);
for a=1:n_ray
% disp('============================================================')
% disp(['Ray ke-' num2str(a)])
sx = SxSyRxRy(a,1);
sy = SxSyRxRy(a,2);
rx = SxSyRxRy(a,3);
ry = SxSyRxRy(a,4);
[koord,line]=f_lnrnt_imagesc_1b(sz_model,sx,sy,rx,ry);
plot(line(1:2),line(3:4),'-b')
hold on
for b=1:size(koord,1)
G(a,koord(b,3))=koord(b,end);
bobot(koord(b,3))=bobot(koord(b,3))+1;
end
end
figure
imagesc(bobot); colorbar
[n_ray]=size(G,1);
[n_ray]=size(G,1);
d = G*m;
toc_forward=toc(tic_forward);
disp(['Elapsed time : ' num2str(toc_forward) ' seconds'])
%==========================================================================
%----------------------- 3. Rekonstruksi Model ----------------------------
%==========================================================================
%%
[s_transform]=tomo_transform_1b_pcolor(s);
% close all
% [s_bpt,selisih_bpt,RMS_bpt]=tomo_bpt_2(s,sz_model,G,d);
32
%%
[s_bpt_mo,selisih_bpt_mo,RMS_bpt_mo]=tomo_bpt_monalia(s,sz_model,G,d);
%%
[s_art,selisih_art,RMS_art] = tomo_art7(s,sz_model,G,d,500,10^-5);
% close all, break
%%
[s_sirt,selisih_sirt,RMS_sirt] = tomo_sirt_4(s,sz_model,G,d,500,10^-5);
%%
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_transform), colorbar, title('Model Hasil
Transformasi')
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_bpt_mo), colorbar, title('Model Hasil BPT')
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_art), colorbar, title('Model Hasil ART')
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_sirt), colorbar, title('Model Hasil SIRT')
%==========================================================================
%----------------------------- 4. Inversi ---------------------------------
%==========================================================================
%Persamaan inversi linear adalah A.x=b
% A adalah [G'G+lambda*I].
% x adalah [m].
% b adalah [G'*d].
% lambda adalah faktor relaksasi, untuk membuat matriks A tidak singular,
% sehingga inversi bisa lebih stabil.
lambda = 0.1;
A = G'*G+lambda*eye(numel(m));
b = G'*d;
[s_bicg,flag_bicg]=inv_bicg(s,sz_model,A,b);
[s_lsqr,flag_lsqr]=inv_lsqr(s,sz_model,A,b);
[s_pinv]=inv_pinv(s,sz_model,G,d);
[s_svd]=inv_svd(s,sz_model,G,d);
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_bicg), colorbar, title('Model Hasil bicg')
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_lsqr), colorbar, title('Model Hasil lsqr')
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_pinv), colorbar, title('Model Hasil pinv')
figure
subplot(1,2,1), imagesc(s), colorbar, title('True Model')
subplot(1,2,2), imagesc(s_svd), colorbar, title('Model Hasil svd')
%==========================================================================
stop=toc(start);
disp('-------------------------------------------------------')
disp(['Total elapsed time : ' num2str(stop) ' seconds'])
% close all
33
Fungsi Garis
%WARNING : Posisi (Sx, Sy, Rx, Ry) harus merupakan bilangan cacah bulat !
%sz_model = ukuran model ([baris kolom])
%Sx = posisi source x (grid kolom berapa)
%Sy = posisi source y (grid baris berapa)
%Rx = posisi receiver x (grid kolom berapa)
%Ry = posisi receiver y (grid baris berapa)
model=ones(sz_model);
nomor_grid=find(model);
nomor_model=reshape(nomor_grid,sz_model);
if Sy==Ry %horizontal
if Sx<Rx
y1=Sy ; y2=Ry ; x1=Sx ; x2=Rx;
else
y1=Sy ; y2=Ry ; x1=Sx ; x2=Rx;
end
elseif Sx==Rx %vertikal
if Sy<Ry
y1=Sy ; y2=Ry ; x1=Sx ; x2=Rx;
else
y1=Ry ; y2=Sy ; x1=Rx ; x2=Sx;
end
else
if Sy<Ry && Sx<Rx %m>0
y1=Sy ; y2=Ry ; x1=Sx ; x2=Rx;
elseif Sy>Ry && Sx>Rx %m>0
y1=Ry ; y2=Sy ; x1=Rx ; x2=Sx;
elseif Sy>Ry && Sx<Rx %m<0
y1=Sy+1 ; y2=Ry-1 ; x1=Sx ; x2=Rx;
elseif Sy<Ry && Sx>Rx %m<0
y1=Ry+1 ; y2=Sy-1 ; x1=Rx ; x2=Sx;
end
x1=x1-0.5;
x2=x2+0.5;
y1=y1-0.5;
y2=y2+0.5;
end
line=[x1 x2 y1 y2];
m = (y2-y1)/(x2-x1);
teta = atand(m);
% disp(['SxSyRxRy = ' num2str(SxSyRxRy)])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% disp(['m = ' num2str(m)])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% disp(['teta = ' num2str(teta)])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% disp(['x1x2y1y2 = ' num2str(line)])
% disp(' ')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34
koord(:,1) = [x1:x2]';
koord(:,2) = [y1*ones((x2-x1+1),1)];
for i = 1:size(koord,1)
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,1)-0.5;
koord(i,5)=koord(i,1)+0.5;
koord(i,6)=1;
koord(i,7)=1;
end
s=sqrt((y2-y1)^2+(x2-x1+1)^2);
sigma_ds=sum(koord(:,7));
%==========================================================================
%===== Kondisi 2 : Garis Vertikal
%==========================================================================
elseif m==Inf %Garis vertikal
% disp('Kondisi 2 : Garis Vertikal')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
koord(:,1) = [x1*ones((y2-y1+1),1)];
koord(:,2) = [y1:y2]';
for i=1:size(koord,1)
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,2)-0.5;
koord(i,5)=koord(i,2)+0.5;
koord(i,6)=1;
koord(i,7)=1;
end
s=sqrt((y2-y1+1)^2+(x2-x1)^2);
sigma_ds=sum(koord(:,7));
%==========================================================================
%====== Kondisi 3 : KiBa - KaAt, cenderung ke x
%==========================================================================
elseif m<=1 && m>0 %Garis miring, cenderung miring ke sumbu x
% disp('Kondisi 3 : m>0 (Kiri Bawah <-> Kanan Atas); cenderung ke
x')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Penentuan titik
koord=zeros(1,7);
i=0;
for xi = x1:x2-1
i=i+1;
koord(i,1)=xi+0.5;
y_xi=m*(xi+0.5-x1) + y1;
y_kiri = m*(xi-x1) + y1;
y_kanan = m*(xi+1-x1) + y1;
yy(i,:)=[xi round(y_xi) y_kiri y_xi y_kanan];
35
koord(i,2)=round(y_xi);
% [koord(i,2)-y_kiri -(koord(i,2)-y_kanan)]
if (koord(i,2)-y_kiri<=0.5)&&(y_kanan-koord(i,2)<=0.5)
% disp('a')
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=y_kiri;
koord(i,5)=y_kanan;
elseif (koord(i,2)-y_kiri>0.5)
% disp('b')
koord(i,2)=koord(i,2)-1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=y_kiri;
koord(i,5)=koord(i,2)+0.5;
i=i+1;
koord(i,1)=xi+0.5;
koord(i,2)=round(y_xi);
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,2)-0.5;
koord(i,5)=y_kanan;
elseif (koord(i,2)-y_kiri<0)||(y_kanan-koord(i,2)>0.5)
% disp('c')
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=y_kiri;
koord(i,5)=koord(i,2)+0.5;
i=i+1;
koord(i,1)=xi+0.5;
koord(i,2)=round(y_xi)+1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,2)-0.5;
koord(i,5)=y_kanan;
end
end
koord(:,6)=abs(koord(:,5)-koord(:,4));
for i=1:size(koord,1)
koord(i,7)=koord(i,6)/sind(teta);
end
%==========================================================================
%===== Kondisi 4 : KaBa ke KiAt, cenderung ke x
%==========================================================================
elseif m>=-1 && m<0 %Garis miring, cenderung miring ke sumbu x
% disp('Kondisi 4 : m<0 (Kiri Atas <-> Kanan Bawah); cenderung ke
x')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Penentuan titik
koord=zeros(1,7);
36
i=0;
for xi = x1:x2-1
i=i+1;
koord(i,1)=xi+0.5;
y_xi=m*(xi-x1+0.5) + y1;
y_kiri = m*(xi-x1) + y1;
y_kanan = m*(xi+1-x1) + y1;
yy(i,:)=[xi round(y_xi) y_kiri y_xi y_kanan];
koord(i,2)=round(y_xi);
if (koord(i,2)-y_kanan<=0.5)&&(y_kiri-koord(i,2)<=0.5)
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=y_kiri;
koord(i,5)=y_kanan;
elseif koord(i,2)-y_kanan>0.5
koord(i,2)=koord(i,2)-1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=y_kiri;
koord(i,5)=koord(i,2)+0.5;
i=i+1;
koord(i,1)=xi+0.5;
koord(i,2)=round(y_xi);
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,2)-0.5;
koord(i,5)=y_kanan;
elseif (koord(i,2)-y_kanan<0)||(y_kiri-koord(i,2)>0.5)
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=y_kiri;
koord(i,5)=koord(i,2)+0.5;
i=i+1;
koord(i,1)=xi+0.5;
koord(i,2)=round(y_xi)+1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,2)-0.5;
koord(i,5)=y_kanan;
end
end
koord(:,6)=abs(koord(:,5)-koord(:,4));
for i=1:size(koord,1)
koord(i,7)=-koord(i,6)/sind(teta);
end
%==========================================================================
%======= Kondisi 5 : KiBa <-> KaAt; cenderung ke y
37
%==========================================================================
elseif m>1 && m>0 %Garis miring, cenderung miring ke sumbu y
% disp('Kondisi 5 : m>0 (Kiri Bawah <-> Kanan Atas); cenderung ke
y')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Penentuan titik
koord=zeros(1,7);
i=0;
for yi = y1:y2-1
i=i+1;
koord(i,2)=yi+0.5;
x_yi=1/m*(yi+0.5-y1) + x1;
x_bawah = 1/m*(yi-y1) + x1;
x_atas = 1/m*(yi+1-y1) + x1;
xx(i,:)=[yi round(x_yi) x_bawah x_yi x_atas];
koord(i,1)=round(x_yi);
% [koord(i,1)-x_bawah x_atas-koord(i,1)]
if (koord(i,1)-x_bawah<=0.5)&&(x_atas-koord(i,1)<=0.5)
% disp('a')
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=x_bawah;
koord(i,5)=x_atas;
elseif koord(i,1)-x_bawah>0.5
% disp('b')
koord(i,1)=koord(i,1)-1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=x_bawah;
koord(i,5)=koord(i,1)+0.5;
i=i+1;
koord(i,2)=yi+0.5;
koord(i,1)=round(x_yi);
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,1)-0.5;
koord(i,5)=x_atas;
elseif (koord(i,1)-x_bawah<0)||(x_atas-koord(i,1)>0.5)
% disp('c')
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=x_bawah;
koord(i,5)=koord(i,1)+0.5;
i=i+1;
koord(i,2)=yi+0.5;
koord(i,1)=round(x_yi)+1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i,1)-0.5;
koord(i,5)=x_atas;
end
end
koord(:,6)=abs(koord(:,5)-koord(:,4));
for i=1:size(koord,1)
koord(i,7)=koord(i,6)/cosd(teta);
end
38
% disp(['sigma_ds = '
num2str(sigma_ds)])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% disp(' x y index x_kiri x_kanan dx
ds')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%==========================================================================
%====== Kondisi 6 : KaBa <-> KiAt; cenderung ke y
%==========================================================================
%Penentuan titik
koord=zeros(1,7);
i=0;
for yi = y1:-1:y2+1
i=i+1;
koord(i,2)=yi-0.5;
x_yi=1/m*(yi-0.5-y1) + x1;
x_atas = 1/m*(yi-1-y1) + x1;
x_bawah = 1/m*(yi-y1) + x1;
xx(i,:)=[yi round(x_yi) x_bawah x_yi x_atas];
koord(i,1)=round(x_yi);
if (koord(i,1)-x_bawah<=0.5)&&(x_atas-koord(i,1)<=0.5)
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=x_bawah;
koord(i,5)=x_atas;
elseif koord(i,1)-x_bawah>0.5
koord(i,1)=koord(i,1)-1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=x_bawah;
koord(i,5)=koord(i,1)+0.5;
i=i+1;
koord(i,2)=yi-0.5;
koord(i,1)=round(x_yi);
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i-1,5);
koord(i,5)=x_atas;
elseif (koord(i,1)-x_bawah<0)||(x_atas-koord(i,1)>0.5)
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=x_bawah;
koord(i,5)=koord(i,1)+0.5;
i=i+1;
koord(i,2)=yi-0.5;
koord(i,1)=round(x_yi)+1;
koord(i,3)=nomor_model(koord(i,2),koord(i,1));
koord(i,4)=koord(i-1,5);
koord(i,5)=x_atas;
end
end
koord(:,6)=abs(koord(:,5)-koord(:,4));
for i=1:size(koord,1)
koord(i,7)=koord(i,6)/cosd(teta);
end
39
%Membandingkan jumlah ds dan s
s=sqrt((y2-y1)^2+(x2-x1)^2);
sigma_ds=sum(koord(:,end));
% disp(['s = ' num2str(s)])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% disp(['sigma_ds = '
num2str(sigma_ds)])%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% disp(' x y index x_kiri x_kanan dx
ds')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
% disp(koord) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
koord = koord;
% memory
40
Transformasi
function [p_transformasi]=tomo_transform_1b(p)
disp('---------------------------------------------------------------------
------')
disp(' ... Sedang proses transformasi. Harap Tunggu... ')
fprintf('\n WARNING : Ray dibuat ulang dengan arah lurus dan diagonal \n
simetris saja. Hal ini dimaksudkan agar bobot tiap grid \n merata semua
(tiap grid dilalui oleh jumlah ray yang sama. \n Sehingga ray yang ada
hanya ada 6 buah ray (tidak berdasar- \n kan forward yang ada di
"Rekonstruksi_Inversi_xx.m" \n \n')
tic
%Kalibrasi variabel
[zz,xx]=size(p);
dx=1;dz=1;
p_sel = zeros(zz,xx);
jumlah_tembak = 0;
figure
subplot(3,3,5), pcolor(p), title({'pcolor True Model (Slowness)'})
%---tembak ke kiri--
t_kiri = zeros(zz,xx);
L_kiri = zeros(zz,xx); %L adalah matriks yang berisi jarak yang ditempuh
raypath
siji = ones(1,xx);
for i = 1:zz
satu = zeros(zz,xx);
satu(i,:) = siji;
TT = sum(sum(p.*satu.*dx));
tt = satu.*TT;
t_kiri = t_kiri+tt;
ll = sum(sum(dx.*satu));
LL = satu.*ll;
L_kiri = L_kiri+LL;
p_avg_kiri = t_kiri./L_kiri;
p_sel_kiri = ll.*p_avg_kiri./L_kiri;
end
p_sel = p_sel+p_sel_kiri;
jumlah_tembak = jumlah_tembak+1;
subplot(3,3,4)
pcolor(t_kiri)
%---tembak ke atas--
t_atas = zeros(zz,xx);
L_atas = zeros(zz,xx);
siji = ones(1,zz);
for i = 1:xx
satu = zeros(zz,xx);
satu(:,i) = siji;
TT = sum(sum(p.*satu.*dx));
tt = satu.*TT;
t_atas = t_atas+tt;
ll = sum(sum(dx.*satu));
LL = satu.*ll;
L_atas = L_atas+LL;
p_avg_atas = t_kiri./L_atas;
p_sel_atas = ll.*p_avg_atas./L_atas;
end
p_sel = p_sel+p_sel_atas;
41
jumlah_tembak = jumlah_tembak+1;
subplot(3,3,2)
pcolor(t_atas)
%---tembak ke kanan--
t_kanan = zeros(zz,xx);
L_kanan = zeros(zz,xx);
siji = ones(1,xx);
for i = 1:zz
satu = zeros(zz,xx);
satu(i,:) = siji;
TT=sum(sum(p.*satu.*dx));
tt=satu.*TT;
t_kanan = t_kanan+tt;
ll = sum(sum(dx.*satu));
LL = satu.*ll;
L_kanan = L_kanan+LL;
p_avg_kanan = t_kanan./L_kanan;
p_sel_kanan = ll.*p_avg_kanan./L_kanan;
end
p_sel = p_sel+p_sel_kanan;
jumlah_tembak = jumlah_tembak+1;
subplot(3,3,6)
pcolor(t_kanan)
%---tembak ke bawah--
t_bawah = zeros(zz,xx);
L_bawah = zeros(zz,xx);
siji = ones(1,zz);
for i = 1:xx
satu = zeros(zz,xx);
satu(:,i) = siji;
TT=sum(sum(p.*satu.*dx));
tt=satu.*TT;
t_bawah=t_bawah+tt;
ll = sum(sum(dx.*satu));
LL = satu.*ll;
L_bawah = L_bawah+LL;
p_avg_bawah = t_bawah./L_bawah;
p_sel_bawah = ll.*p_avg_bawah./L_bawah;
end
p_sel = p_sel+p_sel_bawah;
jumlah_tembak = jumlah_tembak+1;
subplot(3,3,8)
pcolor(t_bawah)
ll = sum(sum(dx*sqrt(2).*satu));
42
LL = satu.*ll;
L_kananatas = L_kananatas+LL;
p_avg_kananatas = t_kananatas./L_kananatas;
p_sel_kananatas = ll.*p_avg_kananatas./L_kananatas;
end
p_sel = p_sel+p_sel_kananatas;
jumlah_tembak = jumlah_tembak+1;
subplot(3,3,3)
pcolor(t_kananatas)
ll = sum(sum(dx*sqrt(2).*satu));
LL = satu.*ll;
L_kiriatas = L_kiriatas+LL;
p_avg_kiriatas = t_kiriatas./L_kiriatas;
p_sel_kiriatas = ll.*p_avg_kiriatas./L_kiriatas;
end
p_sel = p_sel+p_sel_kiriatas;
jumlah_tembak = jumlah_tembak+1;
subplot(3,3,1)
pcolor(t_kiriatas)
p_transformasi=p_sel;
time=toc;
disp(['Elapsed time : ' num2str(time) ' seconds'])
disp(' ')
memory
43
BPT
function [s_bpt_mo,selisih,RMS]=tomo_bpt_monalia(s,sz_model,G,d)
tic
disp('---------------------------------------------------------------------
------')
disp(' ... Sedang proses BPT (Monalia). Harap Tunggu... ')
disp(' ')
if size(d,2)>1
d=d';
end
%Perhitungan RMS Error antara model hasil BPT dengan model asli
s_bpt_mo=reshape(m,sz_model);
selisih=abs(s_bpt_mo-s);
RMS = sqrt(sum(sum((selisih.^2)))/numel(m));
disp(['RMS error : ' num2str(RMS*100) '%'])
time=toc;
disp(['Elapsed time : ' num2str(time) ' seconds'])
disp(' ')
memory
44
ART
function [p,selisih,RMS] = tomo_art7(s,sz_model,G,tdata,iter_max,conv_tol)
tic
disp('---------------------------------------------------------------------
------')
disp(' ... Sedang proses ART. Harap Tunggu... ')
disp(' ')
if size(tdata,2) > 1
tdata = tdata';
end
[n,m] = size(G);
N = (sum((G.^2)'))';
p_lama = model';
% p_lama = zeros(m,1);
t_cal = G*p_lama;
p_baru=p_lama;
iter=1;
conv=1;
while iter<=iter_max && conv>conv_tol
for i = 1:n %Perhitungan per ray
delta_p = (((tdata(i)-t_cal(i))/N(i,:))*G(i,:)');
p_baru = p_baru+delta_p;
t_cal = G*p_baru;
end
conv = sum(sum((abs(p_baru-p_lama))))/numel(p_baru);
p_lama=p_baru;
iter=iter+1;
end
p = reshape(p_baru, sz_model);
%Perhitungan RMS Error antara model hasil ART dengan model asli
selisih=abs(p-s).^2;
RMS = sqrt(sum(sum(selisih))/numel(p));
time=toc;
disp(['RMS error : ' num2str(RMS*100) '%'])
disp(['Elapsed time : ' num2str(time) ' seconds'])
disp(['Convergency : ' num2str(conv) ])
disp(['Iterasi : ' num2str(iter-1) '(dari iter max : ' num2str(iter_max)
')'])
disp(' ')
memory
45
SIRT
function [p,selisih,RMS] = tomo_sirt_4(s,sz_model,G,tdata,n_iter,conv_tol)
disp('------------------------------------------------------------------')
disp(' ... Sedang proses SIRT. Harap Tunggu... ')
disp(' ')
if size(tdata,2)>1
tdata=tdata';
end
[n,m]=size(G);
G_sqr = G.^2;
L_ray=(sum(G'))';%Jumlah distance per ray
L_grid=sum(G)'; %Jumlah distance grid
p0=model';
t_iter=G*p0; %Menghitung data dengan model awal p0
p_lama=p0;
p_baru=p_lama;
iter=1;%Inisiasi parameter iterasi
conv=1; %Inisiasi parameter iterasi
delta_p=zeros(size(p_baru));
tic
while iter<=n_iter && conv>conv_tol
for k = 1:n %Perhitungan per ray
%Perbedaan dengan ART adalah update model dilakukan setelah semua
%ray selesai dihitung.
% delta_p = delta_p+((((tdata(k,1)-
t_iter(k,1))/L(k,:))*G(k,:))./L(k,:))';
delta_t = tdata(k,1)-t_iter(k,1);
delta_p = delta_p + (delta_t/L_ray(k,1)*G(k,:)');
end
delta_p = delta_p./L_grid;
p_baru = p_baru + delta_p;
t_iter = G*p_baru;
conv = sum(sum((abs(p_baru-p_lama))))/numel(p_baru);
p_lama=p_baru;
iter=iter+1;
end
time=toc;
p = reshape(p_baru,sz_model);
%Perhitungan RMS Error antara model hasil ART dengan model asli
selisih=abs(p-s).^2;
RMS = sqrt(sum(sum(selisih))/numel(p));
disp(['RMS error : ' num2str(RMS*100) '%'])
disp(['Elapsed time : ' num2str(time) ' seconds'])
disp(['Convergency : ' num2str(conv) ])
disp(['Iterasi : ' num2str(iter-1) '(dari iter max : ' num2str(n_iter)
')'])
disp(' ')
memory
46
Bi-CG
function [s,flag]=inv_bicg(s_true,sz_model,A,b)
tic
disp('---------------------------------------------------------------------
------')
disp(' ... Sedang proses bicg. Harap Tunggu... ')
disp(' ')
[x,flag]=bicg(A,b);
s=reshape(x,sz_model);
selisih=abs(s-s_true).^2;
RMS = sqrt(sum(sum(selisih))/numel(s));
time = toc;
disp(['RMS error : ' num2str(RMS*100) '%'])
disp(['Elapsed time : ' num2str(time) ' seconds'])
disp(' ')
memory
47
LSQR
function [s,flag]=inv_lsqr(s_true,sz_model,A,b)
tic
disp('---------------------------------------------------------------------
------')
disp(' ... Sedang proses lsqr. Harap Tunggu... ')
disp(' ')
[x,flag]=lsqr(A,b);
s=reshape(x,sz_model);
selisih=abs(s-s_true).^2;
RMS = sqrt(sum(sum(selisih))/numel(s));
time=toc;
disp(['RMS error : ' num2str(RMS*100) '%'])
disp(['Elapsed time : ' num2str(time) ' seconds'])
disp(' ')
memory
48
P_Inv
function [s]=inv_pinv(s_true,sz_model,G,d)
tic
disp('---------------------------------------------------------------------
------')
disp(' ... Sedang proses pinv. Harap Tunggu... ')
disp(' ')
pinvG = pinv(G);
s = pinvG*d;
s=reshape(s,sz_model);
selisih=abs(s-s_true).^2;
RMS = sqrt(sum(sum(selisih))/numel(s));
time=toc;
disp(['RMS error : ' num2str(RMS*100) '%'])
disp(['Elapsed time : ' num2str(time) ' seconds'])
disp(' ')
memory
49