Exercise 1.8 牛顿法求立方根

题目:

  Newton‘s method for cube roots is based on the fact that if y is an approximation to the cube root of x, then a better approximation is given by the value: (r/(y*y)+2*y)/3. Use this formula to implement a cube-root procedure analogous to the square-root procedure. (In section 1.3.4 we will see how to implement Newton‘s method in general as an abstraction of these square- root and cube-root procedures.)

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

牛顿法求平方根、立方根,实际上拥有共同的概念元素:

  1. 前一个逼近值(previous guess)

  2. 当前逼近值(current guess)

  3. 目标值(x)

  4. 判断当前逼近值是否已经足够好(good_enough)

  5. 根据x和current guess求出下一个逼近值(improve_guess)

平方根、立方根的唯一差异在于improve_guess的具体实现,即题目中黑体加粗的求值公式。

平方根:

def improve_sqrt(guess: Double, x: Double): Double = {
        return (x / guess + guess) / 2
}

立方根:

def improve_cubert(guess:Double, x:Double):Double={
        return (x/(guess*guess)+2*guess)/3
}

计算引擎是:

def root_iter(prev_guess: Double,
                  guess: Double,
                  x: Double,
                  good_enough: (Double, Double, Double) => Boolean,
                  improve:(Double,Double)=>Double): Double = {
        if (good_enough(prev_guess, guess, x)) {
            return guess
        } else {
            root_iter(guess, improve(guess, x), x, good_enough, improve)
        }}
时间: 2024-08-27 10:21:41

Exercise 1.8 牛顿法求立方根的相关文章

考察数据类型的掌握---题目1166:迭代求立方根 (2009年北京航空航天大学计算机研究生机试真题)

题目描述: 立方根的逼近迭代方程是 y(n+1) = y(n)*2/3 + x/(3*y(n)*y(n)),其中y0=x.求给定的x经过n次迭代后立方根的值. 输入: 输入有多组数据.每组一行,输入x n. 输出: 迭代n次后的立方根,double精度,保留小数点后面六位. 样例输入: 3000000 28 样例输出: 144.224957 #include "stdio.h" int main(int argc, char* argv[]) {     long n;     dou

求立方根算法--个人对立方根算法的穷举和优化

在hpe实训中心学习,遇到了求立方根的题目,在此做一下算法笔记, 分析过程: 数n的立方根就是n=i*i**i;所以我们会优先想到一下方法. static double g32(double n){ //简易版 double i = 0, k = 0.0005f; if (n < 0) { //输入负数判断 k /= -1; } do{ i+=k; }while(abs(i*i*i)<abs(n)); //abs为自己写的求绝对值方法 return i; } 可以看出此方法的求解精度为0.00

牛顿法求平方根

求平方根的方法有很多种,这里介绍的是牛顿法求平方根. 方法是这样的:如果对x的平方根的值有了一个猜测y,那么就可以通过执行一个简单操作去得到一个更好的猜测:只需求出y和x/y的平均值(他更接近实际的平方根值) 代码实现: float sqrt(float x) { float guess = x; while (guess * guess - x > 0.0001) { guess = (guess + x / guess) / 2; } return guess; } 注:这一平方根算法实际上

求立方根

求解立方根或者是平方根甚至是N次方根,均可用牛顿迭代法求解. 牛顿迭代法如下所示: #include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> #include <cmath> using namespace std; double Lifanggen(double src) { double curx,

算法练习之牛顿法求平方根

牛顿法求平方根公式:Xn+1 = 1/2 * (Xn+ a/Xn); 若求a的平方根,将公式进行迭代计算迭代越多,越接近结果最后Xn为a的平方根 代码实现: 参数:要求平方根的数,迭代次数 var sqrt = function (a,accur){ var pre = 1; for(var i = 0;i<accur;i++){ var cur = 1/2 * (pre + a/pre); pre = cur; } return cur; } console.log(sqrt(2,10000)

牛顿法求极值

在机器学习课上,Doctor夏弥 在详解了梯度下降法之后,又给出了牛顿法来求极值.当时我们却是一脸懵的,回来温习时发现,这本该就是个高中知识,丢人丢到国外了哦! 如下图所示的曲线,我们需要求的是f(x)=的解: 而对于一脸懵的原因,我想是因为我们忘记了高中所学的点斜式,直接贴一张高中数学讲义: 因为我们一路沿着x轴去寻找解,所以迭代求f(x)=0的解得通用式为: 与梯度下降相比,牛顿法也同样是沿着曲线的斜率去寻找极值,但是不存在需要自定义learning rate的问题,因为alpha是由斜率来

如何用牛顿法求一个数的平方根

SCIP 1.1.7的一个练习. 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法.多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要.方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根.牛顿迭代法老品牌娱乐城是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以

牛顿法求值

代码 新建文件 newton.m function [x k]=newton(f,df,x0,ep,N) k=0; while k<N x=x0-feval(f,x0)/feval(df,x0); if abs(x-x0)<ep break end x0=x; k+=1; end endfunction f : 传入的待求值函数 df : 待求值函数的导数 x0: 起始值 ep : 精度值,小于改值认为求得结果 N : 逼近最大次数,防止程序死掉 原理就是不断用切线进行逼近,直到小于要求的精度

牛顿法求平方根可拓展

int mySqrt(int x) { double t=1.0; //初始迭代值 double cheak; //误差 double p = 1e-2; //误差上限 do { t = (x / t + t) / 2.0; cheak = t * t - x; } while((cheak >= 0 ? cheak : -cheak) > p); return (int)t; } double myCube(int x) { double t=1.0; double cheak; doubl