Setahun yang lalu, saya
menggambarkan stasiun cuaca dengan alat ukur untuk arah dan kecepatan angin. Berdasarkan pengalaman dua musim operasi, beberapa perubahan dan perbaikan dilakukan untuk itu, yang sebagian dijelaskan di sana sebagai tambahan pada teks utama.
Salah satu perubahan ini menyangkut perhitungan arah angin rata-rata. Yang mengherankan saya, saya tidak menemukan sesuatu yang masuk akal pada topik ini di Web, hanya di salah satu forum orang sendiri hampir memikirkan metode rata-rata vektor (tetapi hanya hampir, mereka tidak memecahkan masalah secara umum). Oleh karena itu, saya merasa berguna untuk meletakkan topik ini dalam publikasi terpisah - tiba-tiba orang lain akan berguna. Metode ini dapat digunakan untuk rata-rata jumlah vektor, tidak hanya angin atau arus.
Perhatikan bahwa metode kanonik untuk melakukan pengukuran meteorologi angin adalah sebagai berikut: rata-rata vektor (baik kecepatan dan arah) selama 10 menit (di Rusia dan sebagian besar negara di dunia diterima dengan cara itu, kata mereka, di AS dan beberapa negara lain berbeda). Dalam hal ini, pengukuran dilakukan pada ketinggian 10 m dari permukaan Bumi. Untuk memastikan semua ini di bawah kondisi lutut cukup sulit: seseorang tidak dapat mencapai ketinggian 10 m di ruang terbuka (jangan membangun menara khusus, jauh dari rumah dan pohon yang mengganggu aliran angin), dan suhu dengan kelembaban harus, sebaliknya, diukur di tempat teduh dan dekat dari permukaan. Sensor portabel diubah dari perangkat yang ringkas menjadi sistem pengukuran keseluruhan (lihat foto wilayah stasiun cuaca di kota Kirov).

