牛頓法步驟:
1. 以y = (x - 2) * (x - 2) 函數為例,先任意選取一點A,在曲線上做A點的切線,交X軸與B點,在B做X軸的垂線,交曲線於C點。
2. 在曲線上做C點的切線,交X軸與D點,在D點做X軸的垂線,交曲線於E點。我們可以看到D點比B點更加接近方程(x - 2) * (x - 2) = 0的根(x = 2)
3. 在曲線上做E點的切線,交X軸與F點,在F點做X軸的垂線,交曲線於G點。可以看到G點比D點更加接近方程的根
4. 按照這個方式不斷迭代會離方程的根越來越近,以此得到近似根。
三、牛頓迭代法求平方根代碼實現
要求是這樣:輸入一個數,輸出其對應的平方根。
假設輸入的數是 m,則其實是求一個 x 值,使其滿足 x2 = m,令 f(x) = x2 - m ,其實就是求方程 f(x) = 0 的根。那么 f(x) 的導函數是 f'(x) = 2x。
那么 f(x) 函數的曲線在 (xn,xn2 - m) 處的切線的斜率是:2xn,因此切線方程是:y = 2xn (x - xn) + xn2 - m。故切線與x軸的交點是:xn+1 = (xn + m / xn ) / 2
根據牛頓迭代法,首先應該在曲線 f(x) 上任意選取一點,做切線。那么,我們直接把輸入的數 m,作為選取的點的橫坐標,即 x0 = m,然后根據上式進行迭代。
#include <iostream> #include <cmath> using namespace std; // err 是允許的誤差 const double err = 1e-8; double NtSqrt(const double num) { if (num < 0) { return -1; } else { double root = num; // 如果原值減去近似根的平方大於誤差,繼續循環 while (abs(num - root * root) >= err) { // 得到下一個近似根 root = (num / root + root) / 2.0; } return root; } } int main() { double num; cout << "請輸入一個數: "; cin >> num; double ans = NtSqrt(num); if (ans == -1) { cout << "負數沒有平方根" << endl; } else { cout << num << " 的平方根是 " << ans << endl; } return 0; }
轉自: