牛頓定理的詳細講解
求數(shù)的開方時想到了通常都是用牛頓法來求解,因此學習一下并用C++簡單的實現(xiàn)數(shù)的開方。
定理:
??若 f 二階可導,那么在待求的零點 x 周圍存在一個區(qū)域,只要起始點 x0 位于這個鄰近區(qū)域內(nèi),那么牛頓-拉弗森方法必定收斂。
計算:
對自然數(shù) a 的開方可以轉化為
然后利用
反復迭代直至
即可。
注意:
??1. 如果不幸選了駐點(stationary point/ critical point),導致切線與x軸平行,那就完蛋了。
??2. 這個函數(shù)在定義域內(nèi)最好是二階可導。
??3. 這方法只能求一個解,如果函數(shù)有多解,就不行了。
代碼:
#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);
}
}


