Python pas kurva non linier

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. 007

Dalam 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

Python pas kurva non linier

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

Python pas kurva non linier

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
    Python pas kurva non linier
    (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
    Python pas kurva non linier
    (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
    Python pas kurva non linier
    (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
    Python pas kurva non linier
    (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()
_

Python pas kurva non linier

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

Bagaimana Anda menyesuaikan kurva nonlinier dengan Python?

Penyesuaian kurva non linier dengan python .
Piton disiapkan
Membaca dan memplot data
Paskan model pada data. Langkah pertama. fungsi. Tahap kedua. inisialisasi parameter. Langkah ketiga. Lakukan yang cocok. Langkah keempat. Hasil pas. Buat plot
Ketidakpastian pada x dan y. Tambahkan x ketidakpastian. Buat yang cocok. Plot hasilnya

Apa itu pemasangan kurva non linier?

Satu grup pemasangan kurva adalah linier dan grup lainnya dikenal sebagai pemasangan kurva non-linier. Jenis pemasangan kurva ini adalah metode untuk menemukan model non-linier untuk menemukan hubungan antara variabel dependen dan sekumpulan variabel independen .

Bagaimana Anda melakukan pencocokan kurva dengan Python?

data = kerangka data. nilai-nilai. .
x, y = data[. , 4], data[. , -1] # kecocokan kurva
popt, _ = curve_fit(objective, x, y) # meringkas nilai parameter
cetak('y = %. 5f * x + %. 5f' % (a, b)) # plot input vs output
pyplot. sebar (x, y).
x_line = arange(min(x), maks(x), 1).
y_line = tujuan(x_line, a, b)

Bagaimana Anda menjalankan regresi non linier dengan Python?

Mengimpor perpustakaan yang diperlukan .
x = np. atur (-5. 0, 5. 0, 0. 1) #Anda dapat menyesuaikan kemiringan dan mencegat untuk memverifikasi perubahan dalam grafik. .
x = np. atur (-5. 0, 5. 0, 0. 1) #Anda dapat menyesuaikan kemiringan dan mencegat untuk memverifikasi perubahan dalam grafik. .
plt. angka(figsize=(8,5))