使用牛顿-拉弗森法定义平方根函数(Newton-Raphson method Square Root Python)

牛顿法(Newton’s method)又称为牛顿-拉弗森法(Newton-Raphson method),是一种近似求解实数方程式的方法。(注:Joseph Raphson在1690年出版的《一般方程分析》中提出了后来被称为“牛顿-拉弗森法”的数学方法,牛顿于1671年写成的著作《流数法》中亦包括了这个方法,但该书在1736年才出版。)

之前的一篇博客中提到的二分法可以求解方根,而使用牛顿迭代法可以更快地解出方根。现在,人们使用的计算器里面大多数都是运用的牛顿迭代法。

假设n=x2,现在需要求n的方根,n=x2亦即x2-n=0,把它转换成方程式f(x)=x2-n,如上图所示。

选取作为求解方根的初始近似值,过点作切线T,T的方程为,求出T与x轴交点的横坐标,称x1为n方根的一次近似值。

过点再作切线,并求得该切线与x轴交点的横坐标,称为n方根的二次近似值。

以此类推,得到牛顿法的迭代公式: (注:f‘(xn)是导数,这里也就是切线的斜率,数值是2*xn)。

猜测值在经过多次迭代后会越来越接近曲线的根,用数学术语来说就是,这个方程式在的时候收敛,故能求得近似n方根的值。

总的图示如下:

代码如下:

def sqrt_NR(n):    ‘‘‘为了方便起见,先假设n为正数‘‘‘    guess=n/2  # 设置初始猜测值为n的一半    diff=guess**2-n  # f(Xn)    count=1  # 设置猜测次数起始值为1    while abs(diff)>0.001 and count<100: # 当猜测值的平方和n本身的差值无限接近误差值时,循环才会停止;同时设置猜测次数不超过100次        guess=guess-diff/(2*guess)  # 根据牛顿法的迭代公式Xn+1=Xn-f(Xn)/f‘(Xn),将上一次的猜测值减去f(Xn)/导数的值赋予新的猜测值        diff=guess**2-n  # 更新f(Xn)        count+=1  # 猜测次数每次增加1    return guess

调用此函数试一下:

print(sqrt_NR(8))

运行结果如下:

2.8284313725490198

二分法和牛顿法对比:

把这两个函数的eplison都设置为0.01,增加显示count

运行:

print(“二分法: ", sqrt_bi(8))print("牛顿法: ", sqrt_NR(8))

结果如下:

二分法:    (2.828369140625, 15)

牛顿法:    (2.8284313725490198, 4)

是不是牛顿法比二分法快多了?

参考:麻省理工学院公开课:计算机科学及编程导论  (第6课)

时间: 2024-10-29 14:30:01

使用牛顿-拉弗森法定义平方根函数(Newton-Raphson method Square Root Python)的相关文章

MIT公开课: Python 笔记6 二分法,牛顿-拉夫森方法,列表

Lecture5: Bisection methods , Newton/Raphson, introduction to lists二分法,牛顿,拉复生方法,列表 Bisection methods 二分法 注意: # bug: when x < 1, sqrt(x) > x = high eg.x=0.25 sqrt(x) = 0.5 # fix bug: high = max(x, 1.0) def squareRootBi(x, epsilon): """

牛顿方法(Newton&#39;s Method)

在讲义<线性回归.梯度下降>和<逻辑回归>中我们提到可以用梯度下降或梯度上升的方式求解θ.在本文中将讲解另一种求解θ的方法:牛顿方法(Newton's method). 牛顿方法(Newton's method) 逻辑回归中利用Sigmoid函数g(z)和梯度上升来最大化?(θ).现在我们讨论另一个最大化?(θ)的算法----牛顿方法. 牛顿方法是使用迭代的方法寻找使f(θ)=0的θ值,在这里θ是一个真实的值,不是一个参数,只不过θ的真正取值不确定.牛顿方法数学表达式为: 牛顿方法

牛顿迭代法(Newton&#39;s Method)

牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.但是,这一方法在牛顿生前并未公开发表. 牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程. 对于形如f(x)=0的方程,首先任意估算一个解x0,再把该估计值代入原方程中.由于一般不会正好选择到正确的解,所以有f(x)=a.这时计算函数在x0处的斜率,和这条斜率与x轴的交点x1. f(x)=0中精确解的意义是,当取得解的时候,函数值为零(即f(x)的

团队博客-第六周:Alpha阶段项目复审(科利尔拉弗队)

团队的排名-点评:以下排名点评谨代表个人观点,如有冒犯,评论联系删除 小组名字和链接 优点 缺点,bug报告(至少140字) 最终名次(无并列) 中午吃啥队 微信小程序应用,新型app会是一个便利的使用系统,有较完整的 团体结构,有想法要实现管理系统可同时提供给商家和用户 如果跟测试文档中所示一样的话,没有什么缺点,有的话可能是 UI样式不太新颖  1  小谷围驻广东某工业719电竞大队 具有一个较为完整的系统,功能多样可以满足用户的多种需求,是 一个贴近广工学生生活的一个社交.交易网站. 当前

团队博客-第五周:测试与发布(科利尔拉弗队)

测试: BUG: (1)主页帖子列表排序出错,未按照帖子最新回复和帖子发布时间排序,已修复 (2)注册时邮箱验证和注册成功跳转不完善,未修复 (3)数据传输方式错误,已修复 场景测试: 预期用户可以跟使用其他相似的社区网站一样正常使用本网站,但是猫匿社区提供了匿名方式,让用户在对问题的讨论中抛弃个人身份限制,其他人不会知道别人的身份,从而取消了身份对言论的限制,你可以畅所欲言,但不容许散播谣言.使用不恰当言论攻击他人或国家. 测试矩阵: 在windows系统上进行测试,使用谷歌浏览器.360浏览

团队博客-第六周:事后诸葛亮分析报告(科利尔拉弗队)

总结: 在本次团队项目中,作为组长的我也学会了一些如何促进成员进行项目开发的方式,例如:为团队开发任务制定计划,督促组员按时完成,该催成果的还是该催一催. 讲讲对于这个项目的一些总结,由于该项目一个Web项目,所以在联络人员组成队伍后便开始了开发技术的确定:后台使用springboot框架开发,前端使用HTML+CSS+JS开发, 数据库使用MySQL关系数据库并使用Navicat可视化功能对数据库进行设计,将项目布置到阿里云服务器进行发布.在这些阶段中,各个成员也获取了自己想要的知识:后台人员

(平方幂母函数)hdu 1398 Square Coins

Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8891    Accepted Submission(s): 6067 Problem Description People in Silverland use square coins. Not only they have square shapes but

定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在main方法中构造3个对象,调用showArea方法。(体现多态)

实现多态的三个条件:1.要有继承2.要有抽象方法重写3.用父类指针(引用)指向子类对象 重载重写重定义的区别: 1.重载:在同一个类中进行; 编译时根据参数类型和个数决定方法调用; 子类无法重载父类; 父类同名方法被子类该方法覆盖. 2.重写:在父类和子类之间进行; 父类与子类方法有完全相同类型; 在运行时根据具体对象类型决定方法调用; 3.在重写中有抽象方法的会产生多态;没有使用抽象方法叫重定义 以下具体代码具体分析: package test3;abstract class Shape{ /

欧拉工程第57题:Square root convergents

题目链接 Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; class level57{ void solve0(){ /*** a a+2b --- ------- b a+b ***/ int count = 0; BigInteger a=BigInteger.va