文章內容來自王曉華老師
人們提出了很多迭代法來近似求解這類問題,比較常見的有梯度法、最小二乘法和牛頓迭代法,只要問題的解是可收斂的(或者是局部可收斂的),都可以使用迭代法求解。
數學意義上的迭代法是一種不斷用變量的舊值遞推新值的過程,其對應的迭代算法也是用計算機解決問題的一種基本方法。
迭代法和遞推法的關系
迭代法作為很多數學問題的求解算法,是解決數學問題的一種常用的算法模式,可以獨立構成解決問題的算法。遞推法作為一種設計算法的常用思想,沒有固定的算法實現模式,通常是與其他算法模式配合形成算法實現。比如線性動態規划問題,一般都有明確的子問題最優解遞推公式,遞推思想常常作為算法實現的一部分融入到動態規划算法的實現中。
迭代法的基本思想
迭代法的實現,一般需要確定以下三個要點。
• 確定迭代變量:迭代變量一般就是要求解的問題的解,利用迭代遞推公式可以不斷地由舊值遞推出新值。根據問題的不同,迭代變量可以是一個,也可以是多個。確定迭代變量,通常還要根據迭代遞推關系給出迭代變量的初始值,這一點也很重要。
• 確定迭代遞推關系:迭代遞推關系是根據舊值計算新值的關系或公式,這是迭代法實現的關鍵,如果不能確定迭代關系,則無法用迭代法實現算法。
• 確定迭代終止條件:迭代終止條件是控制迭代過程退出的關鍵條件。迭代不可能無休止地進行,必須設置迭代終止條件,在適當的時候退出迭代。迭代終止條件一般有三種假設:其一是迭代變量已經求得問題的精確值;其二是迭代變量無法得到精確值,但是某個迭代的值的精度已經滿足要求;其三是指定明確的迭代計算次數。迭代算法的具體實現,可根據問題的類型選擇迭代終止條件。一般情況下,為了防止迭代關系在某個區間上發散(不收斂)使得算法進入死循環,都會把第三個條件作為異常退出條件和其他迭代終止條件配合使用,也就是說,即使無法得到符合條件的解,只要迭代計算次數達到某個限制值,也退出迭代過程。
std::pair<bool, double> cl_root(double a, double eps) { double xi = a / 2.0; //初始值用 a 的一半,很多人的選擇 double xt; int count = 0; do { xt = xi; xi = (xt + (a / xt)) / 2.0; count++; //用於檢查是否收斂的計數器 if (count >= LOOP_LIMIT) { return {false, 0.0}; //不收斂,返回失敗 } } while (std::fabs(xi - xt) > eps); return { true, xi };