算法之牛顿法求平方根+立方根

author:onceday date:2022年6月8日

1.基于Scheme语言

牛顿法基于以下几步来求出平方根:

  • 先给出一个猜测值y
  • 判断猜测值y是否与目标值非常接近,已经足够好,可以直接使用。
  • 如果不是足够好,则需要进一步改进猜测值。
  • 递归执行,直到得出足够好的值。

将上面的步骤写成代码如下:

;;;定义求平方根的迭代过程
(define (sqrt_iter guess x)(if (good_enough? guess x)guess(sqrt_iter (improve guess x) x))
)

如何判断猜测值是否足够好呢?可以根据猜测值的平方与被开方数之差小于某个固定值,如0.0001;

;;;定义猜测值是否很好的检测方式
(define (good_enough? guess x) (< (abs (- (square guess) x)) 0.001));;;定义绝对值计算
(define (abs x) (if (< x 0)(- x)x));;;定义平方值计算
(define (square x) (* x x))

但是,这对于较大的数来说,不错,因为0.0001相对10,10000等来说是很小的。

但对于0.001来说,其精度就太低了。

因此可以使用百分比来衡量是否足够好,即监视猜测值在从一次迭代到下一次迭代的变化情况,当改变值相对于猜测值的比率很小时就结束。

;;;定义第二种猜测值是否很好的检测方式,利用百分比
(define (good_enough? guess x) (< (/ (abs (- (improve guess x) guess)) guess) 0.0001))

在这个基础上还可以实现求立方根的算法:

  • 使用百分比确定是否足够好
  • 近似值由公式 x / y 2 + 2 y 3 \frac{x/y^2+2y}{3} 3x/y2+2y​计算而来,y是猜测值,x是被开立方数
;;;定义求立方根的迭代过程
(define (cube_iter guess x)(if (good_enough? guess x)guess(cube_iter (improve guess x)x)));;;定义改进猜测的方式
(define (improve guess x) (/ (+ (/ x (square guess)) (* 2 guess)) 3));;;定义平均值计算
(define (average x y) (/ (+ x y) 2));;;定义第二种猜测值是否很好的检测方式,利用百分比
(define (good_enough? guess x) (< (/ (abs (- (improve guess x) guess)) guess) 0.0001));;;定义绝对值计算
(define (abs x) (if (< x 0)(- x)x));;;定义平方值计算
(define (square x) (* x x));;;定义平方根计算,默认初始猜测值1.0
(define (cube_root x) (cube_iter 1.0 x))

注:本内容收集整理于互联网,仅供学习交流之用!

算法之牛顿法求平方根+立方根相关推荐

  1. 利用牛顿法求平方根-Go语言实现

    牛顿法解释 百度的解释如下: 通俗的解释就是:多数方程不存在求根公式,牛顿提出了一种用迭代来求方程近似根的方法.思路就是不断取切线,用线性方程的根逼近非线性方程f(x)=0f(x)=0f(x)=0的根 ...

  2. golang语言牛顿法求平方根

    package mainimport ("fmt" )// 作为练习函数和循环的简单途径,用牛顿法实现开方函数. // 在这个例子中,牛顿法是通过选择一个初始点 z 然后重复这一过 ...

  3. 算法--二分查找--求平方根(循环法/递归法)

    二分查找: 数据需要是顺序表(数组) 数据必须有序 可以一次排序,多次查找:如果数据频繁插入,删除操作,就必须保证每次操作后有序,或者查找前继续排序,这样成本高,二分查找不合适 数据太小,不用二分查找 ...

  4. js求平方根/立方根

    1.Math方法 Math.sqrt(4) // 2 Math.cbrt(8) // 2 2.切线逼近 // 立方根 function mySqrt (x) {if (isNaN(x)) return ...

  5. python牛顿法算立方根_Exercise 1.8 牛顿法求立方根

    题目: Newton's method for cube roots is based on the fact that if y is an approximation to the cube ro ...

  6. python 求平方根

    如果不调用库函数,可以用二分法或者牛顿法求平方根. 牛顿法 推导过程如下 def solve(x,ratio):num=xwhile(True):num=(num+x/num)/2if(abs(x-n ...

  7. 算法-二分法和牛顿法求指定精度平方根

    一.引言 给定某个整数,给定固定精度,求该整数对应精度的平方根. 假设目标数字为 targrt,则寻找平方根数使得 sqrt(target) = Left = Right = sqrt(Left * ...

  8. 递归实现牛顿法求整数平方根(原理: 给一个初始值(比如X1 = a/2)迭代求a的平方根,设定一个误差限,不断逼近a X1 = a/2 X2 = (X1+a/X1)/

    题目: /* 递归实现牛顿法求整数平方根(原理: 给一个初始值(比如X1 = a/2)迭代求a的平方根,设定一个误差限,不断逼近a X1 = a/2 X2 = (X1+a/X1)/2 - - - Xn ...

  9. 求平方根sqrt()函数的底层算法效率问题

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然 ...

最新文章

  1. org.apache.ibatis.binding.BindingException: Type interface XXX is not known to the MapperRegistry.
  2. 解决Xcode The selected destination does not support the architecture 错误错误
  3. [Day9]面向对象
  4. 固定DIV不随滚动条滚动
  5. 做技术的,这些观点真的扯淡!
  6. P2447 [SDOI2010]外星千足虫
  7. 【POJ - 1028】 Web Navigation( 栈 or 模拟队列 )
  8. java关于贪吃蛇的源代码_完整的贪吃蛇(蛇吃蛋)Java源代码
  9. 初中计算机网络的教案20分钟,初中网络安全教育教案
  10. 计算机应用教程卢湘鸿,计算机应用教程
  11. ios 边录音边放_iOS 录音、音频的拼接剪切以及边录边压缩转码
  12. java移位运算详解
  13. Java虚拟机类加载器及双亲委派机制
  14. cobar mysql 性能_Cobar
  15. 洛谷 P1357 花园
  16. 《青玉案·元夕》 辛弃疾
  17. 【labelCloud标注软件的使用】
  18. Python-Django-视图
  19. 阿里、京东、字节跳动春招,Java岗offer不好拿?一文带你搞定
  20. Makefile 配置和使用

热门文章

  1. 2020最受欢迎的7个vue管理后台框架
  2. 宠辱不惊 闲看庭前花开花落
  3. 黑马程序员-第一天接触Android,环境搭建
  4. python中difference函数_Python基础篇六 set之difference symmetric_difference
  5. web大作业介绍自己的家乡_四年级暑假作业
  6. 网关神器Kong(一):介绍
  7. 从蓝海战略到长尾理论
  8. 网络关键设备选型及介绍
  9. Vue_插槽_自定义指令_tabbar案例
  10. h1z1加载服务器锁定状态,h1z1进不去游戏锁定状态出错 | 手游网游页游攻略大全...