二分法和牛顿迭代法求平方根(Python实现)

article/2025/10/1 9:31:41

求一个数的平方根函数sqrt(int num) ,在大多数语言中都提供实现。那么要求一个数的平方根,是怎么实现的呢?

实际上求平方根的算法方法主要有两种:二分法(binary search)和牛顿迭代法(Newton iteration)


1:二分法

求根号5

a:折半:       5/2=2.5

b:平方校验:  2.5*2.5=6.25>5,并且得到当前上限2.5

c:再次向下折半:2.5/2=1.25

d:平方校验:1.25*1.25=1.5625<5,得到当前下限1.25

e:再次折半:2.5-(2.5-1.25)/2=1.875

f:平方校验:1.875*1.875=3.515625<5,得到当前下限1.875


每次得到当前值和5进行比较,并且记下下下限和上限,依次迭代,逐渐逼近平方根:

import math
from math import sqrtdef sqrt_binary(num):x=sqrt(num)y=num/2.0low=0.0up=num*1.0count=1while abs(y-x)>0.00000001:print count,ycount+=1		if (y*y>num):up=yy=low+(y-low)/2else:low=yy=up-(up-y)/2return yprint(sqrt_binary(5))
print(sqrt(5))

运行结果:

1 2.5
2 1.25
3 1.875
4 2.1875
5 2.34375
6 2.265625
7 2.2265625
8 2.24609375
9 2.236328125
10 2.2314453125
11 2.23388671875
12 2.23510742188
13 2.23571777344
14 2.23602294922
15 2.23617553711
16 2.23609924316
17 2.23606109619
18 2.23608016968
19 2.23607063293
20 2.23606586456
21 2.23606824875
22 2.23606705666
23 2.2360676527
24 2.23606795073
25 2.23606809974
26 2.23606802523
27 2.23606798798
2.23606796935
2.2360679775
[Finished in 0.1s]



经过27次二分法迭代,得到的值和系统sqrt()差别在0.00000001,精度在亿分之一,

0.001需要迭代8次


因此,在对精度要求不高的情况下,二分法也算比较高效的算法。


2:牛顿迭代

仔细思考一下就能发现,我们需要解决的问题可以简单化理解。
从函数意义上理解:我们是要求函数f(x) = x²,使f(x) = num的近似解,即x² - num = 0的 近似解
从几何意义上理解:我们是要求抛物线g(x) = x² - num与x轴交点(g(x) = 0)最接近的点。

我们假设g(x0)=0,即x0是正解,那么我们要做的就是让近似解x不断逼近x0,这是函数导数的定义:




可以由此得到







从几何图形上看,因为导数是切线,通过不断迭代,导数与x轴的交点会不断逼近x0。



对于一般情况:



将m=2代入:


def sqrt_newton(num):x=sqrt(num)y=num/2.0count=1while abs(y-x)>0.00000001:print count,ycount+=1y=((y*1.0)+(1.0*num)/y)/2.0000return yprint(sqrt_newton(5))
print(sqrt(5))

运行结果:

1 2.5
2 2.25
3 2.23611111111
2.23606797792
2.2360679775


精确到亿分之一,牛顿法只迭代了3次,是二分法的十倍


3:利用牛顿法求开立方

def cube_newton(num):x=num/3.0y=0count=1while abs(x-y)>0.00000001:print count,xcount+=1y=xx=(2.0/3.0)*x+(num*1.0)/(x*x*3.0)return xprint(cube_newton(27))	


微积分、概率、线代是高级算法的基础课。可是,这么多年,已经忘得差不多了..............................





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

相关文章

牛顿迭代法-求平方根

牛顿迭代法 求出根号a的近似值&#xff1a;首先随便猜一个近似值x&#xff0c;然后不断令x等于x和a/x的平均数&#xff0c;迭代个六七次后x的值就已经相当精确了。 例如&#xff0c;我想求根号2等于多少。假如我猜测的结果为4&#xff0c;虽然错的离谱&#xff0c;但你可以看到…

迭代法求平方根-C

迭代法求a的平方根的近似值&#xff0c;计算公式如下&#xff1a; 迭代是重复反馈过程的活动&#xff0c;目的是为了逼近所需目标或结果。每次对过程的重复称为一次“迭代”&#xff0c;而每一次迭代得到的结果会作为下一次迭代的初始值。 算法&#xff1a;先给定一个假设的平…

用迭代法求某数a的平方根

今天晚上笔试题目最后一题很简单&#xff0c;可是自己做不出 &#xff0c;就是不用库函数&#xff0c;求一个浮点数的平方根。 立马想到用物理法&#xff0c;比如正方形的面积法等&#xff0c;可是求解出不出&#xff0c;然后就绕在里面了。归根到底还是平时的知识储备太少了&…

Java基础——运行时异常和非运行时异常

文章目录 Java中异常机制的体系结构Error&#xff08;错误&#xff09;Exception&#xff08;异常&#xff09;运行时异常和非运行时异常的区别结束 Java中异常机制的体系结构 在Java中&#xff0c;万物皆对象&#xff0c;异常也不例外。 Exception&#xff08;异常&#xff0…

Java编译时异常与运行时异常的区别

Java的异常可以分为编译异常和运行异常&#xff0c;其主要区别&#xff1a; 编译异常要求程序员必须处理&#xff08;捕获或者抛出&#xff09;&#xff0c;不然没法通过编译。 而运行异常可以不处理。 这应该是纸面最明显的区别了&#xff0c;我认为更重要的区别是在处理机…

