牛顿迭代法:
设定x*是方程f(x)=0的根,选取x0作为x*的近似值,过点(x0, f(x0))做曲线f(x)=0的切线L,L的方程y=f(x0)+f'(x0)(x-x0),求出L与x轴焦点的横坐标x1=x0-f(x0)/f'(x0),称x1为x*的一次近似值,然后设置x0=x1,重复上面的过程,反复迭代,就可以得到一个比较精确的近似值。
代码实现:
#include <iostream> #include <list> using namespace std; /* 定义一个list列表存储方程的表达式 */ typedef list<double> Expression; /* 方程系统的初始化: n为方程的最高项次数 第一个输入的为常数项的系数 第二个输入的为x项的系数 第三个输入的位x平方的系数 。。。。如此类推 */ void Init(Expression *expression) { double n; double temp; cin>>n; for(int i = 1; i <= n+1; i++) { cin>>temp; expression->push_back(temp); } } /* 拿到x的number次方的值 */ double GetValue(int number, double x) { double sum = 1; for(int i = 1; i <= number; i++) { sum *= x; } return sum; } /* 求导数的值: x为变量的值 expression为表达式 */ double DerivativeValue(double x, Expression *expression) { double value = 0; int i = 0; if(!expression->empty()) { for(Expression::iterator it = expression->begin(); it != expression->end(); it++) { if(i != 0) { value += (*it)*i*GetValue(i, x); } i++; } return value; } return 0; } /* 求函数的值 x为变量的值 expression为表达式 */ double GetFunctionValue(double x, Expression *expression) { double value = 0; int i = 0; if(!expression->empty()) { for(Expression::iterator it = expression->begin(); it != expression->end(); it++) { value += (*it)*GetValue(i, x); i++; } return value; } return 0; } /* 牛顿迭代法: expression为表达式 x0为初始值 time为你迭代的次数 */ double NewtonIterator(Expression *expression, double x0, int time) { for(int i = 1; i <= time; i++) { x0 = x0 - GetFunctionValue(x0, expression)/DerivativeValue(x0, expression); } return x0; } int main() { Expression *expression = new Expression(); Init(expression); cout<<NewtonIterator(expression, 1, 10)<<endl; return 0; }