Latest Posts

Tutorial Inversi menggunakan Continuous Genetic Algorithm



Hello digital world,

Setelah kemarin saya membuat forward modelling untuk menghitung waktu tiba, sekarang tinggal metode inversinya gimana..

Intro


Oke sebelumnya, menurut klasifikasi saya sendiri metode inversi / optimisasi ada 2 :

1. Pakai derivatif / hessian / jacobian. 
Contoh : Mahzab Least-Square : Levenberg-Marquard, Gauss Newton,etc. 
Metode ini bagus buat yang forward enginenya lama menghitungnya karena bisa selesai dalam iterasi yang relatif singkat. Bagus juga untuk parameter skala besar. 
Selama ini sih kendala saya cuma di bagian menghitung derivatifnya itu sendiri.

Yang pernah saya coba : Occam, LM, Gauss Newton.

2. Nggak pake derivatif. 
Contoh : Mahzab Monte Carlo, Simulated Annealing, dan Genetic Algorithm (Evolutionary Programming).
Metode ini bagus, nggak perlu repot-repot untuk menghitung derivatif dan solusi yang dicari adalah Global Solution diantara constrain parameter yg ditentukan (artinya nggak terjebak di local minima suatu fungsi saat inversi).
Kendala yang saya temuin menggunakan metode-metode tipe ini ya untuk handling parameter yang banyak kurang efektif (misal ratusan/ribuan). Selain itu, kalau forward operatornya lama, pakai yang jenis ini nggak efektif (biasanya butuh sampai ratusan iterasi sekali inversi);

Yang pernah saya coba :VFSA, simple GA, Monte carlo.

Dari metode-metode diatas, yang akan saya coba buat sekarang adalah jenis ke 2, dimana masuk ke dalam Mahzab jenis Genetic Algorithm. Genetic Algorithm (GA) adalah algoritma komputasi yang terinspirasi dari teori evolusi yang kemudian diadopsi untuk mencari solusi suatu permasalahan optimisasi / inversi. Lebih spesifiknya, yang saya akan buat adalah Continous Genetic Algorithm. Sumbernya dari :

Carr, J. 2014. Introduction to Genetic Algorithm.

Kenapa iseng pengen nyobain ini? Karena gak umum banget! Biasanya inversi metode GA itu seluruh parameter dalam kromosom (istilah model parameter dalam Genetic Algorithm) yang dibuat dalam bentuk Binary, jadi gak perlu coding-decoding nilai variabelnya.
 

Continous Genetic Algorithm

Supaya lebih paham prosesnya, saya jelaskan dalam bentuk sebuah kasus Curve Fitting atau mencari persamaan dari sebuah kurva.
Misal kita punya data sebagai berikut :

















Kita ketahui bahwa bentuk dari persamaan parabola adalah :

F(x)=a.x²+b.x²+c

berarti parameter yang akan kita cari lewat inversi adalah a, b, & c !

Step 1. Buat Populasi

Pada awalnya kita perlu deklarasi secara random sebuah populasi yang terdiri dari sekelompok parameter yang saya namakan individu (dalam simple GA, disebut kromosom, supaya lebih paham saya sebut individu). Saya tentukan satu populasi isinya 12 individu. Nilai parameter tiap individu dibuat batas minimum dan maksimum yang kita tentukan.
Masing-masing parameter tadi dimasukkan ke persamaan parabola, lalu nilai F(x) dihitung. Dihitung selisih F(x) dengan data (error) lalu dibuat ranking mana individu dengan error paling kecil.



Step 2. Survival of the fittest

Setengah dari populasi dengan nilai fittest/error tertinggi akan dieliminasi dari populasi.



Step 3. Kawin <3

Kekosongan individu pada populasi akan diisi oleh anak hasil kawin dari individu-individu yang bertahan. Individu-individu yang kawin ditentukan secara random dengan pembobotan yang dihitung menggunakan persamaan :

Nkeep = Jumlah survivor; n= ranking individu





Eh...


Kok ini ada kawinnya dua kali ya...

Hohoho.. You bad boy..


Oke, lupakan, kembali ke topik, parameter dari anak didapat dari kedua orang tua yang saling kawin. Kalau di Simple GA kita lakukan dengan crossing chromosome biner, maka di metode CGA ini dilakukan dengan dua rumus berikut :

Xd=parameter ayah, Xm= parameter ibu, Beta=angka random antara 0 sd 1.

Sehingga pada generasi berikutnya kita dapatkan populasi baru :



Step 4. Mutasi Anak hasil Kawin

Pada anak hasil dari perkawinan tiap individu juga dimungkinkan untuk terjadi mutasi, yaitu perubahan nilai dari suatu variabel dengan range antara batas nilai parameter yang ditentukan di awal. Tujuannya agar pencarian nilai parameter tidak mentok di local minima.