运行时异常与非运行时异常有什么区别?

运行时异常与非运行时异常有什么区别&#xff1f; 运行时异常 RuntimeException 又称为非检查异常 uncheck exception。是 Exception 的子类。 在 Java 中&#xff0c;异常可以分为两种。Error 和 Exception&#xff0c;它们的父类是 Throwable。 Error 一些底层的类出错&…

杂谈——运行时异常和普通异常有什么区别

说到异常&#xff0c;大家都熟悉&#xff0c;只要程序出错了&#xff0c;那么肯定会说&#xff1a;“哎呀&#xff0c;我的程序出错啦~它抛出异常啦”。 但单单以“异常”的名称来称呼它们&#xff0c;未免也太粗糙了。我们毕竟是一个精致的程序员&#xff0c;当然得知道他们到…

常见的编译时异常和运行时异常

常见的编译时异常和运行是异常 1、粉红色的是编译时异常 2、绿色的异常是运行时异常 3、声明为Error的&#xff0c;则属于严重错误&#xff0c;如系统崩溃、虚拟机错误、动态链接失败等&#xff0c;这些错误无法恢复或者不可能捕捉&#xff0c;将导致应用程序中断&#xff0c;…

浅谈Java异常及其编译时异常和运行时异常的区别

异常是程序编码和运行时经常发生的事件&#xff0c;了解异常有助于我们提高代码质量&#xff0c;增强系统的健壮性&#xff0c;这里总结一下Java编程中的异常、以及Java编译时异常和运行时异常的区别&#xff0c;并列举几种常见的异常&#xff0c;以供参考学习。 一、什么是异…

Java 运行时异常和非运行时异常

异常类型分为两类&#xff1a;运行时异常和非运行时异常。 一、运行时异常&#xff1a; 运行时异常&#xff08;RuntimeException&#xff09;&#xff0c;一般不需要程序员进行捕获。 例如&#xff1a;NullPointException&#xff0c;IndexOutOfBoundsException。如果不对该…

Java-异常处理(编译时异常、运行时异常及处理机制,自定义异常)

个人简介 大家好&#xff0c;我是翰慧腾。一名正在努力学JAVA的大一小白&#xff0c;本文章为初学的笔记&#xff0c;希望各位多多指教。&#x1f499;欢迎点赞收藏留言&#x1f49c;你要批评指点四周风景&#xff0c;首先你要爬上屋顶&#x1f9e1; 一、异常 概述&#xff1a…

通俗理解运行时异常和非运行时异常(一般异常)

一&#xff0c;异常的概念 Java异常类层次结构图&#xff1a; Throwable&#xff1a; 有两个重要的子类&#xff1a;Exception&#xff08;异常&#xff09;和 Error&#xff08;错误&#xff09;&#xff0c;二者都是 Java 异常处理的重要子类&#xff0c;各自都包含大量子类…

运行时异常与检查异常区别

首先&#xff0c;思考一个问题&#xff0c;看下面三个代码&#xff0c;当抛出异常时&#xff0c;后面的代码还会运行吗&#xff0c;是否要在异常后加上return语句&#xff1f; //代码1 public static void test() throws Exception {throw new Exception("参数越界"…

编译时异常与运行时异常

在实际开发中&#xff0c;经常会在程序编译时产生一些异常&#xff0c;必须要对这些异常进行处理&#xff0c;这种异常称为编译时异常&#xff0c;也称为checked异常。另外&#xff0c;还有一种异常是在程序运行时产生的&#xff0c;这种异常即使不编写异常处理代码&#xff0c…

异常Exception 和 运行时异常RuntimeException

文章目录 概念 概念 Java中的所有异常都来自顶级父类Throwable。 Throwable下有两个子类Exception和Error。 Error是程序无法处理的错误&#xff0c;一旦出现这个错误&#xff0c;则程序将被迫停止运行。Exception不会导致程序停止&#xff0c;又分为两个部分RunTimeExceptio…

运行时异常与检查异常

Java把异常当做对象来处理&#xff0c;并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类&#xff1a;错误Error和异常Exception&#xff0c;Java异常体系结构如下图所示&#xff1a; 1.Throwable Throwable类是所有异常或错误的超类&#xff0…

运行时异常和编译异常

1.概念&#xff1a; Java中将程序执行中发生的不正常情况称为异常(Exception) 2.分类 Error(错误)&#xff1a;JVM无法解决的严重问题&#xff0c;程序会崩溃&#xff0c;比如JVM系统内部错误、资源耗尽等Exception&#xff1a;因编程错误等外在因素导致的一般性问题&#xff0…

Java Exception

Java Exception ####分类 Types of Exception There are mainly two types of exceptions: checked and unchecked where error is considered as unchecked exception. The sun microsystem says there are three types of exceptions: Checked Exception Unchecked Exce…

Java运行时异常和非运行时异常

1.Java异常机制 Java把异常当做对象来处理&#xff0c;并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常分为两大类&#xff1a;错误Error和异常Exception&#xff0c;Java异常体系结构如下图所示&#xff1a; 图片来源&#xff1a;http://blog.csdn.net/w…

jdk和jre的区别还有maven

1.关于JDK的安装和配置问题 jdk我已经安装了(版本是1.8._60的--->并且完成相关的环境的配置) 还有环境的变量都配置好了的(java_home path 都配置好了的) JDK与JRE的区别 JRE&#xff1a; Java Runtime Environment JRE可以支撑Java程序的运行&#xff0c;包括JVM虚拟机&…