牛頓法是解決方案的核心。 這是維基百科的定義: 牛頓法是一種逼近真實和複雜領域中方程式的方法。 此方法使用函數 f (x) 的泰勒級數的前幾項來求方程式 f (x) = 0 的根。 所以牛頓法就是迭代x直到x收斂到一個小範圍
因此,對於任何一元函數,都可以用牛頓法求出它的近似解。 如果誤差小於 10^-9 或迭代步數超過 10^5,則終止迭代。
在建立求解器時,有一些重要問題需要解決。 輸入表達式解析、函數表達式、函數方程式推導、函數代入和求值。 其中,當務之急是:如何儲存(表示)函數?
為什麼選擇這種二元表達式樹呢?主要是因為它是一種方便節點遞歸的樹結構。 後面我們會用遞歸的想法推導出一個包含代入和求值思想的函數。
表達式預處理:首先,我們需要對輸入的表達式字串進行預處理。 因為這裡有一些簡單或冗長的數學描述需要標準化,當一個自然輸入的字符串經過預處理後,就變成了一個中綴字符串,人類可以自然理解的表示增加。 但是,要將表達式儲存為二元樹,還需要將中綴表達式轉換為後綴表達式
調度場演算法:度場演算法基本上類似 Stack Recursive Hanoi 如何使用堆疊來計算公式。 用佇列表示輸出後綴表達式,用堆疊儲存運算子和函數
建立二元樹:假設輸入表達式為(a + b) * (c * (d + e))。 經過調度域演算法,得到a b + c d e + * *的後綴公式。 此時,可以使用後綴表達式特徵快速建立二元表達式樹。
評估:分配和評估二元樹的演算法應該很容易想出。 利用二元樹的遞歸特性,根是一個運算子或函數,遞歸定義左右子樹。 它只是遞歸地計算左右子樹的值並進行算子運算。
建立導數函數樹:只剩下求解導數函數的步驟。 由於微分函數規則較多,這一步也是比較複雜的運算。 首先,表達式推導函數應該用二元表達式樹來表示。 這是因為它們可以直接求值和賦值,而且二元表達式樹具有遞歸的特性。 二、二元表達式樹的根節點永遠是函數的屬性,左右子樹也是表達式,可以用遞歸的思想來解微分函數