1、算法设计原理分析
使用牛顿迭代法求一元高次方程的解,设x是f(x) = 0的根,选取x0作为x初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f’(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f’(x0),称x1为x的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f’(x1),称x2为x的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f’(x (n)),称为x的n+1次近似值。
需要注意的是牛顿迭代法只能求解有解方程。
2、程序设计
//牛顿迭代法求解一元三次方程的近似解
#include<stdio.h>
#include<math.h>
void root(float a,float b,float c,float d,float num);
int main()
{
double a,b,c,d,n=0,f,f0;
int flag=0;
printf("请依次输入一元三次方程的系数:\n");
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
do
{
printf("请你输入一个可能为方程解的数字:\n");
scanf("%lf",&n);
root(a,b,c,d,n);
printf("请问是否想再输入一个可能的方程解:(想:1,不想:0)\n");
scanf("%d",&flag);
}while(flag==1);
return 0;
}
void root(float a,float b,float c,float d,float num)
{
float x=num,x0,f,f1;
do{
x0=x;
f=((a*x0+b)*x0+c)*x0+d;
f1=(3*a*x0+2*b)*x0+c;
x=x0-f/f1;
}while(fabs(x-x0)>1e-6);
printf( "该方程的一个解为%lf\n",x);
}
3、运行结果
4、算法分析(复杂度)
牛顿迭代法的时间复杂度与精确度以及近似解的估计值有关,这是一种通过收敛的方式求解方程解的方式,讨论时间复杂度很困难。
5、解题收获
学习了牛顿迭代法,牛顿法是采用了局部收敛的方式来求近似解,当初始点选择不当时,往往导致不收敛,而无法求出近似解。