牛顿迭代法求开方-详细且通俗讲解

article/2025/9/15 0:54:32

目录

•写在前面

•前戏-二分法实现

•牛顿迭代法

代码实现


•写在前面

求开方这件事儿,很多时候用一个sqrt方法就搞定了,很少有趣思考这底层的实现到底是用什么方法完成的。正好我遇到了需要实现sqrt方法,这里就仔细的讲解一下如何去实现sqrt,当然啦,这里会进行一些数学原理的推算,不想看这些数学原理的推算的,也可以直接跳过,看文字描述的原理思路,我分好目录了,哈哈哈。

•前戏-二分法实现

求开方这个问题,其实就是对 f(x)=x^{2} 进行求解,很多时候我们比较直观的一种思路就是找到一个数,使得这个数的平方等于目标数值就可以了,使用二分法搜索平方根的思想很简单,就类似于小时候我们看的电视节目中的“猜价格”游戏,高了就往低了猜,低了就往高了猜,范围越来越小。因此,使用二分法猜算术平方根就很自然。一个数的平方根肯定不会超过它自己,不过直觉还告诉我们,一个数的平方根最多不会超过它的一半,例如 8 的平方根,8 的一半是 4,4^{2}=16>8 。这个思路就简单多了,我们只要在0到这个数的一半,进行二分查找合适的数就可以了。这种思路比较简单,我这里直接贴实现代码。

