我将在“ACM--SOJ总结”中写关于二分法逼近求方程的解(尤其是不能显化的).这篇是pengkuny C++ blog中的一篇,我觉得很有必要摘录一下,供大家参详。/** 牛顿迭代法求方程的一个实根
牛顿公式:x(k+1) = x(k) - f(x(k)) / f '(x(k))
迭代函数:Ф(x) = x - f(x) / f'(x)
属性:方程求根迭代法 此时的迭代函数必须保证X(k)有极限,即迭代收敛。
**/代码如下:
#include < iostream > #include < cmath > using namespace std; #define f(x) (x*x*(x-1.0)-1.0) // 举例函数x^3-x^2-1 #define g(x) (3.0*x*x-2.0*x) // 导函数3x^2-2x #define epsilon 0.0000001 // 精度 #define MAXREAPT 100 bool RootNewton( double & x) { double xk1,xk0; xk0 = x; for ( int k = 0 ; k < MAXREAPT; k ++ ) { if (g(xk0) == 0.0 ) // 牛顿迭代法缺陷在于:收敛是否与初值x0密切相关 { // 如果g(xk0)数值特别小时,有可能发生从一个根跳到另一个根附近的情况 cout << " 迭代过程中导数为0. " << endl; return false ; } xk1 = xk0 - f(xk0) / g(xk0); // key step if (fabs(xk1 - xk0) < epsilon && fabs(f(xk1)) < epsilon) { // 注意迭代结束条件是: |f(xk1)| < ε和|xk1-xk0| < ε同时成立,防止根跳跃 x = xk1; return true ; } else { xk0 = xk1; } } // 迭代失败 cout << " 迭代次数超过预期. " << endl; return false ;} int main() { double x; cout << " 牛顿迭代法求方程根,请输入初始迭代x0值: " << endl; cin >> x; if (RootNewton(x)) { cout << " 该值附近的根为: " << x << endl; } else { cout << " 迭代失败! " << endl; } system( " pause " ); return 0 ;}