Pelatihan Matlab Aplikasi Bidang Geofisika
Pelatihan Matlab Aplikasi Bidang Geofisika
Pelatihan Matlab Aplikasi Bidang Geofisika
Pelatihan MATLAB
Aplikasi Bidang Geofisika
Oleh :
Dr. Andri Dian Nugraha
Rexha Verdhora Ry, ST.
Waskito Pranowo, MT.
Indonesia merupakan negara yang berada pada daerah teknonik aktif. Gempa sudah
seharusnya menjadi hal yang biasa terjadi pada daerah ini. Selain gempa karena
aktifitas tektonik, gempa juga dapat terjadi dalam skala lokal seperti pada gunung
api, gempa mikro karena aktifitas injeksi pada lapangan migas, geothermal, CBM, dan
lainnya. Salah satu pengolahan data-data yang telah direkam dalam pengamatan
gempa adalah penentuan hiposenter. Hiposenter merupakan posisi sumber gempa
dalam 3 dimensi (x,y,z). Banyak metode dan algoritma yang telah berkembang dalam
penentuan dan relokasi hiposenter. Dalam pelatihan MATLAB ini kita akan membahas
beberapa metode dan algoritma dalam penentuan dan relokasi hiposenter, sebagai
berikut :
1. Grid Search
2. Random Search
3. Simulated Annealing (Guided Random Search)
4. Geiger
Grid Search
Langkah Membuat data sintetik
Diketahui :
1) Terdapat 5 stasiun dan 3 event gempa
Koordinat Stasiun :
St1 St2 St3 St4 St5
X 8.1212 6.1011 7.0149 0.922 4.2489
Y 3.7558 1.6615 8.3315 8.3864 4.5161
Z 0.9566 0.1472 0.8699 0.7694 0.4442
Posisi Hiposenter :
Random Search
clear,clc % by Rexha Verdhora Ry
close all
%% MODEL SINTETIK
%Menentukan parameter model sintetik
xh=1300; %koordinat titik hiposenter
yh=1550;
zh=-530;
vavg=5.1; %velocity rata-rata (km/s)
x=[700 2500 1500 1850]; %koordinat stasiun pada sumbu x
y=[1900 2000 2500 800]; %koordinat stasiun pada sumbu y
z=zeros(1,4); %koordinat stasiun pada sumbu z
(Grandis,2009)
%% MODEL SINTETIK
%Menentukan parameter model sintetik
xh=1300; %koordinat titik hiposenter
yh=2050;
zh=-1000;
vavg=5.1; %velocity rata-rata (km/s)
x=[700 1900 1200 1350]; %koordinat stasiun pada sumbu x
y=[2300 2000 3500 800]; %koordinat stasiun pada sumbu y
z=zeros(1,4); %koordinat stasiun pada sumbu z
for i=1:length(x)
tcal(i)=sqrt(((X-x(i))^2)+((Y-y(i))^2)+((Z-z(i))^2))/vavg;
end
dt=tobs-tcal;
E=dt*dt';
T=E;
k=0;
U=0;
Umax=100;
Lmax=100;
Amin=100;
h = waitbar(0,'Please wait...');
while U<=Umax
Lk=0;
Ak=0;
waitbar(U/Umax)
while Lk<Lmax && Ak<Amin
X1=Xmin+rand*(Xmax-Xmin);
Y1=Ymin+rand*(Ymax-Ymin);
Z1=Zmin+rand*(Zmax-Zmin);
for i=1:length(x)
tcal(i)=sqrt(((X1-x(i))^2)+((Y1-y(i))^2)...
+((Z1-z(i))^2))/vavg;
end
dt=tobs-tcal;
E1=dt*dt';
dE=E1-E;
Lk=Lk+1;
if dE<=0
HypoX=X1;
HypoY=Y1;
HypoZ=Z1;
E=E1;
Ak=Ak+1;
else
P=exp(-dE/T);
R=rand;
if R<P
HypoX=X1; % by Rexha Verdhora Ry
HypoY=Y1;
HypoZ=Z1;
HypoE=E1;
Ak=Ak+1;
end
end
end
if Ak==0
U=U+1;
else
U=0;
end
T=T*0.99;
k=k+1;
end
close(h)
( − )
=
( − ) +( − ) +( − )
( − )
=
( − ) +( − ) +( − )
= 1
%% Bagian 1
%MODEL SINTETIK
%Menentukan parameter model sintetik
xh=1300; %koordinat titik hiposenter
yh=2050;
zh=-1000;
vavg=5.1; %velocity rata-rata (km/s)
x=[700 1900 1200 1350]; %koordinat stasiun pada sumbu x
y=[2300 2000 3500 800]; %koordinat stasiun pada sumbu y
z=zeros(1,4); %koordinat stasiun pada sumbu z
%% Bagian 2
%INVERSI NON LINIER
%Menentukan parameter model awal
x0=700;
y0=1500;
z0=-700;
%Inversi non-linier
dm=inv(J'*J)*J'*dt; % by Rexha Verdhora Ry
figure(2)
plot3(x0,y0,z0,'*')
hold on
grid on
Rekonstruksi penjejakan sinar gelombang atau dikenal dengan ray tracing dibutuhkan
dalam menghitung waktu tempuh gelombang dari sumber ke stasiun penerima. Ray
tracing merupakan bagian penting dalam beberapa metode atau algoritma dalam
geofisika, seperti tomografi dan penentuan hiposenter. Dalam modul ini akan dibahas
beberapa metode ray tracing, seperti :
1. Straight
2. Shooting (Snell’s Law)
3. Bending (Fermat’s Principle)
Kita akan mencoba membangun algoritma sederhana untuk mengaplikasi metode-
metode ray tracing di atas. Model kecepatan yang digunakan 2 lapis dimana batas
lapisan tegak dengan kecepatan pada lapisan ini 1000 m/s dan 2000 m/s serta posisi
source (0,8) dan receiver (10,0).
Straight
%% Input Data & Parameter
% by Ahmad Syahputra
Source.X = 0;
Source.Y = 8;
Receiver.X = 10;
Receiver.Y = 0;
x0 = 0;
y0 = 0;
dx = 5;
dy = 10;
Xgrid = x0:dx:10;
Ygrid = y0:dy:10;
nx = length(Xgrid)-1;
ny = length(Ygrid)-1;
[Mesh.X Mesh.Y] =meshgrid(Xgrid,Ygrid);
Slowness = 1./Velocity;
TimeCalculation = LengthInBlock*Slowness';
%% Visualisasi
pcolor(Mesh.X,Mesh.Y,VelocityPlot)
set(gca,'Ydir','Reverse')
hold on
plot(Source.X,Source.Y,'*r')
hold on
plot(Receiver.X,Receiver.Y,'vb')
hold on
plot(RayPath.X,RayPath.Y,'c')
title('Straight Ray Tracing')
xlabel('Distance')
ylabel('Depth')
Shooting
%% Input Data & Parameter
% by Ahmad Syahputra
Source.X = 0;
Source.Y = 8;
Receiver.X = 10;
Receiver.Y = 0;
x0 = 0;y0 = 0;
dx = 5;dy = 10;
Xgrid = x0:dx:10;
Ygrid = y0:dy:10;
nx = length(Xgrid)-1;
ny = length(Ygrid)-1;
[Mesh.X Mesh.Y] =meshgrid(Xgrid,Ygrid);
ErrorMin = inf;
for i=1:length(SudutDatang)
dyy = tan(deg2rad(SudutDatang(i)))*dx;
if Source.Y > Receiver.Y
BatasLapisanY = Source.Y - dyy;
else
BatasLapisanY = Source.Y + dyy;
end
SudutTransmisi = sin(deg2rad(SudutDatang(i)))*Velocity(2)/Velocity(1);
dyy = tan(SudutTransmisi)*dx;
if Source.Y > Receiver.Y
ReceiverTempY = Source.Y - dyy;
else
ReceiverTempY = Source.Y + dyy;
end
ErrorDist = sqrt((Receiver.X-Receiver.X)^2+(ReceiverTempY-
Receiver.Y)^2);
if ErrorDist < ErrorMin
ErrorMin = ErrorDist;
RayPath.X = [Source.X BatasLapisanX Receiver.X];
RayPath.Y = [Source.Y BatasLapisanY ReceiverTempY];
end
end
%% Time Calculation
TimeCalculation = 0;
for i=1:length(RayPath.X)-1
TimeCalculation = TimeCalculation + sqrt((RayPath.X(i)-
RayPath.X(i+1))^2+(RayPath.Y(i)-RayPath.Y(i+1))^2)/Velocity(i);
end
%% Visualisasi
pcolor(Mesh.X,Mesh.Y,VelocityPlot)
set(gca,'Ydir','Reverse')
hold on
plot(Source.X,Source.Y,'*r')
hold on
plot(Receiver.X,Receiver.Y,'vb')
hold on
plot(RayPath.X,RayPath.Y,'c')
hold off
title('Shooting Ray Tracing')
xlabel('Distance')
ylabel('Depth')
colorbar
Bending
%% Input Data & Parameter
% by Ahmad Syahputra
Source.X = 0;
Source.Y = 8;
Receiver.X = 10;
Receiver.Y = 0;
x0 = 0;y0 = 0;
dx = 5;dy = 10;
Xgrid = x0:dx:10; Ygrid = y0:dy:10;
nx = length(Xgrid)-1; ny = length(Ygrid)-1;
[Mesh.X Mesh.Y] =meshgrid(Xgrid,Ygrid);
minTime = inf;
for i=1:length(BatasLapisanY)
Time1 = sqrt((Source.X-BatasLapisanX(i))^2+(Source.Y-
BatasLapisanY(i))^2)/Velocity(1);
Time2 = sqrt((Receiver.X-BatasLapisanX(i))^2+(Receiver.Y-
BatasLapisanY(i))^2)/Velocity(2);
TimeCalculation = Time1+Time2;
if TimeCalculation < minTime
minTime = TimeCalculation;
RayPath.X = [Source.X BatasLapisanX(i) Receiver.X];
RayPath.Y = [Source.Y BatasLapisanY(i) Receiver.Y];
end
end
%% Visualisasi
pcolor(Mesh.X,Mesh.Y,VelocityPlot)
set(gca,'Ydir','Reverse')
hold on
plot(Source.X,Source.Y,'*r')
hold on
plot(Receiver.X,Receiver.Y,'vb')
hold on
plot(RayPath.X,RayPath.Y,'c')
hold on
plot(BatasLapisanX,BatasLapisanY,'.w')
title('Bending Ray Tracing')
xlabel('Distance')
ylabel('Depth')
colorbar
Gaya Berat
Inversi Non-Linier Anomaly Bola
clear,clc % Rexha Verdhora Ry
close
%% MODEL SINTETIK
%Menentukan parameter model sintetik
G=6.67*10^(-11);
r=150;
noise=0.03;
rho=2500;
xbola=400;
zbola=650;
missfit(j)=sqrt((gfm-gobs)'*(gfm-gobs));
end
%Membuat plot model bola dari forward modeling
subplot(2,3,5)
plot(xh0,zh0,'r-')
title('Model per Iterasi')
xlabel('Jarak')
ylabel('Kedalaman')
hold on
grid on
axis ([0 1000 -1000 0])
for i=1:21
a=((x(i)-x0)^2+(z(i)-z0)^2)^(3/2);
g1(i)=G*(4/3)*pi*(r^3)*z0*rho/a;
end
gfm=10^5*g1'
%Membuat plot dari fit g observasi dengan g forward modeling
subplot(2,3,3)
plot(x,gobs,'r.')
hold on
plot(x,gfm,'-k')
title('Data Sintetik + Fit Forward Modeling')
xlabel('Jarak')
ylabel('Gaya berat (mgal)')
%Membuat plot model bola yang paling fit dari forward modeling
subplot(2,3,6)
plot(xh0,zh0,'r-')
title('Model hasil inversi')
xlabel('Jarak')
ylabel('Kedalaman')
grid on
axis ([0 1000 -1000 0])
Analisis Sinyal
Fourier Transform and Inverse Fourier Transform
Fourier Transform adalah transformasi sinyal dari domain waktu ke domain frekuensi atau dari
domain jarak ke domain bilangan gelombang. Untuk mengubah suatu sinyal dari domain waktu ke
domain frekuensi dapat dilakukan di MATLAB dengan cara:
Xf = fft(xt)
xt = ifft(Xf)
Dimana adalah sinyal pada domain waktu dan adalah sinyal dalam domain frekuensi. Pada
Fourier Transform, hasilnya akan terbagi 2 yaitu bilangan real dan imaginer dalam bentuk +
dimana adalah bilangan real, adalah bilangan imaginer, dan adalah unit imaginer (√−1).
Contoh soal:
% by Waskito Pranowo
dt = 0.002; % sampling rate in second
t = 0:dt:1; % time
xt = sin(2*pi*80*t) + cos(2*pi*40*t); % signal in time domain
figure('Color','w')
subplot(2,2,1)
plot(t,xt)
xlabel('Time (second)'), title('Signal in time domain')
subplot(2,2,2)
plot(f,Xamp)
xlabel('Frequency (Hz)'), title('Amplitude Spectrum')
subplot(2,2,3)
plot(f,Xreal)
xlabel('Frequency (Hz)'), title('Real Part')
subplot(2,2,4)
plot(f,Ximag)
xlabel('Frequency (Hz)'), title('Imaginary Part')
Tapering Function atau Apodization Function
Tapering function adalah sebuah fungsi yang digunakan untuk menjadikan nilai sinyal menurun ke
nol secara bertahap pada daerah tepi sinyal.
Beberapa contoh window/ tapering function (Sumber: Weisstein, Eric W. "Apodization Function."
From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/ApodizationFunction.html)
Jenis-jenis filter dapat dilihat di Help search: window.
Filter digunakan untuk mengambil bagian frekuensi yang kita inginkan dan membuang bagian
frekuensi yang tidak diinginkan.
Lowpass filter, meloloskan sinyal berfrekuensi rendah dan membuang sinyal berfrekuensi tinggi.
Highpass filter, meloloskan sinyal berfrekuensi tinggi dan membuang sinyal berfrekuensi rendah.
Bandpass filter, meloloskan frekuensi dalam rentang tertentu dan membuang frekuensi diluar
rentang tersebut.
%Filter Builder
f1 = fc(1);f2 = fc(2);f3 = fc(3);f4 = fc(4);
y = [zeros(1,f1) linspace(0,1,(f2-f1)+1)...
ones(1,f3-f2-1) linspace(1,0,(f4-f3)+1)...
zeros(1,1000/(2*dt*1000)-f4-1)];
F = linspace(0,1,length(y))/(2*dt);
figure
plot(F,y)
title('Filter in Frequncy Domain')
figure
plot(t,Y)
title('Filter in Time Domain')
Contoh soal:
%Filter Builder
f1 = fc(1);f2 = fc(2);f3 = fc(3);f4 = fc(4);
y = [zeros(1,f1) linspace(0,1,(f2-f1)+1)...
ones(1,f3-f2-1) linspace(1,0,(f4-f3)+1)...
zeros(1,1000/(2*dt*1000)-f4-1)];
F = linspace(0,1,length(y))/(2*dt); % Frequency
figure('Color','w')
plot(F,y)
title('Filter in Frequncy Domain')
Y= interp1(Ff,y2,Ff2);
figure('Color','w')
subplot(2,1,1)
plot(t,xt)
subplot(2,1,2)
plot(t,Xt)
Hilbert Transform
Hilbert transform digunakan untuk merotasi suatu sinyal sejauh 90°. Signal asli disebut sinyal real,
sedangkan yang telah dirotasikan 90° disebut sebagai quadrature.
y = hilbert(x)
q = -imag(y);
Dimana adalah sinyal real, adalah Hilbert transform dan adalah quadrature. Pada Hilbert
Transform, hasilnya akan terbagi 2 yaitu bilangan real dan quadrature dalam bentuk + dimana
adalah bilangan real, adalah bilangan quadrature, dan adalah unit imaginer (√−1). Walaupun hasil
dari Hilbert Transform memiliki format yang mirip dengan Fourier Transform, tetapi dan di sini
memiliki pengertian yang berbeda dengan Fourier Transform.
dt = 0.001;
t = 0:dt:0.5;
figure('Color','w')
subplot(3,1,1)
plot(t,x)
xlabel('Time (s)'), ylabel('Amplitude'), title('Real Signal')
ylim([-1.1 1.1])
subplot(3,1,2)
plot(t,q)
xlabel('Time (s)'), ylabel('Amplitude'), title('Quadrature Signal')
ylim([-1.1 1.1])
subplot(3,1,3)
plot(t,A)
xlabel('Time (s)'), ylabel('Amplitude'), title('Instantaneous Amplitude')
Convolution and Correlation
Sedangkan proses korelasi mirip dengan konvolusi tetapi tidak mengalami tahap pemutaran (tahap
nomor 1 dalam konvolusi).
clear,clc
x_1 = [1 3 5 2 7];
x_2 = [1 4 2 4 5];
% Konvolusi
Y1 = conv(x_1,x_2)
Y2 = conv(x_2,x_1)
% Korelasi
Z1 = xcorr(x_1,x_2)
Z2 = xcorr(x_2,x_1)
Hasil dari proses tersebut adalah:
Y1 =
1 7 19 32 42 67 47 38 35
Y2 =
1 7 19 32 42 67 47 38 35
Z1 =
5.0000 19.0000 39.0000 40.0000 66.0000 55.0000 27.0000 30.0000 7.0000
Z2 =
7.0000 30.0000 27.0000 55.0000 66.0000 40.0000 39.0000 19.0000 5.0000
Dapat dilihat bahwa pada proses konvolusi berlaku sifat komutatif, ∗ = ∗ , sedangkan pada
proses korelasi tidak berlaku sifat komutatif, ≠ .
1946, Dennis Gabor mengadaptasi Fourier transform untuk menganalisis bagian kecil suatu
sinyal pada waktu tertentu. Teknik ini disebut windowing sinyal. Adaptasi Gabor, disebut Short-
Time Fourier Transform (STFT), memetakan sinyal menjadi 2D antara waktu dan frekuensi.
(Matlab Help, 2008)
( , )= ( ) ( − )
∞
dimana ( ) adalah fungsi pada domain waktu dan ( ) adalah window. Window yang
digunakan dapat berbentuk boxcar atau tapering function lainnya. Gabor transform adalah ketika
STFT menggunakan Gaussian Window.
Aplikasi STFT dan Gabor Transform pada tugas ini diterapkan pada fungsi berikut,
dt = 0.002;
t = 0:dt:2;
for i = 1:length(t)
if t(i) < 0.5
x(i) = cos(2*pi*10*t(i));
elseif t(i) >= 0.5 & t(i) < 1
x(i) = cos(2*pi*50*t(i));
elseif t(i) >= 1 & t(i) < 1.5
x(i) = cos(2*pi*100*t(i));
else
x(i) = cos(2*pi*150*t(i));
end
end
figure('Color','w')
plot(t,x)
xlabel('Time (s)'), ylabel('Amplitude'), title('Signal in Time Domain')
[S,F,T] = spectrogram(x,100,90,length(x),1/dt);
figure('Color','w')
imagesc(T,F,abs(S))
xlabel('Time (s)'), ylabel('Frequency (Hz)')