题解 | #求解立方根#
求解立方根
http://www.nowcoder.com/practice/caf35ae421194a1090c22fe223357dca
题目要求
题目要求是对浮点数进行开立方,并且不能使用库函数
思路
学过数值分析的人,都应该有一定的印象。在求解此类的方程的时候,牛顿下山法可以使用。
代码思路
- 牛顿法采用的是迭代求解不断逼近的方法;
- 那么一定有一个循环用于迭代。对于循环,我们一般要想到如何出循环的条件;
- 那么根据原理,我们知道逼近是一个无穷的概念。那么到底逼近到哪,由我们自己来决定。所以出循环的条件就知道了,就是逼近到哪的一个位移值,代码中我设置了一个esp,表示一个比较小的数来逼近。
- 然后就是如何迭代。牛顿法中其实对于初始的X0没有做说明,其实迭代次数与x0有一定关系,如果要减少迭代次数,那么可能x0比较接近零点。
- 关于x立方,我们可以列出一个基本方程 , a 就是我们所要求解立方的原来那个值
- 根据 ,所以说迭代就是根据所求 再次计算 然后得到的值的绝对值与比较,如果满足逼近的位移,那么我们就表示这个值就是开立方的解。
代码
#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;
}