您的位置:首页 > 其它

牛顿迭代式(Newton's Method)解多次方程

2017-05-01 19:45 183 查看
    设r是


的根,选取


作为r的初始近似值,过点


作曲线


的切线L,L的方程为


,求出L与x轴交点的横坐标


,称x1为r的一次近似值。过点


作曲线


的切线,并求该切线与x轴交点的横坐标


,称


为r的二次近似值。重复以上过程,得r的近似值序列,其中,


称为r的


次近似值,上式为牛顿迭代公式。

    以上copy于百度百科,也就是说,对于一个函数f(x),先选择一个点,然后在这个点上作切线,这时在一个很小的范围内,可以近似的将这条切线视为f(x)。然后求出这条切线与x轴的交点,如果足够相近的话,就可以说这个点就是f(x)的解了。而如何让这个解更为精确,方法就是再求出这个横坐标在f(x)上的点,然后继续作切线。这样一直画下去,这个交点也会越来越接近真正的解。

    以下代码为解出一个三次方程的代码,输入这个三次方程的系数,然后用迭代法再一步一步精确。从哪一个点开始跑就看要求的范围,这里范围是直接从INT_MAX开始跑的,如果要求的范围更小可以根据范围再进行修改。如果要求的是一个正数这样处理就可以,如果要求得到一个负数,则可以将x0初始化为-INT_MAX再进行迭代。然后跑while循环进行迭代,直到得到的数值满足要求的范围为止。迭代的公式就是上面给的公式,求导的要自己算出来代入。然后输入输出就没什么多说的了。

    下面代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
using namespace std;

double NewtonMethod(double a,double b,double c,double d)
{
double x=INT_MAX;//初始化x0
while(abs(a*x*x*x+b*x*x+c*x+d)>0.00001)//使误差小于0.00001
{
x-=(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);//迭代法
}
return x;
}

int main()
{
double a1,b1,c1,d1;
double ans;
while(scanf("%lf%lf%lf%lf",&a1,&b1,&c1,&d1)!=EOF)
{
ans=NewtonMethod(a1,b1,c1,d1);
printf("%.5f\n",ans);//输出五位小数
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: