Skrip MATLAB ini melakukan inversi tomografi seismik menggunakan metode Simulated Annealing untuk menentukan sudut tembakan terbaik dalam ray tracing antara sumber dan penerima gelombang seismik melalui tiga lapisan berbeda kecepatan."
Penyelesaian Raytracing dengan Bantuan Inversi Simulated Annealing
1. Pendahuluan
Seismik tomografi merupakan sebuah metode geofisika untuk mengetahui kondisi bawah
permukaan bumi berdasarkan data waktu tiba gelombang gempabumi (P dan S) yang terekam oleh
peralatan seismik (seismometer) yang tersebar di atas permukaan bumi. Hasil pengolahan dan
analisa gelombang tersebut akan memberikan gambaran struktur 3D interior bumi secara rinci.
Dalam melakukan pengolahan data tomografi dan permodelannya dikenal adanya istilah inversi
tomografi. Inversi tomografi sendiri merupakan tahapan dimana dari data travel time yang ada kita
berusaha memprediksi dan menentukan parameter-parameter model dari model bawah permukaan
bumi kita atau model inisiasi kita. Dalam proses inversi tomografi, salah satu poin penting yang tidak
bisa dilepaskan adalah bagaimana kita menghitung travel time kalkulasi melalui model kecepatan
yang ada. Untuk itu kita perlu untuk memprediksi jalur penjajakan sinar atau gelombang seismik
yang melewati model yang di-inisiasikan, proses tersebut sering disebut ray tracing. Seperti yang
sudah kita ketahui dari kuliah tentang Gelombang Dalam Geofisika bahwa gelombang mempunyai
banyak sifat dalam penjalarannya, dan itu mempengaruhi juga terhadap jenis ray tracing dalam
inversi tomografi ini. Adapun beberapa jenis metoda Ray Tracing yang biasa digunakan di inversi
tomografi :
Shooting methods [Snell’s Law, Born & Wolf, 1980]
Bending methods [Fermat’s Principle, Fermat, 1891]
Full wave equation methods [Huygen’s Principle, Huygen’s,1690]
Terinspirasi dari hal tersebut, dalam tugas besar ini saya mencoba menerapkan metoda inversi
geofisika dalam permasalahan inversi geofisika khususnya untuk ray tracing tomografi. Inti
programnya adalah tentang bagaimana metoda inversi non-linier dengan pendekatan global
membantu proses ray tracing dalam menentukan sudut tembak yang paling baik dalam
mendapatkan selisih jarak antara titik akhir ray dengan titik posisi receiver. Untuk metoda
inversinya, saya mencoba menerapkan apa yang diajarkan di kuliah Inversi Geofisika, yaitu tentang
metoda Simlated Annealing. Simulated Annealing atau yang sering disingkat SA merupakan salah
satu metoda guided random search atau pencarian acak terarah dengan mengadopsi persamaan
probabilitas Bolztmann. Sejauh yang saya mengerti metoda ini sangat baik untuk menentukan suatu
nilai minimum dari sebuah fungsi walau memang algoritmanya sedikit kompleks, namun secara
keseluruhan ia dapat menunjukan pencarian solusi dengan jelas dnegan menunjukan ama solusi
yang ditolak dan mana yang diterima. Untuk teori dasar dari metoda ini selengkapnya dapat dilihat
di Buku Pengantar Permodelan inversi Geofisika (Hendra Grandis). Selain SA saya juga berusaha
menerapkan metoda inversi lainya seperti, inversi linier berbobot untuk mencari parameter model
kecepatan yang nantinya akan digunakan dalam proses ray tracing. Diharapkan dengan metoda SA
ini didapatkan sudut tembak terbaik dan selisih jarak yang paling minimum dari proses ray tracing.
Metoda
Metoda yang digunakan dalam program ini adalah:
Konsep dasar sesimik tomografi cross-hole
Ray tracing dengan shooting methods
Konsep delay time tomografi
Konsep inversi linier berbobot objektif
Konsep inversi non-linier pendekatan global – Simulated Annealing
Adapun model yang saya inisiasikan untuk dilakukan inversi tomografi adalah sebagai berikut,
Source 2 buah
Receiver 3 buah
Geologi 3 lapisan dengan kecepatan berbeda yaitu 1000, 1200 dan 1500
Jarak 2 lubang bor adalah 100 m dan kedalam masing-masing 50 m
2. Untuk metoda inversi non-linier dengan pendekatan global – Simulated Annealing, arus kerja
program yang saya gunakan tidak berbeda jauh dengan apa yang diajarkan di kuliah Inversi
Geofisika. Adapun flowchart-nya adalah sebagai berikut,
Model Awal m0,
n=0, T awal
Perubasi model Penurunan T
m n+1
N
∆E = E(m n+1) –
E(m n) Y
Stop ? Solusi
Y Model Model
∆E <0 ?
m n = m n+1 mn
N
P = exp(-∆E/kT)
R=rand(1)
Y
R<P?
N
Dengan flowchart diatas dalam menjalankannya, saya memasuka beberapa parameter untuk
algoritma SA sebagai berikut,
Temperatur awal di T = 10.0
Temperatur iterasi berhenti ketika T = 0.02
= 0.98;
Persamaan penurunan suhunya adalah Tn = *T = 0.98*T
Iterasi maksimal di 1000 iterasi
Dalam suatu nilai T akan ada maksimal 100 iterasi
3. Sebuah solusi akan diterima sebanyak 30 kali sebelum iterasi penambahan temperatur
k=1
Sebenarnya saya mendefinisikan banyak sumber dan receiver. Ini diperlukan agar pada saat inversi
linier berbobot untuk menentukan kecepatan model dengan metoda inversi kasus yang kita punya
adalah dalam karakter under-determined. Namun untuk melakukan ray tracing dengan shooting
method saya menggunakan contoh ray tracing untuk source ke-1 yang berada di lapisan pertama
dengan receiver ke-3 yang berada di lapisan ketiga. Memang saya mengakui bahwa script yang saya
buat ini berjalan dengan sangat baik hanya ketika source dan receiver ada pada kondisi seperti itu,
jika diinginkan kondisi yang berbeda maka diperlukan pemrograman lebih expert untuk itu.
Sementara ini dengan keterbatasan kondisi seperti itu, mari kita liat script MATLAB-nya dibawah ini,
clc, clear all
%%% DEFINISIKAN PARAMETER YG DIKEHENDAKI (BENTUK MODEL)
x_hole_1 = 0; x_hole_2 = 100; y_hole = 50;
y_batas = [20 30 50]; % batas lapisan. SA: WAJIB 3 batas model
v_lap = [1000 1200 1500]; % parameter kecepatan lapisan model
sou_y = [5 10]; % posisi kedalaman source. SA: WAJIB diatas batas 1
rec_y = [5 25 40]; % posisi kedalaman receiver. SA: WAJIB kondisi
underdetermined
n_ray = length(sou_y) * length(rec_y);
fprintf('Jumlah ray adalah %d n',n_ray);
%%% FUNGSI TAMPILAN MODEL GEOLOGI
figure (1)
plot_model( x_hole_1,x_hole_2,y_hole,y_batas,v_lap,sou_y,rec_y );
%%% FUNGSI SKEMA GRID DAN SHOOT
figure (2)
plot_grid_shoot( x_hole_1,x_hole_2,y_hole,y_batas,sou_y,rec_y );
%%% FUNGSI HITUNG TIME MODEL (DIRECT)
[ pan_ray_total,d,G ] = dt_forward(
x_hole_1,x_hole_2,y_batas,v_lap,sou_y,rec_y );
%%% FUNGSI INVERSI KECEPATAN LINIER BERBOBOT
[ v0_linier,dv_linier,v_linier ] = inversi_linier(
d,n_ray,sou_y,rec_y,pan_ray_total,G );
%%% DEFINISIKAN PARAMETER OPERASI SA
T = 10.0; % temperatur awal
T_stop = 0.02; % temperatur berhenti
alpha = 0.98;
iter_max = 1000;
T_iter_max = 100; % batas maksimal jumalh iterasi dalam satu nilai T
solusi_iter_max = 30; % batas maksimal penerimaan solusi sebelum T diubah
k = 1; % konstanta
T_iter = 0; % nilai iterasi awal untuk temperatur
solusi_iter = 0; % nilai iterasi pencarian (penerimaan) solusi awal
iter = 1;
konvergensi = 0;
%%% PARAMETER NILAI SOLUSI AWAL --> TITIK AWAL
n = 1; % indeks source
m = 3; % indeks receiver
i = 1; % indeks sudut
% Inisiasi sudut tembakan dari source ke-n ke receiver ke-m
sudut_tembak = 80;
teta = sudut_tembak;
4. [ selisih,T1x,T2x,T3x,T1y,T2y,T3y ] = ray_tracing_snell( x_hole_1, ...
x_hole_2,y_batas,sou_y,rec_y,teta,v_linier,n,m );
dE = selisih;
dE_paling_awal = selisih;
% Mendefinisikan solusi terbaik
sudut_tembak_terbaik = sudut_tembak;
dE_terkecil = dE;
% Setting display grafik selisih tiap iterasi
figure(123); hold on;
title('Kurva Pencarian Sudut Tembak');
xlabel('Iterasi'); ylabel('Nilai Selisih Titik Akhir (dE)');
%%% MULAI PROGRAM
while konvergensi == 0 && iter <= iter_max
% Men-generate sudut_tembak baru dengan bilangan random distribusi
% Gauss
sudut_tembak_baru = sudut_tembak + (1-(2*rand(1)));
% Menghitung dE_baru dari sudut_tembak_baru
teta = sudut_tembak_baru;
[ selisih,T1x,T2x,T3x,T1y,T2y,T3y ] = ray_tracing_snell( x_hole_1, ...
x_hole_2,y_batas,sou_y,rec_y,teta,v_linier,n,m );
dE_baru = selisih; % @#$% user-defined
% Optimisasi
% Melihat penerimaan solusi/selisih baru
if dE_baru <= dE
% Backup data lama sebelum di-update
dE_lama = dE;
sudut_tembak_lama = sudut_tembak;
% Update
dE = dE_baru; % Penerimaan solusi
sudut_tembak = sudut_tembak_baru; % Penerimaan solusi
solusi_iter = solusi_iter + 1;
% Plot data selisih untuk iterasi ke-iter
figure(123); plot(iter,dE,'b.','MarkerSize',20);
plot_ray_tracing( x_hole_1,sou_y,T1x,T2x,T3x,T1y,T2y,T3y,n );
% Mengecek solusi terbaik
if dE_baru <= dE_terkecil
dE_terkecil = dE_baru;
sudut_tembak_terbaik = sudut_tembak_baru;
% Plot data selisih untuk iterasi ke-iter
figure(123); plot(iter,dE,'go','MarkerSize',10);
end
elseif exp((-dE_baru+dE)/(k*T)) > rand(1) % Probabilitas Boltzmann
% Back up data lama sebelum di-update
dE_lama = dE;
sudut_tembak_lama = sudut_tembak;
% Update
dE = dE_baru; % Penerimaan solusi
sudut_tembak = sudut_tembak_baru; % Penerimaan solusi
solusi_iter = solusi_iter + 1;
% Plot data selisih untuk iterasi ke-iter
figure(123); plot(iter,dE,'k.','MarkerSize',20);
plot_ray_tracing( x_hole_1,sou_y,T1x,T2x,T3x,T1y,T2y,T3y,n );
else
% Plot data selisih untuk iterasi ke-iter
figure(123); plot(iter,dE,'rx','MarkerSize',10);
5. end
pause(0.01);
% Update parameter iterasi program
T_iter = T_iter + 1;
iter = iter + 1;
% Melihat dan melakukan perubahan fungsi temperatur (T)
if T_iter >= T_iter_max || solusi_iter >= solusi_iter_max
T = alpha*T;
figure (3); hold on;
plot(iter,T,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
title('Kurva Penurunan Temperatur');
xlabel('Iterasi'); ylabel('Temperatur');
T_iter = 0;
solusi_iter = 0;
dE = dE_terkecil;
sudut_tembak = sudut_tembak_terbaik;
% Plot nilai temperaturnya
figure(123); plot(iter,dE,'ks-');
line([iter iter],[dE dE + 1],'Color','k');
text(iter,dE + 1,num2str(T),'Rotation',90);
end
% Parameter kriteria berhenti karena perubahan penurunan temperatur
% karena fungsi iterasi
if T < T_stop
konvergensi = 1;
end
end
%%% AKHIR PROGRAM
% Menampilkan hasil iterasi terbaik
fprintf('The best solution is sudut_tembak_terbaik= %6.4f n and
dE_terkecil= %6.4fn',sudut_tembak_terbaik, dE_terkecil);
% Plot raytracing dengan sudut tembak dan selisih terbaik
teta = sudut_tembak_terbaik;
[ selisih,T1x,T2x,T3x,T1y,T2y,T3y ] = ray_tracing_snell( x_hole_1, ...
x_hole_2,y_batas,sou_y,rec_y,teta,v_linier,n,m );
figure (2)
hold all
line([x_hole_1 T1x],[sou_y(n) T1y], ...
'Color','g','LineStyle','-','LineWidth',2)
line([T1x T2x],[T1y T2y], ...
'Color','g','LineStyle','-','LineWidth',2)
line([T2x T3x],[T2y T3y], ...
'Color','g','LineStyle','-','LineWidth',2)
Pada script diatas saya memasukan beberapa function script dengan tujuan untuk menghemat
tampilan line dan juga diharapkan dapat lebih mempercepat proses hasil dikarenakan banyaknya
looping yang digunakan untuk menjalankan program diatas. Berikut detail script dari semua function
script yang ada diatas,
1. Fungsi untuk membuat tampilan model geologi yang diinisiasikan
function [ PM ] = plot_model(
x_hole_1,x_hole_2,y_hole,y_batas,v_lap,sou_y,rec_y )
%%% TAMPILAN MODEL GEOLOGI
dgrid=0.05;
6. [x_lap,y_lap] = meshgrid(0:dgrid:x_hole_2,0:dgrid:y_hole);
kec_grid = zeros(size(x_lap));
kec_grid(1:(y_batas(1)/dgrid),:) = v_lap(1);
kec_grid((y_batas(1)/dgrid)+1:(y_batas(2)/dgrid),:) = v_lap(2);
kec_grid((y_batas(2)/dgrid)+1:(y_batas(3)/dgrid)+1,:) = v_lap(3);
contourf(x_lap,y_lap,kec_grid)
hold on
plot(x_hole_2,rec_y,'v','MarkerEdgeColor','k',...
'MarkerFaceColor','y',...
'MarkerSize',6)
hold on
plot(x_hole_1,sou_y,'p','MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
colormap(flipud(hot)); colorbar; set(gca,'ydir','reverse')
xlabel('Koordinat X (m)'); ylabel('Kedalaman (m)');
title('Tomography Cross-Hole')
end
2. Fungsi untuk menampilkan skema grid dan ray tracing shooting method-nya
function [ PGS ] = plot_grid_shoot(
x_hole_1,x_hole_2,y_hole,y_batas,sou_y,rec_y )
%%% TAMPILAN SKEMA GRID DAN SHOOT
%%% plot direct ray
dgrid=5; jgrid=(x_hole_2/dgrid); jgrid2=(y_hole/dgrid);
%for i=1:length(sou_y)
%for j=1:length(rec_y)
% line([x_hole_1 x_hole_2],[sou_y(i) rec_y(j)], ...
% 'Color','b','LineStyle','-','LineWidth',1.2)
%end
%end
hold all
%%% plot garis batas lapisan
for i=1:length(y_batas)-1
line([x_hole_1 x_hole_2],[y_batas(i) y_batas(i)], ...
'Color','r','LineStyle','-','LineWidth',2)
end
%%% parameterisasi blok
for i=1:jgrid-1
line([i*dgrid i*dgrid],[0 y_hole], ...
'Color','k','LineStyle','--')
end
for i=1:jgrid2-1
line([x_hole_1 x_hole_2],[i*dgrid i*dgrid], ...
'Color','k','LineStyle','--')
end
%%% plot titik source dan receiver
plot(x_hole_2,rec_y,'v','MarkerEdgeColor','k',...
'MarkerFaceColor','y',...
'MarkerSize',10)
plot(x_hole_1,sou_y,'p','MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10)
text(x_hole_1,sou_y(1),'SOURCE 1 rightarrow
','HorizontalAlignment','right')
text(x_hole_2,rec_y(1),' leftarrow RECEIVER
1','HorizontalAlignment','left')
7. text(x_hole_2,y_batas(1),' leftarrow BATAS LAP
1/2','HorizontalAlignment','left')
text(x_hole_2,y_batas(2),' leftarrow BATAS LAP
2/3','HorizontalAlignment','left')
xlim([0 x_hole_2]); ylim([0 y_hole])
set(gca,'ydir','reverse')
xlabel('Koordinat X (m)'); ylabel('Kedalaman (m)');
title('Tomography Cross-Hole')
end
3. Fungsi untuk menghitung forward modeling dalam mendapatkan data waktu dari model
kecepatan awal yang diinisiasikan
function [ pan_ray_total,d,G ] = dt_forward(
x_hole_1,x_hole_2,y_batas,v_lap,sou_y,rec_y )
%%% FUNGSI HITUNG TIME MODEL (DIRECT)
%%% menghitung panjang direct ray dari source ke receiver
n_ray = length(sou_y) * length(rec_y);
pan_ray_total = zeros(length(sou_y),length(rec_y));
for i = 1:length(sou_y)
for j = 1:length(rec_y)
pan_ray_total(i,j) = sqrt((x_hole_1-x_hole_2).^2 + ...
(sou_y(i)-rec_y(j)).^2);
end
end
%%% menghitung sudut tembak ray dari titik shoot
sudut_tembak = zeros(length(rec_y),length(sou_y));
for i = 1:length(sou_y)
for j = 1:length(rec_y)
sudut_tembak(i,j) = acosd((x_hole_2/pan_ray_total(i,j)));
end
end
%%% menghitung panjang tiap segmen ray yang melewati tiap blok
k = 1;
for i = 1:length(sou_y)
for j = 1:length(rec_y)
%%% dasar pembutaan syntax memakai simulasi shooting dari source 1
tikpot_bts1 = ((y_batas(1) - sou_y(i))/tand(sudut_tembak(i,j))) + x_hole_1;
pan_ray_bag(k,1) = sqrt((x_hole_1-tikpot_bts1).^2 + ...
(sou_y(i)-y_batas(1)).^2);
tikpot_bts2 = ((y_batas(2) - sou_y(i))/tand(sudut_tembak(i,j))) + x_hole_1;
pan_ray_bag(k,2) = sqrt((tikpot_bts1-tikpot_bts2).^2 + ...
(y_batas(1)-y_batas(2)).^2);
pan_ray_bag(k,3) = pan_ray_total(i,j) -
(pan_ray_bag(k,1)+pan_ray_bag(k,2));
%%% loop hubungan kondisi posisi source dan receiver
if (sou_y(i) < y_batas(1))&&(rec_y(j) < y_batas(1))
%%% direct ray di blok 1
pan_ray_bag(k,1) = pan_ray_total(i,j);
pan_ray_bag(k,2) = 0;
pan_ray_bag(k,3) = 0;
elseif (sou_y(i) < y_batas(1))&&(rec_y(j) > y_batas(1))&& ...
(rec_y(j) < y_batas(2))
pan_ray_bag(k,2) = pan_ray_total(i,j) - pan_ray_bag(k,1);
pan_ray_bag(k,3) = pan_ray_total(i,j) -
(pan_ray_bag(k,1)+pan_ray_bag(k,2));
elseif (sou_y(i) > y_batas(1))&&(sou_y(i) < y_batas(2))&& ...
(rec_y(j) < y_batas(1))
pan_ray_bag(k,2) = pan_ray_bag(k,1);
pan_ray_bag(k,1) = pan_ray_total(i,j) - pan_ray_bag(k,1);
8. pan_ray_bag(k,3) = pan_ray_total(i,j) -
(pan_ray_bag(k,1)+pan_ray_bag(k,2));
elseif (sou_y(i) > y_batas(1))&&(sou_y(i) < y_batas(2))&& ...
(rec_y(j) > y_batas(1))&&(rec_y(j) < y_batas(2))
%%% direct ray di blok 2
pan_ray_bag(k,1) = 0;
pan_ray_bag(k,2) = pan_ray_total(i,j);
pan_ray_bag(k,3) = 0;
elseif (sou_y(i) > y_batas(1))&&(sou_y(i) < y_batas(2))&& ...
(rec_y(j) > y_batas(2))
pan_ray_bag(k,1) = 0;
pan_ray_bag(k,2) = sqrt((x_hole_1-tikpot_bts2).^2 + ...
(sou_y(i)-y_batas(2)).^2);
pan_ray_bag(k,3) = pan_ray_total(i,j) -
(pan_ray_bag(k,1)+pan_ray_bag(k,2));
elseif (sou_y(i) > y_batas(2))&&(rec_y(j) < y_batas(1))
pan_ray_bag(k,3) = sqrt((x_hole_1-tikpot_bts2).^2 + ...
(sou_y(i)-y_batas(2)).^2);
pan_ray_bag(k,2) = pan_ray_bag(k,1) - pan_ray_bag(k,3);
pan_ray_bag(k,1) = pan_ray_total(i,j) -
abs(pan_ray_bag(k,2)+pan_ray_bag(k,3));
elseif (sou_y(i) > y_batas(2))&&(rec_y(j) > y_batas(1))&& ...
(rec_y(j) < y_batas(2))
pan_ray_bag(k,1) = 0;
pan_ray_bag(k,2) = sqrt((x_hole_1-tikpot_bts2).^2 + ...
(sou_y(i)-y_batas(2)).^2);
pan_ray_bag(k,3) = pan_ray_total(i,j) -
(pan_ray_bag(k,1)+pan_ray_bag(k,2));
elseif (sou_y(i) > y_batas(2))&&(rec_y(j) > y_batas(2))
%%% direct ray di blok 3
pan_ray_bag(k,1) = 0;
pan_ray_bag(k,2) = 0;
pan_ray_bag(k,3) = pan_ray_total(i,j) -
(pan_ray_bag(k,1)+pan_ray_bag(k,2));
end
k = 1 + k;
end
end
%%% menghitung matriks forward
dt_cal = pan_ray_bag * (1./v_lap');
for l = 1:length(sou_y)
d(l,:) = dt_cal((length(rec_y)*(l-1))+1:length(rec_y)*l,1);
end
G = pan_ray_bag;
end
4. Fungsi untuk mendapatkan kecepatan lapisan dengan metoda inversi linier berbobot
function [ v0_linier,dv_linier,v_linier ] = inversi_linier( ...
d,n_ray,sou_y,rec_y,pan_ray_total,G )
%%% FUNGSI INVERSI KECEPATAN LINIER BERBOBOT
%%% menghitung dt observasi linier
%%% dari time model yang didapat sebelumnya (d) tambahkan delta yg sangat
%%% kecil untuk melihat apakah bisa kembali atau tidak kecepatannya
%a = max(d);
%b = min(d);
%dt_noise = rand(1)*(a-b)*0.1;
t_obs = d; %+ dt_noise;
9. %%% membuat kecepatan awal model linier
vsem = zeros(length(sou_y),length(rec_y));
for i = 1:length(sou_y)
for j = 1:length(rec_y)
vsem(i,j) = pan_ray_total(i,j) ./ t_obs(i,j);
end
end
v0_linier = sum(sum(vsem)) ./ n_ray;
t_cal_linier = pan_ray_total ./ v0_linier;
%%% menghitung delta waktu (observasi - kalkulasi)
dt_linier = t_obs - t_cal_linier;
for l = 1:length(sou_y)
dt((length(rec_y)*(l-1))+1:length(rec_y)*l,1) = dt_linier(l,:);
end
%%% membuat matriks kernel
G_linier = G;
%%% memebuat bobot We berdasarkan misfit data
misfit = dt.^2;
We = (misfit).^-1;
%%% melakukan inversi untuk mendapatkan delta S
%m_linier = (inv(G_linier'*G_linier))*G_linier'*dt;
m_linier = (inv(G_linier'*diag(We)*G_linier))*G_linier'*diag(We)*dt;
%%% mencari kecepatan tiap blok dengan asumsi delta V >>
dv_linier = zeros(length(m_linier),1);
v_linier = zeros(length(m_linier),1);
for i = 1:length(m_linier)
dv_linier(i) = (-1*m_linier(i)*v0_linier^2) / (1 +
m_linier(i)*v0_linier);
v_linier(i) = v0_linier + dv_linier(i);
end
end
5. Fungsi untuk melaukan ray tracing dengan konsep Hk. Snell dengan sudut tembak yang telah
didefinisikan sebelumnya sehingga menghasilkan informasi akhir selisih jarak dengan posisi
receiver yang sebenarnya
function [ selisih,T1x,T2x,T3x,T1y,T2y,T3y ] = ray_tracing_snell( x_hole_1,
...
x_hole_2,y_batas,sou_y,rec_y,teta,v_linier,n,m );
%%% FUNGSI SHOOTING METHOD DENGAN HK. SNELL
%%% mendefinisikan variabel yang dipakai untuk SHOOTING SOURCE KE-n
sudut = (90 - teta);
v_snell = v_linier;
ray_shoot = zeros(1,3);
T1x = 0; T2x = 0; T3x = 0;
T1y = 0; T2y = 0; T3y = 0;
while T3x == 0
%%% menghitung ray tracing pada SHOOT SOURCE ke-n (Prinsip Phytagoras)
%%% menghitung panjang tiap segmen ray yang melewati tiap blok
%%% menghitung ray shooting pada kotak pertama
a1 = (y_batas(1) - sou_y(n));
c1 = a1 / cosd(sudut);
b1 = c1 * sind(sudut);
T1x = x_hole_1 + b1;
10. T1y = sou_y(n) + a1;
grad = (T1y - sou_y(n)) / (T1x - x_hole_1);
%%% menghitung sudut pergi/sudut datang ray pada kotak 2 dengan Hk. Snell
sudut2 = asind((v_snell(2) * sind(sudut)) / v_snell(1));
if abs(sudut2) > 90
sudut2 = 90;
if T1x > x_hole_2
T1x = x_hole_2;
T1y = sou_y(n) + (grad*T1x);
end
T2x = T1x;
T2y = T1y;
T3x = T1x;
T3y = T1y; break
end
%%% menghitung ray shooting pada kotak kedua
a2 = (y_batas(2) - T1y);
c2 = abs(a2 / cosd(sudut2));
b2 = abs(c2 * sind(sudut2));
T2x = T1x + b2;
T2y = T1y + a2;
grad2 = (T2y - T1y) / (T2x - T1x);
%%% menghitung sudut pergi/sudut datang ray pada kotak 3 dengan Hk. Snell
sudut3 = asind((v_snell(3) * sind(sudut2) / v_snell(2)));
if abs(sudut3) > 90
sudut3 = 90;
if T2x > x_hole_2
T2x = x_hole_2;
T2y = T1y + (grad2*(T2x - T1x));
end
T3x = T2x;
T3y = T2y; break
end
%%% menghitung ray shooting pada kotak ketiga
b3 = (x_hole_2 - T2x);
c3 = abs(b3 / sind(sudut3));
a3 = abs(c3 * cosd(sudut3));
T3x = T2x + b3;
T3y = T2y + a3;
ray_shoot(1,1)=(((T1x-x_hole_1).^2 + (T1y-sou_y(n)).^2).^0.5);
ray_shoot(1,2)=(((T2x-T1x).^2 + (T2y-T1y).^2).^0.5);
ray_shoot(1,3)=(((T3x-T2x).^2 + (T3y-T2y).^2).^0.5);
%%% menghitung selisih titik akhir (jarak ke receiver)
end
selisih = abs(T3y - rec_y(m));
end
6. Fungsi untuk memplot ray tracing dengan berbagai sudut tembak
function [ PRT ] = plot_ray_tracing(
x_hole_1,sou_y,T1x,T2x,T3x,T1y,T2y,T3y,n )
%%% FUNGSI PLOT GRAFIK 2D DENGAN RAY SHOOTING
%%% plot raytracing S-R dengan sudut tembak tertentu
figure(2)
hold all
line([x_hole_1 T1x],[sou_y(n) T1y], ...
'Color','m','LineStyle','-','LineWidth',1)
11. line([T1x T2x],[T1y T2y], ...
'Color','m','LineStyle','-','LineWidth',1)
line([T2x T3x],[T2y T3y], ...
'Color','m','LineStyle','-','LineWidth',1)
end
HASIL
Dari script diatas hasil atau output yang saya dapatkan adalah sebagai berikut, untuk model awal
geologi output tampilan ynag dihasilkan adalah sebagaimana yang ditunjukan oleh gambar berikut,
Dari model diatas dicoba dilakukan tomografi dengan menggunakan straight raypath (jalur sinar
lurus) untuk nantinya digunakan dalam melakukan forward modeling. Adapun output gambar dari
penembakan jalur sinar lurusnya adalah sebagai berikut,
12. Dari hasil ray tracing dengan straight raypath yang ditunjukan oleh gambar diatas, saya
mendapatkan panjang sinar tiap kotak kecepatan ynag kemudian saya jadikan data untuk matriks
kernel lalu dengan kecepatan model yang saya punya, saya coba dapatnya waktu kalkulasinya. Dari
waktu kalkulasi dan ditambah sedikit noise, dengan metoda inversi linier berbobot saya coba balikan
lagi untuk mendapatkan parameter model kecepatan untuk melihat apakan dengan metoda inversi
ini akan dapat memberikan hasil pencarian parameter yang mendekati atau sama dengan parameter
model ynag diinisiasikan.
Ternyata memang setelah dialkukan inversi, saya berhasil kembali mendapatkan kecepatan lapisan
yang sangat mirip dengan model kecepatan lapisan ynag didefinisikan sebelumnya yaitu ditunjukan
oleh gambar dibawah ini,
Kemudian kecepatan yang saya dapatkan tersebut akan saya gunakan untuk melakukan proses ray
tracing Hk. Snell dengan metoda SA. Sebagai contoh saya ambil source ke-1 dan receiver ke-3 serta
sudut tembak awal 80° dalam menjalankan program SA tersebut. Adapun hasil yang diberikan
dengan parameter yang telah didefinisikan sebelumnya adalah sebagaimana ynag ditunjukan oleh
gambar dibawah ini,
Gambar diatas menunjuka nilai selisih titik akhir ray dengan pencarian SA degan titik akhir
sebenarnya (posisi receiver 3) terhadap jumalh iterasi ynag dilakukan. Terlihat dari kurva diatas
13. bahwa metoda SA “menuntun” data untuk semakin memeberikan selisih yang minimum, dimana
walaupun memang datanya berfluktuasi namun secara garis besar trend yang diberikan menunjukan
bahwa semakin tinggi iterasinya, maka selisih yang dihasilkan semakin kecil/minimum. Hal ini sangat
jelas terlihat pada iterasi 1-250. Selebihnya data bergerak terus berfluktuasi sesuai dengan fungsi
penambahan parameter model sudut tembaknya sehingga hasil selisihnya pun sangat bervariasi
namun trend datarnya tetap sama. Fluktuasi yang terlihat sangat terarah ini saya analisa disebabkan
memang oleh algoritma dari SA sendiri dimana ada Probabilitas Boltzmann yang menyeleksi data
selisih mana yang bisa ditolak dan mana yang tidak bisa ditolak. Selain itu dengan SA juga saya dapat
mengetahui sudut tembak paling baik untuk menghasilkan selisih yang paling kecil.
Jika kurva tersebut lebih di-zoom maka akan tampak tampilan sebagai berikut,
Ttitik biru merupaka titik dengan nilai selisih yang diterima karena nilainya lebih kecil
dibandingkan dengan nilai selisih pada iterasi sebelumnya.
Titik biru dengan lingkaran hijau diluarnya merupakan titik dengan nilai selisih terbaik sejauh
itu, sejauh iterasi yang sudah berjalan.
Ttitik hitam menunjukan titik dengan nilai selisih yang diterima juga namun dalam hal ini
nilai selisihnya tidak lebih kecil dibandingkan dengan nilai selisih titik pada iterasi
sebelumnya, tetapi dengan “keberuntungan” pada probabilitas P(∆E) yang lebih besar
sehingga bilangan random akan jatuh pada posisi yang lebih kecil sehingga memungkinkan
solusi ini untuk diterima.
Sedangkan tanda silang merah menunjukan titik dengan nilai selisih yang ditolak karena
selisihnya tidak lebih kecil dibandingan selisih pada titik iterasi sebelumnya dan juga ia
memiliki probabilitas P(∆E) yang lebih kecil sehingga memungkinkan solusi untuk ditolak.
Dalam probalitas Boltzman terdapat parameter temperatur dan itu akan terus berubah seiring
dengan semakin banyaknya iterasi yang dijalankan dalam melakukan penerimaan data/solusi.
Adapun grafik kurva penurunan suhu hingga iterasi ke-1000 yang saya lakukan terhadap program
diatas adalah sebagai berikut,
14. Kemudian sebagai hasil akhir saya mendapatkan sudut tembak terbaik dan selisih yang paling kecil
dari 1000 iterasi adalah sebagai berikut,
Dengan output untuk penggambaran ray tracing yang dilakukan untuk berbagai sudut tembak
ditunjukan oleh gambar dibawah ini, (ray tracing yang paling baik ditunjukan oleh garis sinar yang
berwarna hijau)
15. Kesimpulan
Kesimpulan yang saya dapat adalah bahwa metoda inversi sangat membatu dalam menyelesaikan
permasalahan siesmik tomografi terutama untuk permodelannya dan juga ternyata berdasarkan dari
hasil percobaan, metoda Simulated Annealing berkerja dengan sangat baik dalam membantu
permasalahan raytracing shooting method untuk mencari sudut tembak terbaik. Metoda SA yang
saya lakukan pada kasus tomografi diatas berhasil memeberikan solusi sudut tembak terbaik yang
mana memberikan selisih titik akhir-receiver terkecil pula. Dilihat dari kemampuannya dalam
menentukan nilai minimum global dari sebuah fungsi, permasalahan, ataupun informasi dengan
sangat baik maka saya berpendapat metoda SA ini akan dapat digunakan untuk memecahkan
persoalan yang lain yang menginginkan mencari titik solusi minimum namun mempunyai bentuk
fungsi yang kompleks.
Ucapan Terimakasih
Saya sangat berterima kasih kepada buku kuliah Pengantar Permodelan Inversi Geofisika (Dr. Hendra
Grandis) dan slide kuliah Geotomografi (Dr. Andri Dian Nugraha) atas sumber puastaka dan inspirasi
dalam pembuatan laporan ini. Juga kepada Dr. Hendra Grandis sebagai dosen pembimbing mata
kuliah Inversi Geofisika atas bimbingan dan pengetahuan yang diberikan.