牛顿迭代法
牛顿迭代法解非线性方程,是把非线性方程 线性化的一种近似方法。把 在点 的某邻域范围内展开成泰勒级
取其线性部分(即泰勒展开的前两项),并令其等于0,即
以此作为非线性方程的近似方程,若,则其解为, 这样,得到牛顿迭代法的一
个迭代关系式:
已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
牛顿法解决非线性方程的解
假设我们求解的方程为:,则
可知
#include<iostream>
#include<math.h>
using namespace std;
float fun(float x)
{
if (fabs(x*x*x - 3*x*x + 3*x - 1) < 0.000001)
return x;
else
{
return fun((2 * x - 3 /x + 1 /(x*x)) / 3 + 1);
}
}
int main()
{
float a = 2.0;//随机预测方程的值
cout <<"计算出的方程的根为:"<< fun(a) << endl;
}
输出结果为:
若想知道经过多少次的迭代才能计算出方程的根,可输入跌代次数即可。
#include <iostream>
#include <cmath>
using namespace std;
double fun1(double x)
{
return 1*x*x*x-3*x*x+3*x-1; //原函数fun1=(x-1)^3
}
double fun2(double x)
{
return 3*x*x-6*x+3; //原函数的导数fun2
}
int main()
{
double f1,f2,x,d;
int count = 0; //统计迭代的次数
x = 100; //随机赋予的方程的解
do {
f1 = fun1(x); //方程的值
f2 = fun2(x); //方程的导数
d = f1/f2;
x -= d; //更新方程的值
count ++;
cout<<"第"<<count<<"次迭代方程的值为: "<<fun1(x);
cout<<" 当前的近似根为: "<<x<<endl;
} while(fabs(d) > 1e-5);
cout<<"总迭代次数:"<<count<<endl;
cout<<"最终的近似根为:"<<x;
return 0;
}
输出结果如下:
牛顿法求解一个数的立方根
首先:不妨设 , 是求解的立方根的值, 即为 我们实际要求的立方根。
其次:根据牛顿迭代法 ,得到 ,则 .
#include<iostream>
#include<math.h>
using namespace std;
float fun(float x, float y)
{
if (fabs(x*x*x - y) < 0.000001)
return x;
else
{
return fun((2 * x + y / x / x ) / 3, y);
}
}
int main()
{
float a, b;
cin >> a >> b;//a为猜测的立方根,b为实际所要求的立方根。
cout << fun(a, b) << endl;
}
代码运行结果为: