Matritsa operatsiyalarini qanday tez bajarish kerak

Ko'pincha sensor ma'lumotlari (yoki signal) bilan ishlaganda, biz ma'lumotlarning ko'pincha toza emasligini va sezilarli darajada shovqin ko'rsatishini topamiz. Bunday shovqin differensiallash, integratsiya, konvolyutsiya va boshqalar kabi keyingi matematik operatsiyalarni bajarishni qiyinlashtiradi. Bundan tashqari, agar biz avtonom avtomobilni boshqarish, robototexnikani boshqarish kabi signallarni real vaqt rejimida amalga oshirish uchun foydalanmoqchi bo'lsak, bunday shovqin katta qiyinchilik tug'diradi. qo'l yoki sanoat zavodi, chunki har qanday quyi oqimdagi matematik operatsiyalarda shovqin kuchayadi.

Bunday holda, umumiy yondashuvlardan biri shovqinni olib tashlash uchun ma'lumotlarni yumshatishdir. Biz avtonom transport vositalari yoki robotlarni aqlli boshqarish kabi boshqaruv injiniringidagi ilovalar uchun bunday ma'lumotlarni real vaqt rejimida tekislashga intilamiz. Signallarni real vaqt rejimida yumshatish uchun bir qator usullar allaqachon ishlab chiqilgan, masalan,Kalman filtri,Kengaytirilgan Kalman filtriva ularning variantlari. Biroq, Kalman filtrini loyihalash ma'lum yoki bo'lmasligi mumkin bo'lgan tizim dinamikasini bilishni talab qiladi. Bunday sharoitda eng oddiy usul - olingan oxirgi n ta ma'lumot nuqtasiningeng kichik kvadratlari polinomini moslashtirishni amalga oshirishdir.

Eng kichik kvadratlar polinomlarini moslashtirish matematikasi juda oddiy. nmaʼlumot nuqtalari toʻplamini koʻrib chiqing

Bunday holda, k tartibli polinom mosligi quyidagicha yozilishi mumkin:

Bu holda qoldiq tomonidan berilgan

Eng kichik kvadrat polinomni moslashtirishdan maqsadni minimallashtirishdir. Odatiy yondashuv koeffitsientlarga nisbatan 2-tenglamaning qisman hosilasini olishava nolga teng. Buk tenglamalar sistemasiga olib keladi. Bunday tenglamalar tizimi Vandermonde matritsasi tenglamalari sifatida chiqadi, ularni soddalashtirish va quyidagicha yozish mumkin:

Matritsa yozuvida 3-tenglamani quyidagicha yozishimiz mumkin

4-tenglamaniTni transpozitsiyaga oldindan ko‘paytirish yo‘li bilan yechish mumkin, shuning uchun yechim vektori shunday bo‘ladi.

Eng kichik kvadrat polinom mosligini amalga oshirish

Avval aytib o'tganimizdek, bu erda xavotirni qo'llash avtonom transport vositalari va robot qo'llari kabi xavfsizlik uchun muhim tizimlar bilan shug'ullanishi mumkin bo'lgan real vaqt tizimidir. Bunday tizimlar uchun maqsad odatda o'rnatilgan tizim bo'lganda amalga oshirish tezligi muhimdir. Demak, C++ da amalga oshirish uchun dasturlash tilining umumiy tanlovi. Ushbu maqolada biz 5-tenglamani yechish uchun C++ da yozilgan Eigen paketidan foydalanamiz.

Yengil avtomobil tezligi profilidan olingan namunaviy ma'lumotlar nuqtalari uchun quyida amalga oshirish kodi keltirilgan. Men faqat kub polinomini o'rnatdim. E'tibor bering, yuqori darajadagi polinomni o'rnatish qimmatga tushadi va umuman kerak bo'lmasligi mumkin.

Yuqoridagi dasturni kompilyatsiya qilish va ishga tushirish

Yuqoridagi kod Linux tizimi bilan yozilgan. Kompilyatsiya uchun zaruriy shart - bu C++ standarti 11 yoki undan yuqori bo'lgan g++yaxshiroq g++ 8 yoki undan yuqori kompilyatorning mavjudligi. Bundan tashqari, tizimda Eigen paketi o'rnatilgan deb taxmin qilamiz. Qiziqqan foydalanuvchi https://eigen.tuxfamily.org/dox/ dan Eigen paketi, 3-versiya tarballni yuklab olishi va uni kerakli papkaga chiqarishi mumkin. Mening holimda, Eigen to'plami 1-rasm va 2-rasmda ko'rsatilgandek ko'rinadigan katalog tuzilmasi bilan /usr/include/eigen3 da joylashgan. Eigen to'plami matritsa matematikasini juda tez bajarishga imkon beradi, bu real vaqt tizimlari uchun maqbuldir.

Eigen paketingizni sozlaganingizdan so'ng, siz g++ buyrug'i orqali eigen_polyfit.cpp dasturini kompilyatsiya qilishingiz va uni quyidagi tarzda bajarishingiz mumkin.

g++ -I /usr/include/eigen3 eigen_polyfit.cpp && ./a.out

Vizualizatsiya uchun men quyida ko'rsatilgan tarqalish sxemasini yaratdim:

Ko'rib turganingizdek, o'rnatilgan ma'lumotlar nuqtalari dastlabki ma'lumotlar nuqtalariga nisbatan yumshoqroq va biz uning hosilasi ham yumshoqroq bo'lishini kutishimiz mumkin.

Ma'lumotnomalar

  1. https://web.archive.org/web/20180527223004/http://dovgalecs.com:80/blog/eigen-how-to-get-in-and-out-data-from-eigen-matrix/
  2. "https://stackoverflow.com/questions/8443102/convert-eigen-matrix-to-c-array/29865019"
  3. https://iamfaisalkhan.com/matrix-manipulations-using-eigen-cplusplus/
  4. https://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html
  5. https://eigen.tuxfamily.org/dox/group__TutorialLinearAlgebra.html
  6. "https://stackoverflow.com/questions/40510135/map-two-dimensional-array-to-eigenmatrix"