2015-11-30 28 views
1

我使用Matlab符號工具箱來創建高複雜度的函數。然後將此函數寫入.m文件(使用matlabFunction)。出於某種原因,在簡化函數之後,該函數將返回到類似於fun = (A*1.329834759483753e310 + B*5.873798798237459e305 + ...)*7.577619127319697e-320的表單上,其中AB是我的變量的函數(在此處重複太複雜)。也就是說,括號內的所有術語約爲1e280到1e300。當指數大於1.79e308時會出現問題,因爲這會導致雙精度溢出(當調用生成的.m函數時)。函數的實際大小遠不及創建溢出,但這種表達函數的方式確實如此。如果簡化函數將1e-320乘以括號,則可以解決這個問題,但由於某些原因,它不會。Matlab符號表達式創建溢出

任何想法爲什麼符號工具箱選擇以這種方式表示我的功能?

我發現我可以打電話expand(fun)將1e-320乘以括號。由此產生的表達式具有預期大小的指數(範圍在-1到-30之間),但我更願意知道表達式首先出現的原因,並且如果有更好的選擇而不是調用expand來避免問題。此外,調用expand似乎創建了比我所擁有的功能更復雜的功能,並且我試圖獲得一個在此處評估速度非常快的函數。

+0

符號數學總是試圖精確地表示您的浮點數。如果你從2.3/5.7開始,經過幾次矩陣乘法和平方根之後,你就會有非常漂亮的浮點數,這將很難精確表示。這通常會導致符號函數中的大整數/整數常量常量,您的問題可能是相關的。如果一切都失敗了,你也可以嘗試讓這些係數符號化(如果可能的話),並最終將它們輸入到你的數值函數中。 –

+0

@AndrasDeak你是對的漂浮物是這個原因。不幸的是,讓這些係數具有象徵性並不是一種選擇,因爲這會使計算速度太慢。 –

回答

1

大的指數乘數可能是由於公式中的一些浮點數。儘量避免它們並使用有理數(1/2而不是0.5)。

我讀過的最好的理由是this one

浮點數往往會得到轉化爲有理數,這通常涉及通過2^53相乘,然後從頂部分解出GCD和比例的底部。廣場這樣的價值,你正在處理2^100的數量...等等。

+0

你說得對,因爲這是漂浮物。我嘗試用合理的近似值來替換浮點數(通過使用rat()),但似乎這些合理性也太複雜,因爲問題依然存在。 –

+0

您可以拆分公式並查看哪個部分會導致這種複雜性。此外,你可以在你的問題上給予賞金,因爲它沒有引起太多的關注。你會對你的問題有更多的意見。 – marsei