牛顿迭代法(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…