Langkah-langkah di atas diulangi kembali sampai sejumlah generasi/iterasi yang dibutuhkan atau sampai nilai error kecocokan data observasi dan data teoritis rendah.

TESTING

Ok, berikut hasil yang telah saya coba. Kira-kira grafiknya seperti berikut. Saya coba hanya dengan 50 iterasi/generasi sudah cukup memuaskan.



























So, thats it.
Apakah akan saya aplikasikan ke First Arrival Time Tomography? Mbuh. Nek selo paling. 

aaaand berikut code matlabnya.



See ya,

L


Perhitungan Waktu Tiba Gelombang Seismik dengan Least-Time Path Fast Marching Method


 

Hello Digital World!


Kali ini saya mencoba membuat program pemetaan waktu tiba gelombang seismik.

Loh? Buat apa emangnya? Penting?

Well, cuma iseng sih.. hasrat komputasi geofisika saya masi-

Nggak, maksud saya itu petanya buat apa..

Oh.. *malu*. Banyak.. Migrasi seismik dan Tomografi yang paling umum pake ini buat forward enginenya.
Ok, Sebelumnya untuk menghitung peta waktu tiba (traveltime) ini ada banyak metode. Dari paper-paper yang saya baca kira-kira dikelompokan sebagai berikut :
1. Ray tracing : shooting method & bending method yang terkenal. (Um & Thurber (1987)). Yang paling unik Huygens Wavefront tracing.
2. Eikonal : diselesain pakai finite-difference, Vidale (1988), berkembang jadi FMM, GMM.
3. Wavefront Construction.
4. Hybrid : gabungan eikonal, ray trace , atau interpolasi dll

dan yang terakhir, metode paling absurd saya buat, least robust and time consuming..

5.  Numerical Simulation terus hasil rekaman di autopick. Selo banget uripku biyen jaman golek kerjo.

Kembali ke topik utama,
Metode yang saya buat ini termasuk jenis hybrid yang menggabungkan perhitungan dari ray-tracing + finitedifference, ditambah cara bergeraknya fast marching.


Eksperimen pertama saya coba dengan parameter kecepatan 1000 m/s. Ukuran 50x50 grid dengan sampling jarak dx=1 m. Perlu waktu sekitar 30 detik untuk dihitung. Hasilnya sebagai berikut dengan perbandingan perhitungan analitik juga :







Kira-kira proses perhitungan Fast Marchingnya seperti ini :




Oke selanjutnya saya coba membuat peta traveltime dengan model kecepatan 3 lapis.





Fiuw, that's it. Lumayan lah. Mungkin kedepannya akan untuk mainan inversi-inversian. Entah itu tomografi atau migrasi.

Ok, that's it.

See ya,

L






Hiatus (?)

Hello Digital World,


Lama nih gak ngeblog, karena memang lagi sibuk simulasi numerik kampus gitu deh, mana ditambah ngerjain paper + poster hagi. Lalu jobseeking gitu deh, nyobain pertamina, schlumberger, haliburton, dll. Susah juga ya cari kerjaan? hahaha

So, untuk self-challenge selanjutnya saya mencoba membuat perhitungan waktu tiba (traveltime) 3D dengan menggunakan Group Marching Method untuk update value-nya. Berarti eikonal solver gitu mas? Nope, saya mencoba menggunakan Biliniear Interpolation untuk interpolasi waktu tiba tiap grid-nya. Susah sih, makanya lama nih belum selesei2..
Niatnya kalau bisa jadi, mau saya aplikasikan ke Tomografi.

Well, yang jelas untuk postingan mendatang saya akan membahas sekitar itu..
Lama gak ngepost = emang lama bikin programnya (hehe)


REVISI :
ternyata saya keterima kerja. 6 bulan pelatihan, pas sudah diangkat malah banyak game-game bagus rilis gitu deh. so.. :p

see ya,

L

Crosshole Traveltime Tomography without Ray metode LSQR dan extra Tikonov orde 1


Hello digital world :)



Lama juga ya saya tidak nge-blog. Seperti biasa saya disibukkan riset di kampus dan sedikit sekali waktu buat eksperimen komputasi, sampai-sampai saya mencuri waktu disela tugas sambil membuat program ini. Awalnya saya tertarik gara-gara paper berjudul "Traveltime tomography of crosshole radar data without ray tracing". Point yang menarik dari paper ini adalah :

