【算法】牛顿迭代法求平方根及多次方根

article/2025/10/1 9:30:53

1. 概述

牛顿迭代法 牛顿迭代法 牛顿迭代法 是非常高效的求解方程的根的方法。其求解原理可以参考各文献。大体的思路如下:

通过不断地做切线来逼近真实的根,直到误差小于精度。

可得迭代公式:

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)

 
通过这种不断地做切线的方法,直到 ∣ x n − x ∗ ∣ < 给定的精度 |x_n - x_*| < 给定的精度 xnx<给定的精度,在误差范围内可以认为 x n x_n xn 就是方程的根了。


2. 牛顿法求平法根

假设我们要求解n的平方根,那么我们可以构建函数 f ( x ) = x 2 − n f(x)=x^2-n f(x)=x2n

那么方程 x 2 − n = 0 x^2-n=0 x2n=0 的理论根为 x = n x=\sqrt{n} x=n ,即求解这个方程得到的根就是求的n的平方根。

例如求5的平方根,那么可以构建函数 f ( x ) = x 2 − 5 f(x)=x^2-5 f(x)=x25,方程 x 2 − 5 = 0 x^2-5=0 x25=0 的理论根即为 5 \sqrt{5} 5 ,在误差范围内,用牛顿法求解出方程 x 2 − 5 = 0 x^2-5=0 x25=0 的根即可认为是5的平方根。


迭代公式

构建函数

f ( x ) = x 2 − n f(x)=x^2-n f(x)=x2n

 
那么有:

f ′ ( x ) = 2 x f'(x)=2x f(x)=2x

 
根据牛顿法的迭代公式有:

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)
= x n − x n 2 − n 2 x n \quad \quad =x_n-\frac{x_n^2-n}{2x_n} =xn2xnxn2n
 
= x n + n / x n 2 \quad\quad =\frac{x_n+n/x_n}{2} =2xn+n/xn

 
代码

/*** @author allen* @date 2022/9/19*/
public class Main2 {public static void main(String[] args) {double n = 987654321;double x = 0.0000001;double res = sqrt(n, x);System.out.println(res);}public static double sqrt(double n, double x) {double k = n / 2;while (Math.abs(k * k - n) > x) {k = (k + n / k) / 2;}return k;}
}

 
Python3库函数求平方根验证

可见,误差在给定的范围内。

 

3. 牛顿法求多次方根

跟求平方根同理,只是构建的函数不同,例如求解m次方根,那么就需要构建函数

f ( x ) = x m − n f(x)=x^m-n f(x)=xmn

 
那么就有:

f ′ ( x ) = m ∗ x m − 1 f'(x)=m*x^{m-1} f(x)=mxm1

 
根据牛顿法的迭代公式有:

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)
 
= x n − x n m − n m ∗ x n m − 1 \quad\quad =x_n-\frac{x_n^m-n}{m*x_n^{m-1}} =xnmxnm1xnmn

 
例如求解n的3次方根,那么就有:

x n + 1 = x n − x n 3 − n 3 ∗ x n 2 x_{n+1}=x_n-\frac{x_n^3-n}{3*x_n^2} xn+1=xn3xn2xn3n

 
代码

package cn.pku.edu.algorithm;/*** @author allen* @date 2022/9/19*/
public class Main2 {public static void main(String[] args) {double n = 123456789;double x = 0.0000001;double res = sqrt3(n, x);System.out.println(res);}public static double sqrt3(double n, double x) {double k = n / 3;double k2, k3;do {k2 = k * k;k3 = k2 * k;k = k - (k3 - n) / (3 * k2);} while (Math.abs(k * k * k - n) > x);return k;}
}

 
Python3验证123456789开3次方的结果为

可见,误差被控制在给定的范围内。

 

参考文献

[1] 牛顿迭代法.


http://chatgpt.dhexx.cn/article/1X6qo4sG.shtml

相关文章

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

求一个数的平方根函数sqrt(int num) ,在大多数语言中都提供实现。那么要求一个数的平方根&#xff0c;是怎么实现的呢&#xff1f; 实际上求平方根的算法方法主要有两种&#xff1a;二分法(binary search)和牛顿迭代法(Newton iteration) 1&#xff1a;二分法 求根号5 a:折半…

牛顿迭代法-求平方根

牛顿迭代法 求出根号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…