Tujuan dari latihan ini adalah menyesuaikan model dengan beberapa data. Data yang digunakan dalam tutorial ini adalah data lidar dan dijelaskan secara rinci dalam paragraf pengantar berikut. Jika Anda tidak sabar dan ingin berlatih sekarang, silakan lewati dan langsung ke
pengantar
Sistem Lidar adalah pengukur jarak optik yang menganalisis properti cahaya yang tersebar untuk mengukur jarak. Sebagian besar dari mereka memancarkan impuls cahaya pendek ke arah target dan merekam sinyal yang dipantulkan. Sinyal ini kemudian diproses untuk mengekstrak jarak antara sistem lidar dan target
Sistem lidar topografi adalah sistem yang tertanam di platform udara. Mereka mengukur jarak antara platform dan Bumi, untuk menyampaikan informasi tentang topografi Bumi (lihat untuk detail lebih lanjut)
Palu, C. dan Bretar, F. Lidar Topografi Gelombang Penuh. Negara-of-the-Art. Jurnal Fotogrametri dan Penginderaan Jauh ISPRS 64(1), hlm. 1-16 Januari 2009 http. //dx. doi. org/10. 1016/j. isprsjprs. 2008. 09. 007Dalam tutorial ini, tujuannya adalah menganalisis bentuk gelombang yang direkam oleh sistem lidar. Sinyal seperti itu mengandung puncak yang pusat dan amplitudonya memungkinkan untuk menghitung posisi dan beberapa karakteristik target sasaran. Ketika jejak sinar laser sekitar 1m di permukaan bumi, sinar dapat mengenai beberapa target selama perambatan dua arah (misalnya tanah dan puncak pohon atau bangunan). Jumlah kontribusi setiap target yang terkena sinar laser kemudian menghasilkan sinyal yang kompleks dengan banyak puncak, masing-masing berisi informasi tentang satu target.
Salah satu metode canggih untuk mengekstraksi informasi dari data ini adalah menguraikannya dalam sejumlah fungsi Gaussian di mana setiap fungsi mewakili kontribusi target yang terkena sinar laser.
Oleh karena itu, kami menggunakan modul untuk menyesuaikan bentuk gelombang dengan satu atau sejumlah fungsi Gaussian
Memuat dan visualisasi
Muat bentuk gelombang pertama menggunakan
>>> import numpy as np >>> waveform_1 = np.load('intro/summary-exercises/examples/waveform_1.npy')
dan memvisualisasikannya
>>> import matplotlib.pyplot as plt >>> t = np.arange(len(waveform_1)) >>> plt.plot(t, waveform_1) [<matplotlib.lines.Line2D object at ...>] >>> plt.show() _
Seperti yang ditunjukkan di bawah ini, bentuk gelombang ini adalah sinyal sepanjang 80 bin dengan puncak tunggal dengan amplitudo kira-kira 30 dalam bin 15 nanodetik. Selain itu, tingkat kebisingan dasar sekitar 3. Nilai-nilai ini dapat digunakan dalam solusi awal
Menyesuaikan bentuk gelombang dengan model Gaussian sederhana
Sinyalnya sangat sederhana dan dapat dimodelkan sebagai fungsi Gaussian tunggal dan offset yang sesuai dengan kebisingan latar belakang. Untuk mencocokkan sinyal dengan fungsinya, kita harus
- tentukan modelnya
- mengusulkan solusi awal
- hubungi scipy.optimize.leastsq
Model
Fungsi Gaussian didefinisikan oleh
dapat didefinisikan dalam python oleh
>>> def model(t, coeffs): .. return coeffs[0] + coeffs[1] * np.exp( - ((t-coeffs[2])/coeffs[3])**2 )
di mana
- coeffs[0] adalah (berisik)
- >>> import matplotlib.pyplot as plt
>>> t = np.arange(len(waveform_1))
>>> plt.plot(t, waveform_1)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show()
0 adalah (amplitudo)
- >>> import matplotlib.pyplot as plt
>>> t = np.arange(len(waveform_1))
>>> plt.plot(t, waveform_1)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show()
1 adalah (tengah)
- >>> import matplotlib.pyplot as plt
>>> t = np.arange(len(waveform_1))
>>> plt.plot(t, waveform_1)
[<matplotlib.lines.Line2D object at ...>]
>>> plt.show()
2 adalah (lebar)
Solusi awal
Salah satu solusi awal yang mungkin yang kami tentukan dengan inspeksi adalah
>>> x0 = np.array([3, 30, 15, 1], dtype=float) _
Bugar
scipy.optimize.leastsq meminimalkan jumlah kuadrat dari fungsi yang diberikan sebagai argumen. Pada dasarnya fungsi untuk meminimumkan adalah residual (selisih antara data dan model)
>>> def residuals(coeffs, y, t): .. return y - model(t, coeffs)
Jadi mari kita dapatkan solusinya dengan memanggil dengan argumen berikut
- fungsi untuk meminimalkan
- sebuah solusi awal
- argumen tambahan untuk diteruskan ke fungsi
>>> from scipy.optimize import leastsq >>> t = np.arange(len(waveform_1)) >>> x, flag = leastsq(residuals, x0, args=(waveform_1, t)) >>> print(x) [ 2.70363341 27.82020742 15.47924562 3.05636228] _
Dan visualisasikan solusinya
fig, ax = plt.subplots(figsize=(8, 6)) plt.plot(t, waveform_1, t, model(t, x)) plt.xlabel('Time [ns]') plt.ylabel('Amplitude [bins]') plt.legend(['Waveform', 'Model']) plt.show() _
Komentar. dari scipy v0. 8 dan lebih tinggi, Anda sebaiknya menggunakan which mengambil model dan data sebagai argumen, jadi Anda tidak perlu mendefinisikan residu lagi