- Forward untuk tomography tidak melulu menggunakan ray-tracing. Bisa pakai eikonal, bisa selesaikan rumus propagasi gelombang lalu dipick.  Untuk kasus seismik saya coba menggunakan forward engine dari skripsi saya yang sudah menggunakan kartu grafis untuk komputasi paralel (CUDA C). Program forward 2D saya berbasis  FDTD elastik Virieux dan CPML komastich.

- Matriks Jacobi tidak perlu dihitung tiap iterasi! Ya! :) Saya juga kaget ternyata ada caranya untuk estimasi jacobi dari iterasi awal dengan menggunakan metode Broyden. Dengan ini waktu inversi jadi lebih singkat.
 

Oke, sekarang kita coba hajar, inversi yang saya gunakan adalah LSQR standar tanpa roughening matrix (cuma matriks identitas) dan pakai tikhonov orde 1. Loh kok gak pakai roughening matrix juga? iyasih untuk parameter skala besar sering tidak aman, tapi ya dicari hasil yang aman saja hehe (ubah-ubah parameter awal inversi) :p

DESAIN SURVEY
Oke jadi semisal saya punya daerah survey dengan estimasi perambatan gelombang seperti ini :

Ray Coverage

Testing forward dulu~


Berikut hasilnya untuk tiap model-model unik yang saya ujikan :

MODEL 1

True Model 1
No smoothing
  
Tikhonov 2nd

Well, hasil di atas menunjukkan lebih cantik hasil inversi yang menggunakan tikhonov regulation. 


MODEL 2


True Model 2

No Smoothing

Tikhonov 2nd (gak memuaskan)

Yup, model yang agak kompleks hasilnya kurang memuaskan jika diberi smoothing/roughening matrix. Mungkin cukup susah dalam mencari nilai parameter yang smooth pada model kompleks seperti itu.

Well that's it. Susah juga ya optimisasi skala besar. Ini baru dua dimensi, belum 3 dimensi hehe.

See ya,

L



Inversi 1D Occam Magnetotellurik

Hello Digital World,

Beberapa waktu lalu saya sempat posting tentang nonlinearitas dari fungsi forward dalam magnetotelluric yang hasil inversinya menunjukkan multi solusi hanya dari sebuah data pengukuran. Well, kali ini saya akan mencoba membuat jenis inversi lain untuk fungsi forward magnetotelluric ini yang namanya Occam[1].



Occam ini salah satu metode inversi Linearized aka Least Square aka kelompok metode inversi ribet yang harus ngitung matriks jacobi mana sering singular nyebelin bikin inversi gagal.

Occam Inversion
Dasarnya sih mirip dengan metode Levenberg-Marquardt aka Damping Gauss-Newton. Hanya saja kita tambahkan parameter delta untuk smoothing (regulasi tikonov orde 1)[3] :


dan update parameternya :


dimana m merupakan parameter yang akan diestimasikan, J matriks jacobi, alpha adalah damping parameter dan d adalah selisih data estimasi dan data pengukuran.

Bagaimana cara membuatnya?
- Pertama kita perlu membuat forward operator-nya yang dapat dilihat di appendix[1]. Ternyata simpel ya?

- Lalu, membuat matriks Jacobi aka Sensitivitas-nya. Apa itu matriks Jacobi? ya matriks dari fungsi forward yang seperti ini :


Ada opsi 3 metode dalam membuat matriks Jacobi [2] :
1. Adjoint equation,
2. Sensitivity equation (Appendix setelah forward MT [1]),
3. Pertubation aka Numerical method.




Saya sih lebih suka menggunakan yang metode numeris (karena malas membuat program analitiknya yang lebih ribet dari forwardnya haha~).
Metode numeris yang saya gunakan adalah forward difference :
 
Rumus dan Skemanya
- Selesaikan rumus update parameter Occam secara iterative. Paling bagus setiap iterasi dibuat multiple damping parameter dan dipilih RMS error yang lebih kecil.


Kira-kira contoh hasilnya seperti ini untuk data sintetik :



Well, kenapa ya harus dibuat smooth ? Setelah program ini saya buat jadi sedikit dapat pencerahan maksud dari Om Constable membuat Occam. Pernah mendengar Occam's Razor ?



Dari pernyataan Occam tersebut, maksud Om Constable membuat metode Inversi Occam ini (dan mungkin asal penamaan metode inversinya juga) adalah mencari solusi paling simpel lewat bentuk model yang smooth (meskipun tidak super fit dengan data pengukuran) untuk menghindari kasus overparameterized seperti pada postingan saya sebelumnya. Maksud saya disini bukan berarti metode lain salah, tetapi metode ini merupakan salah satu opsi untuk menghindari kasus "ke-lebay-an" hasil inversi yang sedang kita tidak harapkan pada suatu pengolahan

So that's it. Lain kali saya update dengan programnya, masih belum rapi nih.

