题解 | #求解立方根#

求解立方根

http://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca

题目要求

题目要求是对浮点数进行开立方,并且不能使用库函数

思路

学过数值分析的人,都应该有一定的印象。在求解此类的方程的时候,牛顿下山法可以使用。

维基百科-牛顿法

代码思路

  1. 牛顿法采用的是迭代求解不断逼近的方法;
  2. 那么一定有一个循环用于迭代。对于循环,我们一般要想到如何出循环的条件;
  3. 那么根据原理,我们知道逼近是一个无穷的概念。那么到底逼近到哪,由我们自己来决定。所以出循环的条件就知道了,就是逼近到哪的一个位移值,代码中我设置了一个esp,表示一个比较小的数来逼近。
  4. 然后就是如何迭代。牛顿法中其实对于初始的X0没有做说明,其实迭代次数与x0有一定关系,如果要减少迭代次数,那么可能x0比较接近零点。
  5. 关于x立方,我们可以列出一个基本方程 f(x)=x3af(x) = x^3 - a, a 就是我们所要求解立方的原来那个值
  6. 根据 xn+1=xnf(xn)/f(xn)x_{n+1} = x_{n} - f(x_{n})/f^{'}(x_{n}) ,所以说迭代就是根据所求 xn+1x_{n+1} 再次计算 f(xn+1)f(x_{n+1}) 然后得到的值的绝对值与espesp比较,如果满足逼近的位移,那么我们就表示这个值就是开立方的解。

代码


#define pow3(x) ((x)*(x)*(x))
#define pow2(x) ((x)*(x))

const double esp = 1e-5;

double newton_cube(double src)
{
	double x = src / 2.0; // 设置初始的x_0
	do
    {
    	fx = pow3(x) - dst;	// 求解x_n处f(x)的函数值
      	fx_1 = pow2(x)*3;	// 求解x_n处f(x)的一阶导数值
      	x = x - fx/fx_1;	// 迭代x_n+1
    }while(fx < esp || fx > -esp);	// 是否逼近f(x)逼近到0的范围,零点处f(x) = 0
  	return x;
}

全部评论

相关推荐

11-13 20:32
门头沟学院 Java
面向未来编程code:我没看到他咋急,他不就问你个问题。。。
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务