Dan hasilnya - rata-rata 10 menit - akan sedikit informatif. Di dekat permukaan, angin jauh lebih kencang daripada di ketinggian, dalam 10 menit dapat mengubah kecepatan dan arah dua puluh kali, dan informasi tentang hembusan ini jauh lebih informatif bagi orang rata-rata daripada nilai rata-rata. Biarkan saya mengingatkan Anda bahwa sensor kecepatan di sini menunjukkan nilai maksimum empat pengukuran per siklus 8 detik, dan ini ternyata menjadi pilihan yang tepat (pada kenyataannya, kami mendapatkan sensor riak daripada sensor kecepatan rata-rata).
Tapi baling-baling cuaca ternyata lebih murung daripada sensor kecepatan. Menurut algoritma awal stasiun cuaca saya (yang dipilih berdasarkan penghematan energi maksimum yang mungkin), arah diukur sekali siklus, yaitu, bahkan denyut nadi tidak berhasil: ada sampel acak dari proses terus-menerus menggantung baling-baling cuaca bolak-balik dengan frekuensi jauh lebih besar daripada sekali setiap 8 dan lebih dari 16 detik.
Oleh karena itu, diputuskan untuk rata-rata arah vektor kecepatan per siklus, mengambil pengukuran setiap dua detik dan menghitung rata-rata. Dan masalahnya tidak sehingga bisa diselesaikan dengan setengah tendangan - nilai arah tidak membentuk array angka yang dapat ditambahkan dan dibagi secara langsung (satu kata adalah vektor, bukan skalar omong kosong). Biasanya sebuah contoh diberikan dengan nilai 1 derajat dan 359 derajat: mudah untuk mengetahui bahwa secara rata-rata 360 (atau 0, tidak ada perbedaan), tetapi aritmatika biasa akan memberikan angka 180 derajat.
Tidak perlu menemukan apa pun - semuanya telah ditemukan sebelum Anda. Masalahnya diselesaikan dengan metode rata-rata vektor, yang diketahui oleh mereka yang berurusan dengan pengukuran angin atau arus. Metode ini pada dasarnya sangat sederhana: karena kita tidak dapat secara langsung meratakan sudut, maka mari rata-rata proyeksi vektor pada sumbu koordinat, yang, menurut definisi, adalah nilai skalar, yaitu, dapat dikenakan aritmatika biasa tanpa pertanyaan.
Proyeksi vektor angin saat ini W '(apostrof memainkan peran superskrip) pada sumbu X dan Y adalah wx = Wa • cos (α) dan wy = Wa • sin (α), di mana Wa adalah modulus vektor (nilai kecepatan), dan α - nilai sudut antara vektor dan sumbu koordinat nol. Jika kita meratakan nilai-nilai proyeksi ini, dan kemudian mengkonversi rata-rata kembali ke vektor, maka kita mendapatkan nilai sebenarnya dari kecepatan rata-rata dan arah angin.
Catatan untuk sangat korosifUntuk rata-rata yang benar-benar benar dengan cara ini, perlu bahwa nilai Wa (nilai kecepatan) diukur secara ketat bersamaan dengan nilai sudut. Dalam praktiknya, ini harus dipantau hanya jika periode fluktuasi yang signifikan dalam amplitudo aliran kurang dari atau sebanding dengan waktu pengukuran. Untuk angin (dan untuk hampir semua kasus aliran air alami), biasanya tidak perlu dipantau, karena waktu pengukuran untuk kita adalah maksimum sepersekian detik, dan denyut angin yang signifikan, tentu saja, bertahan lebih lama. Kita dapat mengabaikan frekuensi aliran yang tidak homogen, karena mereka tidak mempengaruhi apa pun: kelembaman benda fisik nyata (termasuk sensor) jauh lebih besar daripada inhomogenitas ini, dan kita tidak akan merasakannya - secarik kertas akan bergetar, tetapi tidak lebih. Dalam kasus ekstrim, mereka akan keluar sebagai noise acak kecil yang tidak secara signifikan mempengaruhi kualitas pengukuran.
Metode yang luar biasa ini (sebut saja full vector averaging) memiliki satu kelemahan utama dari sudut pandang praktis: dengan tidak adanya subjek pengukuran (yaitu, ketika benar-benar tenang, yang merupakan kasus umum), ini memberikan hasil yang secara matematis salah: karena kecepatan angin nol, maka dan kedua proyeksi sama dengan nol, yang tidak mungkin (karena dosa dan cos adalah fungsi yang saling melengkapi). Lebih tepatnya, mungkin, tetapi pada dasarnya mustahil untuk mengekstraksi informasi dari situasi seperti itu. Apa yang ingin Anda tampilkan di layar? Sejujurnya, saya masih tidak tahu cara yang benar untuk mengatasi situasi ini (dalam flow meter yang pernah saya rancang, siklus rata-rata adalah berjam-jam, dan diyakini bahwa setidaknya beberapa pengadukan akan terjadi).
Tetapi dalam kasus kami, tugasnya, untungnya, lebih mudah - kita tidak perlu rata-rata kecepatannya, dan kita dapat melakukannya dengan satu proyeksi vektor, tanpa memperhitungkan besarnya modulnya. Dengan kata lain, seseorang dapat beroperasi dengan sinus murni dan cosinus, yang tidak pernah mengambil nol keduanya sekaligus: bahkan ketika tidak ada angin, baling-baling cuaca yang membeku di real estat menunjukkan beberapa arah. Kami menyebut metode semacam itu sebagai vektor yang disederhanakan dengan rata-rata arah (mungkin memiliki beberapa nama resmi, tapi saya tidak sadar).
Hanya ada satu kesulitan sekarang: mengubah nilai proyeksi rata-rata yang dihitung kembali ke nilai sudut. Untuk ini, fungsi α = arctan (sin (α) / cos (α)) biasanya digunakan, tetapi jika kita menghitung melalui fungsi trigonometri terbalik, maka lebih mudah untuk mengambil arcos (cos (α)) (atau arcsin (sin (α)), tetap), dan untuk melengkapi hasil ini untuk mendapatkan lingkaran penuh (mis., dari 0 hingga 359 derajat), menganalisis tanda-tanda proyeksi, Anda masih harus dalam hal apa pun: semua fungsi terbalik memberikan hasil dalam setengah lingkaran (dari 0 hingga 180 atau dari -90 hingga +90). (Lihat UPD tentang ini di akhir artikel.)
Kami meresmikan semua di atas menjadi algoritma nyata (dengan mengacu pada Arduino). Untuk memulainya, kita akan membaca petunjuk arah tidak setiap siklus, tetapi setiap pengukuran (setelah nilai frekuensi anemometer). Kami akan mengonversi hasilnya dalam kode Gray (di negara kami ini ditunjuk sebagai wind_Gray dari tipe byte, lihat
publikasi itu ) menjadi kode biner biasa, dan, seperti frekuensi anemometer, kami akan menempatkannya dalam array global, yang akan kami nyatakan sebagai wDirAvr [4], di mana 4 adalah jumlah pengukuran dalam siklus. Kami tidak akan mengecat konversi kode Grey empat digit menjadi kode biner - ini dapat dilakukan dengan beberapa cara sesuai kehendak programmer dan dijelaskan dalam referensi apa pun.
Kode biner ini akan mengambil nilai dari 0 hingga 15, dan kami setuju bahwa kami akan menghitung sudutnya, bukan sebagai geografer / topografi / navigator yang bergeser, tetapi sebagai orang normal yang mempelajari trigonometri di sekolah - berlawanan arah jarum jam. Yaitu, jika utara sesuai dengan nilai nol, maka 90 derajat bukan timur, seperti pada yang "bergeser", tetapi barat. Karena kita memiliki 16 gradasi arah, kita perlu mengalikan nilai kode dengan 22,5 (360/16) untuk mendapatkan arah dalam derajat busur biasa.
Sekarang algoritma aktual vektor disederhanakan rata-rata arah dari 4 nilai kode:
. . . . . float wSin=0; // sin float wCos=0; // cos float wind_Rad; // for (byte i=0; i<4; i++){ wind_Rad= ((float(wDirAvr[i])*22.5)*M_PI/180); // wSin=wSin+sin(wind_Rad);// sin wCos=wCos+cos(wind_Rad);// cos } // wSin=wSin/4;// sin – , wCos=wCos/4; // cos wind_Rad = acos(wCos); // arccos if (wSin<0) wind_Rad=2*M_PI-wind_Rad; // sin int wind_G = round ((wind_Rad*180/M_PI)/22.5); // 0-15 . . . . .
Baris terakhir yang kita konversi rata-rata, yang dinyatakan dalam radian, ke rata-rata, yang dinyatakan dalam kode kita dari 0 menjadi 15. Anda kemudian dapat mengubahnya kembali menjadi kode Gray, maka Anda bahkan tidak perlu mengubah program dalam modul utama untuk menampilkan arah.
Di sini, sebenarnya, adalah keseluruhan algoritma. Saya takut perhitungan cosinus-arcsin akan memperlambat controller Arduino yang lemah (hingga saat ini 32-bit), tetapi tidak ada yang terjadi: ia menelan kode tanpa berkedip ... LED, mungkin.
UPD : Untuk penulis, algoritme berfungsi dalam bentuk ini selama beberapa bulan tanpa kegagalan. Namun, para komentator menuntun saya pada kesalahan yang mungkin, walaupun sangat mustahil dalam praktiknya: jika data berisi dua kelompok pengukuran yang jaraknya kira-kira 180 derajat dari satu sama lain di dekat nilai nol kosinus (mis., Sekitar 90 dan 270 derajat), maka algoritma akan menghasilkan kesalahan nilai. Untuk menghindarinya, alih-alih acos (), gunakan fungsi atan2 (wSin, wCos), yang segera menghasilkan hasil yang benar dengan mempertimbangkan tanda sinus dan kosinus (terima kasih
asterster atas bantuannya). Garis di mana nilai rata-rata wSin dihitung harus dihapus, dan garis disesuaikan untuk tanda wSin tidak diperlukan. Sebagai gantinya, Anda perlu memasukkan gips ke nilai positif sudut (karena atan2 memberikan nilai dari pi ke -pi):
if (wind_Rad<0) wind_Rad=2*M_PI+wind_Rad;