看板 Visual_Basic 關於我們 聯絡資訊
請輸入專案類型(網站專案或者應用程式專案):應用程式專案 這是延續我之前問的那幾個問題的程式 我有用VB來算矩陣的加減乘法運算(後來做的,是不可或缺的部分) 不曉得有沒有人看過我在Ask版也問過的,關於Kalman濾波器 我在做的就是這個東西 到頭來我還是不瞭解原理,只能照著給我的規格流程來做 我做的這個東西分成兩個部分 一部分是模擬系統,一部分是參數預測(這部分就是Kalman濾波器負責的) 先丟一組預設的參數給模擬系統 模擬系統模擬完後的狀態丟給Kalman Kalman進行運算後得到新的參數再丟給模擬系統來做模擬 模擬系統的部分我大致完成了 但是產生新的參數時 大概在第60幾次左右會使得參數矩陣變成1.#QNAN這個值(型態是Double) 然後就會發生錯誤,因為這個值不能拿來運算 (但是很奇怪,產生這個數時卻沒有告訴我有錯誤) 我搜尋了一下都沒看到什麼可用的說明 只大概知道這是表示「浮點數的小數部分非實數」或是類似得概念 但是我覺得很奇怪 這個Kalman的運算中,只有乘法,加法,和減法的運算(雖然是矩陣的) 不管怎麼說,非實數這種東西不是要負數開根號才會出現嗎? 我的運算中,矩陣的內容完全沒有任何地方有開根號 那請問怎麼會出現這種錯誤呢? 我偵錯功力不夠好 對於這個濾波器又不瞭解 我實在無法理解為何簡單的加減乘除運算會產生非實數的結果 我這個運算又有亂數影響,導致每次出現錯誤的點都有點不同 沒辦法鎖定是第幾次一定會出錯 想請問這個錯誤有可能有其他途徑產生嗎? 我又要如何預防這個錯誤呢? 我也有看了有版友分享的關於浮點數的知識 但那好像跟我的情況又不太一樣(或許只是我不瞭解) 目前卡在這個地方好久了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.126.50.45
MOONRAKER:把每一步的各個變數印出來,看從什麼時候開始變成NaN 04/17 09:32
MOONRAKER:NaN表示發生underflow,而一發生之後就會蔓延 04/17 09:33
Peruheru:Underflow的話,有沒有辦法說在運算值捨棄過小的位數呢? 04/17 15:24
Peruheru:有點像是floor函數的感覺,有大值就只取大值不管太小的 04/17 15:26
Peruheru:小數 04/17 15:26
Peruheru:我現在只能苟且的將裡面造成溢位的元凶矩陣衰減 04/17 15:27
Peruheru:然後才能無事模擬完500次 04/17 15:27
Peruheru:但是我的衰減方式完全沒有數學根據(因為不懂Kalman...) 04/17 15:27
Peruheru:所以總覺得這樣模擬出來的結果大概也不會對 04/17 15:28
Peruheru:但是不衰減它就很容易大得不得了... 04/17 15:28
MOONRAKER:小心是underflow不是overflow喔,underflow是說浮點數 04/17 16:33
MOONRAKER:運算中產生低於目前有效位數的值,不過我也不清楚怎麼 04/17 16:33
MOONRAKER:解決 X( 04/17 16:33