牛顿定理的详细讲解
求数的开方时想到了通常都是用牛顿法来求解,因此学习一下并用C++简单的实现数的开方。
定理:
若 f 二阶可导,那么在待求的零点 x 周围存在一个区域,只要起始点 x0 位于这个邻近区域内,那么牛顿-拉弗森方法必定收敛。
计算:
对自然数 a 的开方可以转化为
然后利用
反复迭代直至
即可。
注意:
1. 如果不幸选了驻点(stationary point/ critical point),导致切线与x轴平行,那就完蛋了。
2. 这个函数在定义域内最好是二阶可导。
3. 这方法只能求一个解,如果函数有多解,就不行了。
代码:
#define EPSILON 1e-8
template<typename T>
T sqrt(T val)
{
if (val < 0)
{
std::cout << "Illegal Radicand" << std::endl;
}
else if (val == 0)
{
return 0;
}
else
{
int i_times = 0;
float va = static_cast<float>(val);
float v1 = va / 2;
while ((v1 * v1 - va > EPSILON || v1 * v1 - va < -EPSILON) && i_times < 100)
{
v1 = -(v1 * v1 - va) / (2 * v1) + v1;
++i_times;
}
return static_cast<T>(v1);
}
}