我使用Matlab符號工具箱來創建高複雜度的函數。然後將此函數寫入.m文件(使用matlabFunction
)。出於某種原因,在簡化函數之後,該函數將返回到類似於fun = (A*1.329834759483753e310 + B*5.873798798237459e305 + ...)*7.577619127319697e-320
的表單上,其中A
和B
是我的變量的函數(在此處重複太複雜)。也就是說,括號內的所有術語約爲1e280到1e300。當指數大於1.79e308時會出現問題,因爲這會導致雙精度溢出(當調用生成的.m函數時)。函數的實際大小遠不及創建溢出,但這種表達函數的方式確實如此。如果簡化函數將1e-320乘以括號,則可以解決這個問題,但由於某些原因,它不會。Matlab符號表達式創建溢出
任何想法爲什麼符號工具箱選擇以這種方式表示我的功能?
我發現我可以打電話expand(fun)
將1e-320乘以括號。由此產生的表達式具有預期大小的指數(範圍在-1到-30之間),但我更願意知道表達式首先出現的原因,並且如果有更好的選擇而不是調用expand
來避免問題。此外,調用expand
似乎創建了比我所擁有的功能更復雜的功能,並且我試圖獲得一個在此處評估速度非常快的函數。
符號數學總是試圖精確地表示您的浮點數。如果你從2.3/5.7開始,經過幾次矩陣乘法和平方根之後,你就會有非常漂亮的浮點數,這將很難精確表示。這通常會導致符號函數中的大整數/整數常量常量,您的問題可能是相關的。如果一切都失敗了,你也可以嘗試讓這些係數符號化(如果可能的話),並最終將它們輸入到你的數值函數中。 –
@AndrasDeak你是對的漂浮物是這個原因。不幸的是,讓這些係數具有象徵性並不是一種選擇,因爲這會使計算速度太慢。 –