牛頓法求平方根步驟


 

牛頓法步驟:

  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;
}

  

轉自:

https://www.cnblogs.com/upcan/p/9907402.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM