牛顿迭代法求解多项式方程的近似解

牛顿迭代法又称牛顿-拉夫逊方法(Newton-Raphson method),是牛顿在17世纪提出的一种在实数域和复数域上近似求方程的方法。该方法的基础是利用泰勒展开式。

      方法使用函数f(x)的泰勒级数的前几项寻找方程f(x) = 0 的根。最大优点是在方程f(x)=0的单根附近具有平方收敛,该方法可以用来求方程的重根、复根。

牛顿迭代法求解多项式方程的近似解_第1张图片

计算公式如下:

       设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0)),做曲线y=f(x)的切线L,L与x轴的交点的横坐标x1=x0-f(x0)/f'(x0),

称x1是r的一次近似值,过点(x1,f(x1))做曲线y=f(x)的切线,求该切线与x轴的交点的横坐标为x2=x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,知道r的近似值误足够小。

        

解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。

已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

 

C语言代码实现:

#include
#include



double func(double x) //要求解的函数方程


{


	return x*x*x*x - 3 * x*x*x + 1.5*x*x - 4.0;


}


double func1(double x) //导函数


{


	return 4 * x*x*x - 9 * x*x + 3 * x;


}




int Newton(double *x, double precision, int maxcyc)//maxcyc 最大迭代次数


{
	double x1, x0;


	int k;


	x0 = *x;


	for (k = 0; k < maxcyc; k++)


	{


		if (func1(x0) == 0.0)


		{


			printf("迭代过程中导数为0\n");


			return 0;


		}


		x1 = x0 - func(x0) / func1(x0);


		if (fabs(x1 - x0) < precision || fabs(func(x1)) < precision)//达到设定的精度


		{

			*x = x1;
			return 1;


		}


		else


			x0 = x1; //准备下次迭代

	}


	printf("迭代次数超过预期!\n"); //迭代次数达到,仍没有达到精度


	return 0;


}



int main()


{


	double x, precision;


	int maxcyc;


	printf("输入初始迭代值x0");


	scanf("%lf", &x);


	printf("输入最大迭代次数:");


	scanf("%d", &maxcyc);


	printf("请输入迭代要求的精度:");


	scanf("%lf", &precision);


	if (Newton(&x, precision, maxcyc) == 1)


		printf("该值附近的根为:%lf\n", x);


	else

		printf("迭代失败!\n");


	while(1);


	return 0;


}

 

 

C++实现:

//此函数是用来求3元一次方程ax^3+bx^2+cx+d=0的解

//比如 x^3-27=0,我们就可以输入1 0 0 -27,这样我们就可以得到一个解

#include

#include

using namespace std;

int main()

{double diedai(double a,double b,double c,double d,double x);

double a,b,c,d;

double x=10000.0;

cout<<"请依次输入方程四个系数:";

cin>>a>>b>>c>>d;

x=diedai(a,b,c,d,x);

cout<0.000001)

{x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);

}return x;}

 

Matlab实现:

%定义函数
function y=f(x)
y=f(x) ;%函数f(x)的表达式
function z=f(x)
z=h(x) ;%函数f(x)的导函数表达式

%主程序
x=X;%迭代初始值
i=0;
while i;esp;%收敛判断
X=x0;
else break;
end
i =i+1;
end
fprintf('\n%s%.4f\t%s%d','X=',X,'i=',i);%输出结果

 

 

 

 

你可能感兴趣的:(工程数学)