化學工程過程導論/數值求根方法
求根是指確定單變數方程或n元n次方程組的解(前提是存在這樣的解)。該方法的基礎是圍繞根的確定。
函式 的根,定義為方程 的解。為了使用本節中的任何數值方法,方程應以特定形式表示,這是其中最常用的形式之一,除了迭代方法外,所有方法都使用這種形式。
然而,將函式轉化為這種形式很容易。如果你從形式為
的方程開始,那麼減去 將得到所需的形式。即使只有一邊是常數,也不要忘記這樣做!
示例:
如果你想使用本節後面的二分法來求方程 的一個解,你應該將方程改寫為 ,以便將其置於正確形式。
由於任何方程都可以轉化為這種形式,因此這些方法可能應用於任何函式,儘管它們對某些函式比其他函式更有效。
方程或方程組的解析解是指可以透過一些數學工具精確地求解的解。例如,考慮函式 ,如下圖所示。
根據慣例,該函式的根在 處,或者在該函式與 x 軸相交的地方。因此,根將出現在 處。
答案x=1是解析解,因為透過使用代數,我們能夠得出精確的答案。
另一方面,嘗試解析地求解像
這樣的方程一定會讓人沮喪,因為用基本方法是不可能的。在這種情況下,需要尋求數值解,其中會進行猜測,直到答案“足夠接近”,但你永遠不會知道精確的答案。
下面討論的所有數值方法都只是提供了一種系統的猜測解方法,這樣你就可以更有可能(在某些情況下有保證)越來越接近真實答案。數值方法的問題是,大多數方法在沒有足夠好的初始猜測的情況下不能保證有效。因此,在找到接近真實答案的地方之前,嘗試幾個點,然後開始使用數值演算法來獲得更精確的答案。它們大致按照從最容易使用到更難但收斂速度更快的演算法排序。
最純粹形式的迭代解將求解所需的函式,使其形式為
然後,猜測一個 x 的值,並計算 f(x)。然後將 x 的新值重新代入 f(x),並重復此過程,直到 x 的值變化很小。
以下示例說明了此過程。
示例:
使用迭代解法計算 的根。
解:求解 x 的方程
首先我們需要猜測一個 x 來開始。讓我們嘗試
然後我們有
因此,保留兩位小數,根為 。如果需要,可以執行更多迭代以獲得更精確的答案。
正如我們將在本示例中看到的那樣,這種方法有一些相當嚴重的限制。
示例:
重複上述步驟,但這次以不同的方式求解 x。你發現了什麼?
解:為了說明這一點,讓我們從猜測 開始。
求解 x 的另一種方法是更明顯的方法:
顯然,即使我們從一個非常好的猜測開始,解也是發散的!
本例說明了迭代法成功的關鍵取決於方程右側函式的性質。特別是,它與函式在根處的斜率大小有關。如果斜率太大,該方法將不會收斂;即使斜率很小,該方法的收斂速度也很慢。因此,通常不建議使用此方法,儘管一些更有用的演算法是基於它的(這也是這裡介紹它的原因)。
雖然迭代求解方法有其缺點,但可以透過使用平均來大幅改進。在這個方法中,函式仍然以以下形式求解 x
從初始猜測開始,使用函式 f(x) 生成第二個猜測。但是,不是簡單地將代入 f(x),而是對和進行加權平均
項被稱為權重。權重的最常見值是二分之一,在這種情況下,代入 f(x) 的下一個值就是和的平均值。
然後將這個新值代入 f(x),與結果取平均值,並重復此過程直到收斂。
以下示例表明,這種方法比普通的迭代解收斂得更快,更可靠。
示例:
使用權重為的迭代法,求解方程的根。
解:讓我們像上次一樣從 0.5 的猜測開始,並比較這次與普通迭代相比的結果。
這裡,僅經過三次函式求值(這通常是所有步驟中最耗時的步驟),我們就得到了與使用其他方法進行**七次**求值相同的精度根!
該方法不僅收斂速度更快,而且更穩定,因此它實際上可以用來以另一種方式求解方程。
示例:
從初始猜測 開始,並使用 和加權迭代法,其中,求解方程的根。
解:從 開始,我們有
因此,我們可以(緩慢地)使用加權迭代法收斂到該解。
請注意,在這種情況下,如果我們使用正則迭代,則結果只有在以特定方式求解方程時才能收斂。使用加權迭代,可以以任何方式求解它並獲得解,但一種方式顯然比另一種方式快。然而,加權將在大多數情況下加速演算法,並且相對容易實現,因此它是一個值得使用的方法。
讓我們考慮一種求根的替代方法。考慮一個函式 f(x) = 0,我們希望找到它的根。如果我們令第二個變數 ,則 y 將(幾乎總是)在根的左側和右側之間改變符號。這可以在上面的 影像中看到,它從根的左側的負值變為右側的正值 。
二分法透過觀察函式在兩點之間改變符號,並縮小符號改變發生的區間,直到包含在內的根被緊密地包圍來工作。這僅適用於 連續 函式,在該函式中,圖中沒有跳躍或孔洞,但是許多常用的函式都是這樣,包括對數(對於正數)、正弦和餘弦以及多項式。
作為更正式的解釋,考慮一個函式 ,它在 和 之間改變符號。我們可以透過以下方式縮小區間:
- 在中點處評估函式
- 確定函式在每個子區間中是否改變符號
- 如果連續函式在子區間中改變符號,這意味著它包含一個根,所以我們保留該區間。
- 如果函式沒有改變符號,我們將其丟棄。這可能會在區間中有兩個根的情況下導致問題,因此二分法不能保證找到所有根。
雖然二分法不能保證找到所有根,但它可以保證至少找到一個,如果原始端點具有相反的符號。
重複上述過程,直到你儘可能接近根。
示例:
使用二分法找到 的根
透過代入一些數字,我們可以發現該函式在 和 之間改變符號。因此,由於該函式是連續的,因此該區間中一定至少存在一個根。
- 第一個區間:
- 中點:
- 中點的 y: 因此,符號在 0.5 和 0.75 之間改變,在 0.75 和 1 之間沒有改變。
- 新的區間:
- 中點:
- 中點的 y:
- 新的區間:
- 中點:
- 中點處的 y:
我們可以繼續這樣做,但由於結果非常接近根,讓我們看看是否有一個小於 0.625 的數字給出正函式值,從而節省一些時間。
- x 值:
- y 值:
因此,x 介於 0.5625 和 0.57 之間(因為函式在這個區間內改變符號)。
請注意,這種方法的收斂速度很慢,但很穩定。它對於將粗略的近似值改進到足夠接近以使用更快的但沒有保證的方法(例如加權迭代)很有用。
試位法類似於二分法。您必須再次從兩個 x 值開始,在這兩個 x 值之間,您要找到其根的函式 f(x) 發生變化。但是,這種方法試圖找到比區間中點更好的位置來分割它。它基於以下假設:與其隨意地使用區間的中點作為指南,不如進行額外的計算,以嘗試考慮曲線的形狀。這是透過找到兩個端點之間的割線,並使用該線的根作為分割點來完成的。
更正式地說
- 繪製或計算兩個端點 (a, f(a)) 和 (b, f(b)) 之間線的方程。
- 找到這條線與 x 軸的交點(或 y = 0 時),得到 x = c。
- 使用此 x 值來評估函式,得到 f(c)
- 然後,與二分法一樣處理子區間。如果 f(a) 和 f(c) 之間存在符號變化,則保留區間;否則,將其丟棄。對 f(c) 和 f(b) 之間進行相同操作。
- 重複上述操作,直到您達到所需的精度。
使用以下兩個公式求解割線 y = mx + B
(您可以使用任一公式)
試位法保證收斂到一個根,但它可能比二分法快也可能比二分法慢,具體取決於計算線的斜率需要多長時間以及函式的形狀。
示例:
找到 的根,但這次使用試位法。
解:在進行此操作時要注意簿記!跟蹤 y 值比跟蹤二分法更重要,在二分法中,我們只關心函式的符號,而不是它的實際值。
為了與二分法進行比較,讓我們選擇相同的初始猜測: 和 ,其中 和 .
- 第一個區間:
- 割線:
- 割線的根:
- 根處的函式值:
請注意,在這種情況下,我們可以丟棄比二分法大得多的區間(二分法將使用 作為分割點)
- 第二個區間:
- 割線:
- 割線的根:
- 根處的函式值:
我們僅僅經過兩次迭代就得到了幾乎完全精確的根!
在某些情況下,試位法可能會比二分法花費更長時間,這取決於曲線的形狀。然而,由於試位法可能帶來的顯著提速,嘗試幾次迭代通常是值得的。
切線法 (牛頓法)
[edit | edit source]在這個方法中,我們試圖使用函式的切線來找到函式 y = f(x) 的根。這與割線法類似,但它“脫離”了舊的點,只關注新的點,從而希望避免割線法例子中遇到的停滯現象。
由於這門課假設學生還沒有學習微積分,因此切線將透過找到兩個非常接近的點(分別用 (x) 和 表示)之間的直線方程來近似。該方法的工作原理如下:
- 選擇一個初始猜測值,
- 在 和 處評估函式 f(x),其中 是一個很小的數字。這會在你的(近似)切線上產生兩個點。
- 使用上面給出的公式找到切線的方程。
- 找到這條線的根。這是
- 重複步驟 2-4,直到你找到你想要的接近根的值。
除非你從一個足夠好的第一個猜測值開始,否則該方法無法保證收斂,這就是為什麼保證收斂的方法對於生成一個合適的猜測值非常有用。然而,由於該方法在收斂時比其他任何方法都快得多,因此如果有一個合適的猜測值,則最好使用該方法。
示例:
使用切線法找到 的根。
解:為了與迭代結果進行比較,讓我們猜測 。選擇
- 切線方程:
- 切線方程的根:
僅用**一次**計算,我們就已經獲得了與目前為止所有其他方法相同的精度!