See ya,
-L

Referensi:
[1] Constable, S.C., R.L. Parker, and C.G. Constable, 1987: Occam's Inversion: a practical algorithm for generating smooth models from EM sounding data, Geophysics, 52, pp. 289-300.
[2]  P.  R. McGILLIVRAY and D. W. OLDENBURG. 1990. Methods for calculating Fréchet derivatives and sensitivities for the non-linear inverse problem: a comparative study. Geophysical Prospecting.
[3]  Pei, Donghong, Ph.D. 2007. Modeling and inversion of dispersion curves of surface waves in shallow site investigations. UNIVERSITY OF NEVADA, RENO.

Asisten IESO 2014 (lagi..)

Hello digital world,




Kemarin tanggal 13-18 Maret 2014, Saya, Theo, dan Putri Portugal menjadi asisten praktek lagi untuk pelatihan olimpiade SMA yang rencananya akan maju di IESO (International Earth Science Olympiad) 2014 di US kalau tidak salah. Seperti tahun sebelumnya, lokasinya di Hotel University, bedanya perwakilan dosen dari geofisika cuma Pak Afif dan Pak Eddy karena Pak Herlan sibuk ke Jerman rumornya.

Jadwal kegiatan untuk sesi Geofisika seperti tahun sebelumnya, 3 hari kelas, 1 hari lapangan, dan 1 hari ujian seleksi. Saya kali ini dapat bagian mengajarkan metode refraksi dan geolistrik. Hal-hal yang diajarkan pun masih simpel, baru asumsi lapisan datar untuk refraksi, dipole-dipole untuk geolistrik. 

Sesi lapangan sesuai ide Pak Eddy, saya ajak anak-anak tersebut profiling 2D menggunakan dipole-dipole di depan Lab Geofisika yang teduh dan kebetulan Pohon Taloknya sedang berbuah hehe. Lintasan yang mereka buat hanya 20 meter dengan a=1 m dan mereka udah bilang capek, hehe yasudahlah namanya cuma hanya untuk pemahaman.

Selain kegiatan belajar, menurut saya makan malam merupakan acara yang menarik juga, pada saat itu saya sempat berkenalan dengan dosen dan mahasiswa Astronomi ITB, ramah-ramah orangnya.




Sepertinya itu saja yang bisa diceritakan. Well, semoga sukses semua deh buat mereka, Aamiin :)

See ya,

L

Inversi 1D Magnetotelurrik menggunakan metode VFSA

Hello Digital World,


First of all, nonlinearity is a b*tch.
Yap, fungsi-fungsi asumsi dalam metode-metode geofisika itu memang nonlinear, saya baru tau maksud dari bercandaan "kalau orang geofisika ditanya 1+1 pasti bakal dijawab, 'Anda maunya berapa?' " setelah saya membuat beberapa program inversi seperti gravitasi dan MT1D ini.  

Jadi ceritanya saya merampungkan project mt1d dengan teman saya theo yang sebenarnya untuk suatu lomba dua tahun silam (tapi karena ada kegiatan lapangan batal deh). Acuan yang saya pakai menggunakan metode forward yang sama dengan buatan Pak Hendra Grandis*, sedangkan untuk inversinya saya menggunakan metode Very Fast Simulated Annealing (VFSA) besutan Ingber (1989).

Kenapa saya menggunakan VFSA?
Ya menurut saya dalam menyelesaikan masalah inversi perlu dilihat dulu berapa jumlah parameter model yang diinversikan dan lama proses perhitungan forwardnya. Jika parameter < 200 jenis (dipost selanjutnya mungkin akan saya jelaskan kenapa saya berpendapat seperti ini melalui experimen dengan problem simpel) dan waktu untuk forward sebuah model kurang dari 30 detik metode random walk semacam monte carlo dan simulated annealing opsi yang baik, dimana anda tak perlu repot-repot menghitung matriks jacobi dan stress apabila terjadi singularitas.

Hasilnya?
Error kecil tapi model beda dari hasil forward awal. Yup, super ultimate mega nonlinear deh. Bisa dilihat hasil 3 kali running untuk suatu data sintetik dengan model yang sama tetapi hasilnya berbeda.
(Jumlah parameter = 21 (11 nilai rho dan 10 ketebalan lapisan) )

Test 1

Test 2

Test 3

Baru ini, belum seismik haha.. Man gotta dream like never seen obstacles~

Berikut program matlabnya jika ingin dipakai :
forward: mt1dfor2.p
inversi : MT_1D_Inversill.m

*Referensi : H. Grandis, M. Menvielle, M. Roussignol. Bayesian inversion with Markov chains—I. The magnetotelluricone‐dimensional case

see ya
- L