//这里我就直接使用整数,求解最接近的整数就可以了,精
//确到小数,毕竟我们想要学习的是思想
public int mySqrt(int x){long left = 0;long right = Integer.MAX_VALUE;while (left < right){long mid = (left + right + 1) >>> 1;  //求解中位数的一种方式,无符号右位移long square = mid * mid;if(square > x){right = mid - 1;}else {left = mid;}}return (int)left;
}

•牛顿迭代法

我们求解数的开方,有很多方法,这里我们先从数学上进行讲解,这样可以从本质的理解牛顿迭代法。首先我们求解数的开方,其实就是求解某个多次方程的根式解。

我们需要先来理解一个知识点,就是“切线是曲线的线性逼近”,这是什么意思呢?我们用 f(x)=x^{2} 进行举例,图如下:

最左边是 f(x)=x^{2} 的图,我们随便选一点 f(x) 上的一点 (a,f(a)) 作它的切线,把点命名为A,然后不断放大A点以及切线,我们就可以看到,切线非常接近曲线。因为切线是一条直线(也就是线性的),所以我们可以说,A点的切线是 f(x) 的线性逼近。离A点距离越近,这种逼近的效果也就越好,也就是说,切线与曲线之间的误差越小。所以我们可以说在A点附近,切线 \approx f(x) 。

有了这个知识点之后,我们就会发现,切线既然可以近似曲线,那么我们岂不是直接研究这个切线就可以了嘛,现在我们来看下图,从左到右,从上到下四张图

上图我们可以知道,最开始的第一张图中,我们随便找一个点,然后过该点做切线,我们会发现,这条切线的根(也就是和x轴相交的点)与曲线的根(曲线和x轴相交的点)有一定的距离。怎么办呢?没关系,这个时候我们看第二张图,我们先过切线的根的那个点做x轴的垂线,这条垂线会和曲线相交于一个B点,然后我们再在这个B点做切线,我们会发现这条切线的根离曲线的根更近了,如此重复这个步骤,在这个过程中,我们会发现,切线的根会越来越接近曲线的根。经过多次迭代之后,我们会发现我们非常接近曲线的根了,用专业的术语来讲,就是迭代收敛了。

现在我们来推到,首先假设已知曲线方程 f(x) ,我们现在在 x_{n} 点做切线,求 x_{n+1} ,图如下:

容易得出,x_{n} 点的切线方程为 f\left(x_{n}\right)+f^{\prime}\left(x_{n}\right)\left(x-x_{n}\right) ,要求 x_{n+1} ,即相当于求 f\left(x_{n}\right)+f^{\prime}\left(x_{n}\right)\left(x-x_{n}\right) = 0 的解也就是f\left(x_{n}\right)+f^{\prime}\left(x_{n}\right)\left(x_{n+1}-x_{n}\right)=0 得到 x_{n+1}=x_{n}-\frac{f\left(x_{n}\right)}{f^{\prime}\left(x_{n}\right)},这个时候我们就需要思考一个问题,我们每次选中的条,使用这个方法进行求解,一定会收敛么,我们先来看看收敛的充分条件:

若 f 二阶可导,那么在待求的零点 x 周围存在一个区域,只要起始点 x_0 位于这个邻近区域内,那么我们使用这个方法必定收敛,换句话说,如果我们选中的点不在这个邻近区域内,就不会收敛,举个例子,比如我们不小心的选中了驻点,那么就不会收敛,如下图

这种情况是我们选中的点不在邻近区域内,导致不收敛,有一些情况是如论我们怎么选择,都不会收敛,比如在 f(x)=x^{\frac{1}{3}} 的曲线,不论怎么选择起始点,越迭代就越远离根点,如下图

还有一种就是不断的循环震荡不收敛,比如 f(x)=|x|^{\frac{1}{2}} 曲线,如下图

还有一种就是不能完整的求出所有的根,比如 f(x)=x^{4}-2 x^{2}+x 这种多根的函数,因为我们只能求到附近的根,当然,也可能因为我们选择的起始点不同的原因,导致我们求到了较远的根,如下图

所以经过上面的讨论,我们使用牛顿迭代法的时候,需要注意一下几个问题

  • 函数在整个定义域内最好是二阶可导的
  • 起始点对求根计算影响重大,可以增加一些别的判断手段进行试错

代码实现

为了得到代码,我们通过一个简单的运算,来简略的说明牛顿迭代法(但并不是说上面的数学讨论是废话,毕竟数学的美,要自己体会,哈哈哈),如下图

public int mySqrt(int x){long a = x;while (a * a > x){a = (a + x / a) / 2;}return (int) a;
}

 


http://chatgpt.dhexx.cn/article/wJhDIQxB.shtml

相关文章

【Matlab】牛顿迭代法实现

文章目录 题目&#xff1a;牛顿迭代法程序1&#xff1a;牛顿迭代法通用函数程序2&#xff1a;求最大Delta程序3&#xff1a;观察结果 题目&#xff1a;牛顿迭代法 程序1&#xff1a;牛顿迭代法通用函数 function [x] newton(x0,epsilon,f,print_flag) digits(10) % 控制牛顿…

C语言---牛顿迭代法求根

用牛顿迭代法求下面方程在1.5附近的根&#xff1a;2x3-4x23x60 先定义一个x0,通过x0找出f(x0),做f(x0)的切线&#xff0c;切线的交点为x1&#xff0c;tanxf(x0)/x1-x0;然而切线在函数中就是f(x)的导数&#xff0c;我们利用这一结论可以找出f(x0)和f(x0)的导数之间的关系&#x…

牛顿迭代法(Newton's Method)

简介 牛顿迭代法&#xff08;简称牛顿法&#xff09;由英国著名的数学家牛顿爵士最早提出。但是&#xff0c;这一方法在牛顿生前并未公开发表。 牛顿法的作用是使用迭代的方法来求解函数方程的根。简单地说&#xff0c;牛顿法就是不断求取切线的过程。 对于形如f(x)0的方程&am…

如何通俗易懂地讲解牛顿迭代法?

五次及以上多项式方程没有根式解&#xff08;就是没有像二次方程那样的万能公式&#xff09;&#xff0c;这个是被伽罗瓦用群论做出的最著名的结论。 但是&#xff0c;没有王屠夫难道非得吃带毛猪&#xff1f;工作生活中还是有诸多求解高次方程的真实需求&#xff08;比如行星…

使用“牛顿迭代法”求解方程

使用牛顿迭代法求解方程 尽管通过因式分解和利用求根公式可以很方便的得出多项式方程的根&#xff0c;但大多数时候这个多项式的次数都很高&#xff0c;计算将变得非常复杂&#xff0c;因此&#xff0c;我们必须转向一些近似解法。 牛顿迭代法是其中最好的方法之一。从根本上说…

牛顿迭代法求解方程

说明&#xff1a;该篇博客源于博主的早些时候的一个csdn博客中的一篇&#xff0c;由于近期使用到了&#xff0c;所以再次作一总结。原文地址 概述 牛顿迭代法&#xff08;Newton’s method&#xff09;又称为牛顿-拉夫逊&#xff08;拉弗森&#xff09;方法&#xff08;Newto…

方程求根的迭代法——牛顿迭代法

用牛顿法解方程xe(x) -10 程序流程图如下&#xff1a; //方程求根的迭代法——牛顿迭代法 /*************Analysis********** *1.初值x0,精度e,迭代次数N *2.牛顿法解方程f(x)x*e**x-1 *3.取初值为0.5 ********************************/ #include<iostream> #include&…

牛顿迭代法

转自 LeetCode 解答 一篇解释得很细的文章 牛顿迭代法是一种可以用来快速求解函数零点的方法。 以 LeetCode 上的一题为例&#xff1a;模拟 int sqrt(x) 函数&#xff0c;返回的开方值向下取整。 为了叙述方便&#xff0c;我们用 C 表示待求出平方根的那个整数。显然&#xff…

牛顿迭代法(Newton’s Method)迭代求根的Python程序

迭代法的作用 许多复杂的求解问题&#xff0c;都可以转换成方程f(x)0的求解问题。这一系列的解叫做方程的根。对于非线性方程的求解&#xff0c;在自变量范围内往往有多个解&#xff0c;我们将此变化区域分为多个小的子区间&#xff0c;对每个区间进行分别求解。我们在求解过程…

用牛顿迭代法求方程的根

用牛顿迭代法求方程的根&#xff08;C语言&#xff09; 题目要求&#xff1a;牛顿迭代法是一种重要的基本的求方程根的方法。现有方程为axˆ3bxˆ2cxd0&#xff0c;系数a&#xff0c;b&#xff0c;c&#xff0c;d的值一次为1&#xff0c;2&#xff0c;3&#xff0c;4&#xff…

【源码】牛顿迭代法求根的matlab实现

牛顿迭代法求根的matlab实现 本篇是在课程学习中自己编程实现的牛顿迭代法计算非线性方程或者超越方程近似根的算法&#xff0c;写一下&#xff0c;后边便于复习和期末课程设计引用。 牛顿迭代法本质上是一种特殊的不动点迭代&#xff0c;只不过它的迭代函数的构造比较特殊&am…

牛顿迭代法求方程的根

牛顿迭代法&#xff08;牛顿-拉弗森方法&#xff09; 五次及以上多项式方程没有根式解&#xff08;就是没有像二次方程那样的万能公式&#xff09;&#xff0c;这个是被伽罗瓦用群论做出的最著名的结论。没有根式解不意味着方程解不出来&#xff0c;数学家也提供了很多方法&am…

非线性方程求根——牛顿迭代法

一、牛顿法 1.实质&#xff1a;牛顿法实质上是一种线性方法&#xff0c;其基本思想是将非线性方程f(x)0逐步归结为某种线性方程来解。 2.牛顿法公式&#xff1a; 已知方程f(x)0有近似解xk,假设&#xff0c;将f(x)在点xk泰勒展开&#xff0c;有则方程f(x)0可近似表示为&#…

C语言每日一练——第154天:牛顿迭代法求方程根

&#x1f31f; 前言 Wassup guys&#xff0c;我是Edison &#x1f60e; 今天是C语言每日一练&#xff0c;第154天&#xff01; Let’s get it&#xff01; 文章目录 1. 问题描述2. 题目分析3. 算法设计4. 确定程序框架5. 迭代法求方程根6. 代码实现 1. 问题描述 编写用牛顿迭…

前端骨架屏终极方案——骨架图

骨架图代替骨架屏。用图片代替骨架屏&#xff01;&#xff01;&#xff01; 主要还没尝试过自动生成方案&#xff0c;手工写感觉太麻烦&#xff08;美工已经操起了板砖。。。&#xff09; 最简单的实现方式&#xff0c;拿页面的UI效果图&#xff08;或者直接手机截屏&#xf…

element ui修改骨架屏形状

这是element ui的原本形状 这个形状虽然也可以 但有些情况和东西的加载显然不太适合这个形态 确实我们可以这样写 如果你是vue2 则 <div><el-skeleton animated><template slot"template"><el-skeleton-item style "width: 100vw;he…

你不可能知道的骨架屏玩法!

〇 前言 这篇是作者在公司做了活动架构升级后&#xff0c;产出的主文的前导第二篇&#xff0c;考虑到本文相对独立&#xff0c;因此抽离出单独成文。姐妹兄弟篇&#xff0c;《你可能不知道的动态组件玩法????》。 可能文“对不起”题&#xff0c;知道的大佬别进来了????…

vue加载组件骨架屏el-skeleton使用

做项目遇到的问题&#xff1a;在两个兄弟组件中&#xff0c;点击其中一个组件的一个元素&#xff0c;如button&#xff0c;会触发其兄弟组件的刷新&#xff0c; 我的做法&#xff1a;在watch中监测某字段&#xff0c;更改了之后直接在watch中发送后端请求&#xff0c;如下&…

在vue项目中使用骨架屏

现在的应用开发&#xff0c;基本上都是前后端分离的&#xff0c;前端主流框架有SPA、MPA等&#xff0c;那么解决页面渲染、白屏时间成为首要关注的点 webpack可以按需加载&#xff0c;减小首屏需要加载代码的体积&#xff1b; 使用CDN技术、静态代码等缓存技术&#xff0c;可…

使用 Vite 插件自动化实现骨架屏

大厂技术 高级前端 Node进阶 点击上方 程序员成长指北&#xff0c;关注公众号 回复1&#xff0c;加入高级Node交流群 作者&#xff1a;橙红年代 原文&#xff1a;https://juejin.cn/post/7152406737100734495 骨架屏在SPA应用中有两个显著提升用户体验的作用 避免页面初始化加…