算法學習筆記:19.牛頓迭代法——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

牛頓迭代法(Newton's Method)是一種強大的數值計算方法,由英國數學家艾薩克?牛頓提出。它通過不斷迭代逼近方程的根,具有收斂速度快、適用范圍廣的特點,在科學計算、工程模擬、計算機圖形學等領域有著廣泛應用。

牛頓迭代法核心思路

算法原理

牛頓迭代法的核心思想是用切線逼近曲線,通過迭代逐步縮小與方程根的距離。對于方程\(f(x) = 0\),其迭代公式為:

\(x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\)

其中:

  • \(x_n\) 是第\(n\)次迭代的近似根
  • \(f'(x_n)\) 是函數\(f(x)\)在\(x_n\)處的導數
  • \(x_{n+1}\) 是第\(n+1\)次迭代的近似根

幾何意義

牛頓迭代法的幾何意義是:在每一次迭代中,用函數\(f(x)\)在\(x_n\)處的切線代替曲線,將切線與\(x\)軸的交點\(x_{n+1}\)作為新的近似根。通過不斷重復這一過程,近似根會快速收斂到方程的真實根。

以下是用 mermaid 繪制的牛頓迭代法幾何示意圖(以\(f(x) = x^2 - 2\)求解\(\sqrt{2}\)為例):

算法流程

牛頓迭代法的基本流程如下:

  1. 選擇初始近似根\(x_0\)(初始值的選擇對收斂速度影響較大)。
  2. 計算函數值\(f(x_n)\)和導數值\(f'(x_n)\)。
  3. 代入迭代公式計算\(x_{n+1}\)。
  4. 判斷\(|x_{n+1} - x_n|\)是否小于預設精度\(\epsilon\)(如\(10^{-6}\)):
    • 若滿足,則\(x_{n+1}\)即為近似根,迭代結束。
    • 若不滿足,則令\(x_n = x_{n+1}\),返回步驟 2 繼續迭代。

其流程可用以下流程圖表示:

收斂性分析

  • 收斂條件:若函數\(f(x)\)在根的鄰域內二階可導且一階導數不為 0,則牛頓迭代法具有局部收斂性,且收斂階為 2(二次收斂),即誤差以平方級速度減小。
  • 影響因素
    • 初始值\(x_0\)的選擇:若初始值離真實根過遠,可能導致迭代發散或收斂到其他根。
    • 導數為 0 的情況:若\(f'(x_n) = 0\),迭代公式無意義,需特殊處理。

LeetCode 例題實戰

例題 1:69. x 的平方根(簡單)

題目描述:給你一個非負整數 x ,計算并返回 x 的算術平方根。由于返回類型是整數,結果只保留整數部分,小數部分將被舍去。

示例

輸入:x = 8

輸出:2

解釋:8 的算術平方根是 2.82842...,由于返回類型是整數,小數部分將被舍去。

解題思路:將問題轉化為求方程\(f(t) = t^2 - x = 0\)的非負根,使用牛頓迭代法求解:

  1. 初始值選擇:當\(x \geq 1\)時,取\(x_0 = x\);當\(x = 0\)時,直接返回 0。
  1. 迭代公式:\(f(t) = t^2 - x\),\(f'(t) = 2t\),代入迭代公式得\(t_{n+1} = \frac{1}{2}(t_n + \frac{x}{t_n})\)。
  1. 收斂判斷:當\(|t_{n+1} - t_n| < 1\)時,整數部分已穩定,可停止迭代,返回\(t_{n+1}\)的整數部分。

代碼實現

class Solution {public int mySqrt(int x) {if (x == 0) {return 0;}double x0 = x; // 初始值double x1 = (x0 + x / x0) / 2; // 第一次迭代// 迭代直至精度滿足要求(差值小于1)while (Math.abs(x1 - x0) >= 1) {x0 = x1;x1 = (x0 + x / x0) / 2;}return (int) x1;}}

復雜度分析

  • 時間復雜度:\(O(\log x)\),牛頓迭代法具有二次收斂性,迭代次數與\(x\)的大小呈對數關系。
  • 空間復雜度:\(O(1)\),僅使用常數額外空間。
  • 說明:代碼中使用 double 類型存儲中間結果以保證精度,最后通過強制類型轉換取整數部分。

例題 2:367. 有效的完全平方數(簡單)

題目描述:給定一個正整數 num ,編寫一個函數,如果 num 是一個完全平方數,則返回 true ,否則返回 false 。

示例

輸入:num = 16

輸出:true

輸入:num = 14

輸出:false

解題思路:同樣轉化為求方程\(f(t) = t^2 - num = 0\)的根,若根為整數,則 num 是完全平方數:

  1. 用牛頓迭代法求出近似根\(t\)。
  1. 驗證\(t\)的整數部分\(k\)是否滿足\(k^2 = num\),若是則返回 true,否則返回 false。

代碼實現

class Solution {public boolean isPerfectSquare(int num) {if (num < 1) {return false;}if (num == 1) {return true;}double x0 = num;double x1 = (x0 + num / x0) / 2;// 迭代至精度足夠高(差值小于1e-6)while (Math.abs(x1 - x0) > 1e-6) {x0 = x1;x1 = (x0 + num / x0) / 2;}int k = (int) Math.round(x1); // 四舍五入取整數return k * k == num;}}

復雜度分析

  • 時間復雜度:\(O(\log num)\),迭代次數與 num 的大小呈對數關系。
  • 空間復雜度:\(O(1)\),僅使用常數額外空間。
  • 說明:通過四舍五入處理近似根,確保整數部分的準確性,再驗證是否為完全平方數。

例題 3:50. Pow (x, n)(中等)

題目描述:實現 pow(x, n) ,即計算 x 的整數 n 次冪函數(即,\(x^n\))。

示例

輸入:x = 2.00000, n = 10

輸出:1024.00000

解題思路:當\(n\)為負整數時,\(x^n = 1 / x^{-n}\),因此可先處理\(n\)為非負的情況。對于\(n > 0\),可通過牛頓迭代法求指數函數,但更簡單的方式是結合快速冪思想優化:

  1. 轉化問題:計算\(e^{n \ln x}\)(利用指數與對數的關系\(x^n = e^{n \ln x}\))。
  1. 牛頓迭代法求指數函數:但實際中更高效的是使用快速冪(分治法),此處僅展示牛頓迭代法在指數計算中的思路。

補充說明:本題雖更適合用快速冪,但牛頓迭代法可用于求解\(e^y\)的近似值(通過求方程\(f(t) = e^t - y = 0\)的根),進而間接計算\(x^n\)。以下代碼展示牛頓迭代法求\(e^y\)的思路:

class Solution {// 計算e^y的近似值private double exp(double y) {if (y < 0) {return 1 / exp(-y);}double t0 = y + 1; // 初始值double t1 = t0 - (Math.exp(t0) - y - 1) / Math.exp(t0); // 迭代公式(針對f(t)=e^t - t - 1 - y)while (Math.abs(t1 - t0) > 1e-6) {t0 = t1;t1 = t0 - (Math.exp(t0) - t0 - 1 - y) / (Math.exp(t0) - 1);}return Math.exp(t1) - 1;}public double myPow(double x, int n) {if (n == 0) {return 1.0;}long N = n; // 處理n為Integer.MIN_VALUE的情況if (N < 0) {x = 1 / x;N = -N;}// 利用x^N = e^(N ln x)return exp(N * Math.log(x));}}

說明:本題中牛頓迭代法并非最優解,但展示了其在超越函數計算中的應用。實際解題中,快速冪(時間復雜度\(O(\log |n|)\))更為高效。

考研 408 例題解析

例題 1:數值計算應用題(408 高頻考點)

題目:用牛頓迭代法求方程\(f(x) = x^3 - 2x - 5 = 0\)在\(x_0 = 2\)附近的實根,要求迭代 3 次,并計算迭代誤差。

解題步驟

  1. 確定函數與導數:\(f(x) = x^3 - 2x - 5\),\(f'(x) = 3x^2 - 2\)。
  2. 迭代公式:\(x_{n+1} = x_n - \frac{x_n^3 - 2x_n - 5}{3x_n^2 - 2}\)。
  3. 計算前 3 次迭代:
    • 第 1 次:\(x_0 = 2\),\(f(x_0) = 8 - 4 - 5 = -1\),\(f'(x_0) = 12 - 2 = 10\),\(x_1 = 2 - (-1)/10 = 2.1\)。
    • 第 2 次:\(f(x_1) = 2.1^3 - 2*2.1 - 5 ≈ 9.261 - 4.2 - 5 = 0.061\),\(f'(x_1) ≈ 3*(2.1)^2 - 2 ≈ 13.23 - 2 = 11.23\),\(x_2 ≈ 2.1 - 0.061/11.23 ≈ 2.0946\)。
    • 第 3 次:\(f(x_2) ≈ (2.0946)^3 - 2*(2.0946) - 5 ≈ 0.0003\),\(f'(x_2) ≈ 3*(2.0946)^2 - 2 ≈ 11.16\),\(x_3 ≈ 2.0946 - 0.0003/11.16 ≈ 2.09455\)。
  1. 迭代誤差:\(|x_3 - x_2| ≈ 0.00005\),已非常接近真實根(約 2.09455)。

答案:經過 3 次迭代,近似根為\(2.09455\),迭代誤差約為\(5 \times 10^{-5}\)。

例題 2:算法分析題(選擇題)

題目:關于牛頓迭代法,下列說法錯誤的是( )。

A. 牛頓迭代法具有二次收斂速度,收斂速度快于簡單迭代法

B. 牛頓迭代法的迭代公式只與函數值和導數值有關

C. 無論初始值如何選擇,牛頓迭代法都能收斂到方程的根

D. 當函數在迭代點處的導數為 0 時,牛頓迭代法無法繼續迭代

答案:C

解析

  • A 正確:牛頓迭代法在滿足收斂條件時為二次收斂,速度快于線性收斂的簡單迭代法。
  • B 正確:迭代公式僅依賴\(f(x_n)\)和\(f'(x_n)\)。
  • C 錯誤:初始值選擇不當可能導致迭代發散或收斂到其他根(如\(f(x) = x^3 - 3x + 1\),初始值選擇不當會收斂到不同根)。
  • D 正確:若\(f'(x_n) = 0\),迭代公式分母為 0,需特殊處理(如改用其他迭代法)。

牛頓迭代法的擴展與應用

實際應用場景

  • 方程求解:求解高次方程、超越方程的根(如在物理、工程中求解運動方程)。
  • 優化問題:求函數的極值(通過求解導數為 0 的點,如機器學習中的梯度下降法可視為牛頓法的簡化)。
  • 計算機圖形學:求光線與物體的交點(射線追蹤算法)。
  • 數值分析:計算平方根、立方根、指數函數、對數函數等。

考研 408 中的重點

在考研 408 中,牛頓迭代法的考點集中在:

  • 算法原理:理解迭代公式的推導和幾何意義。
  • 收斂性分析:掌握收斂條件和影響收斂的因素。
  • 應用計算:能手動進行簡單迭代計算,求解方程近似根。
  • 與其他算法的對比:如與二分法的比較(二分法收斂慢但總能收斂,牛頓法收斂快但依賴初始值)。

總結

牛頓迭代法作為一種高效的數值計算方法,憑借其二次收斂特性,在科學與工程領域有著廣泛應用。本文通過 LeetCode 例題(平方根、完全平方數、指數計算)展示了其在編程中的應用,通過考研 408 例題梳理了理論考點與計算思路。

掌握牛頓迭代法不僅能提升解決數值問題的能力,還能深化對函數導數、收斂性等數學概念的理解。在實際應用中,需注意初始值的選擇和收斂條件的判斷,以避免迭代發散。

希望本文能夠幫助讀者更深入地理解牛頓迭代法,并在實際項目中發揮其優勢。謝謝閱讀!


希望這份博客能夠幫助到你。如果有其他需要修改或添加的地方,請隨時告訴我。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88698.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小白學Python,操作文件和文件夾

目錄 前言 一、操作文件路徑 1.獲取當前路徑 2.創建文件夾 &#xff08;1&#xff09;mkdir()函數 &#xff08;2&#xff09;makedirs() 函數 3.拼接路徑 4.跳轉路徑 5.判斷相對路徑和絕對路徑 6.獲取文件路徑和文件名 二、操作文件和文件夾 1.查詢文件大小 2.刪除…

015_引用功能與信息溯源

引用功能與信息溯源 目錄 引用功能概述支持的模型引用類型API使用方法引用格式應用場景最佳實踐 引用功能概述 什么是引用功能 Claude的引用功能允許在回答基于文檔的問題時提供詳細的信息來源引用&#xff0c;幫助用戶追蹤和驗證信息的準確性。這個功能特別適用于需要高可…

ROS2中的QoS(Quality of Service)詳解

ROS2中的QoS&#xff08;Quality of Service&#xff09;詳解1. 主要QoS參數2. 為什么需要設置QoS3. QoS兼容性規則4. 選擇QoS策略的建議5. 調試QoS問題的方法6. 踩坑&#xff1a;訂閱話題沒有輸出可能的原因&#xff1a;調試方法QoS是ROS2中用于控制通信質量和行為的機制。它定…

Cursor三大核心AI功能

一&#xff1a;Tab鍵&#xff1a;智能小助手 1.1 單行/多行代碼補全 在代碼中寫出要實現的功能&#xff0c;第一次按Tab生成代碼&#xff0c;第二次按Tab接受代碼。1.2 智能代碼重寫 對已有代碼重新編寫。 寫個注釋告訴AI重構方法&#xff0c;然后鼠標點到方法內部&#xff0c;…

cesium添加原生MVT矢量瓦片方案

項目中需要基于cesium接入mvt格式的服務并支持屬性拾取查詢&#xff0c;通過一系列預研測試&#xff0c;最后選擇cesium-mvt-imagery-provider開源插件完成&#xff0c;關鍵源碼信息如下&#xff1a; npm i cesium cesium-mvt-imagery-provider //安裝依賴包// 加載圖層import…

AI金融風控:識別欺詐,量化風險的新利器

AI金融風控&#xff1a;識別欺詐&#xff0c;量化風險的新利器深度學習算法穿透海量交易數據&#xff0c;92.5%的不良貸款識別率宣告了金融風險防控新時代的來臨。深圳桑達銀絡科技有限公司在2025年6月申請的“基于人工智能的金融交易反欺詐系統”專利&#xff0c;揭示了金融風…

【unitrix】 5.0 第二套類型級二進制數基本結構體(types2.rs)

一、源碼 這是一個使用 Rust 類型系統實現類型級(type-level)二進制數的設計。 //! 類型級二進制數表示方案&#xff08;第二套方案&#xff09; //! //! 使用嵌套泛型結構體表示二進制數&#xff0c;支持整數和小數表示。use crate::sealed::Sealed;/// 類型級二進制數結構體 …

DAY01:【ML 第一彈】機器學習概述

一、三大概念 1.1 人工智能&#xff08;AI&#xff09; Artificial Intelligence 人工智能AI is the field that studies the synthesis and analysis of computational agents that act intelligently 1.2 機器學習&#xff08;ML&#xff09; Machine Learning 機器學習Fi…

AGX Xavier 搭建360環視教程【一、先確認方案】

設備默認自帶 NVIDIA 硬件編解碼能力&#xff08;NVDEC/NVENC&#xff09;&#xff0c;但是需要你在 OpenCV 和 FFmpeg 里正確啟用 調通 GStreamer 或 nvmpi&#xff0c;才真正能用起來&#xff01;這里的硬解碼是核心&#xff1a;Jetson 平臺的硬解碼&#xff0c;要么走 GStr…

服務器怎么跑Python項目?

在服務器上運行 Python 項目通常涉及 環境配置、依賴安裝、項目部署 和 進程管理。以下是詳細步驟&#xff1a;1. 連接服務器確保你能通過 SSH 訪問服務器&#xff1a;ssh usernameyour_server_ip&#xff08;如果是本地測試&#xff0c;可跳過這一步&#xff09;2. 安裝 Pytho…

【軟件設計師】

UML 類圖中的關系用例圖中的關系 關系例子類圖用例圖順序圖 概念示例通信圖活動圖泳道圖狀態圖

Java 內部類詳解:從基礎到實戰,掌握嵌套類、匿名類與局部類的使用技巧

作為一名 Java 開發工程師&#xff0c;你一定在實際開發中遇到過這樣的場景&#xff1a;想在一個類內部定義另一個邏輯相關的類&#xff1b;需要為某個接口或抽象類提供一個臨時實現&#xff08;比如監聽器&#xff09;&#xff1b;想利用面向對象特性來組織代碼結構&#xff0…

Java設計模式之行為型模式(觀察者模式)介紹與說明

一、模式結構 觀察者模式包含以下四個角色&#xff1a; Subject&#xff08;主題/被觀察者&#xff09; 維護觀察者列表&#xff0c;提供注冊&#xff08;registerObserver&#xff09;、移除&#xff08;removeObserver&#xff09;觀察者的方法&#xff0c;并定義通知所有觀察…

實現一個點擊輸入框可以彈出的數字軟鍵盤控件 qt 5.12

我們將創建兩個自定義組件&#xff1a; 1. NumericInputField&#xff1a;一個輸入框&#xff0c;當點擊時彈出數字鍵盤。 2. NumericKeyboard&#xff1a;一個可縮放的數字鍵盤。 設計思路&#xff1a; - NumericInputField 是一個常規的輸入框&#xff0c;但點擊后會彈出 Num…

Java 深入解析:JVM對象創建與內存機制全景圖

第一章&#xff1a;引言 Java 是一種面向對象的編程語言&#xff0c;對象&#xff08;Object&#xff09;是其最基本的組成單位。Java 的“一切皆對象”不僅體現在語法層面&#xff0c;更體現在運行時&#xff0c;幾乎所有數據都以對象形式存在于內存中。 然而&#xff0c;很…

Redis 基本操作筆記

1. Redis 簡介 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、高性能的鍵值對存儲系統&#xff0c;通常作為數據庫、緩存、消息中間件等使用。它支持多種數據類型&#xff0c;包括字符串、哈希、列表、集合、有序集合等。 Redis 特點&#xff1a; 性能&…

Docker從環境配置到應用上云的極簡路徑

Docker從環境配置到應用上云的極簡路徑主要包括環境配置、應用容器化、選擇云平臺及部署應用等步驟&#xff0c;具體如下&#xff1a; - 配置Docker環境&#xff1a; - 安裝Docker&#xff1a;根據操作系統下載對應版本的Docker安裝包。如在Linux系統中&#xff0c;可使用命令…

Slicer渲染Dicom到nrrd

Slicer渲染Dicom到nrrd 工作中遇到一些處理Dicom數據的需求&#xff0c;個人通過網絡上的一些教程 對于原始數據嘗試轉換到nrrd時&#xff0c;發現部分的窗體數據的渲染方向不一致 進一步發現這些很多定義的方向是跟設備廠家強相關的&#xff0c;不同廠家對于同一段的Dicom參…

QT中設計qss字體樣式但是沒有用【已解決】

檢查一下stylesheet里面是不是有不能被QT讀取的CSS語言&#xff0c;可能會跟字體顏色沖突錯誤示范&#xff1a;/* 錯誤示例&#xff1a;QSS 中使用 box-shadow */ QPushButton {box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* Qt 不支持此屬性 */ }刪掉就行了如果后續想用陰影…

uniapp獲取狀態欄高度,膠囊按鈕的高度,底部安全區域的高度,自定義導航欄

相關API uni.getSystemInfoSync() uni.getMenuButtonBoundingClientRect() 創建一個utils文件夾&#xff0c;該文件下封裝一個systemInfo.js /*** 系統信息工具類* 封裝獲取系統狀態欄、導航欄和安全區域等相關信息的方法*/// 獲取系統信息并緩存 const systemInfo uni.get…