主要思想:
首先,选择一个接近函数零点的,计算相应的和切线斜率(这里表示函数的导数)。然后我们计算穿过点并且斜率为的直线和轴的交点的坐标,也就是求如下方程的解:
我们将新求得的点的坐标命名为,通常会比更接近方程的解。因此我们现在可以利用开始下一轮迭代。迭代公式可化简为如下所示:
已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int a,b,c,d,e;
void diedai(double y)
{
double x=100.0;
while(fabs(a*x*x*x*x-b*x*x*x+c*x*x+d*x+y)>0.000001)
{
x=x-(a*x*x*x*x-b*x*x*x+c*x*x+d*x+y)/(4*a*x*x*x-3*b*x*x+2*c*x+d);
if(x<0||x>100) break;
}
if(x>=0&&x<=100) printf("%.4lf\n",x);
else printf("No solution!\n");
}
int main()
{
int n;
double y;
a=8;b=7;c=2;d=3;e=6;
scanf("%d",&n);
while(n--)
{
scanf("%lf",&y);
diedai(e-y);
}
return 0;
}