#include //x*x-a=0
#include
#include
main()
{
double x0,x1,f1,f0=1;
int k=0;
float a;
printf("///通过式子x*x-a=0,计算a的平方根(Newton):\n输入a的值:\n");
scanf("%f",&a);
printf("输入个根的初始值:\n");
scanf("%lf",&x0);
printf("k x0\n");
while(fabs(f0)>=1e-12)//这条语句可以设置值的精度
{
f1=2*x0;
if(f1==0)
{
printf("uncorrect number \n");
return 0;
}
f0=x0*x0-a;
x1=x0-f0/f1;
x0=x1;
printf("%d %.16f\n",k++,x0);
}
printf("%.16f\n",x0);
}
用牛顿法来求一个数的平方根,大致步骤是:
1: 输入要求的值和精度(本程序是-12次方)
2:f0=f(x0)已知方程,f1为f0的导函数。
3:while |f0|<精度
1)x1=x0-f0/f1。
2)x0=x1。
3)转 2:
end while
4:输出x1。
牛顿法还有一些修正算法,大家可以另外去找找看。
还有一种二分法,但是他的收敛速度要慢一些
#include //x*x-a=0,a=2;
#include
main()
{
double x0,x1,x2,f1,f2,f0;
int k=0;
float a;
printf("///通过式子x*x-a=0,计算a的平方根(二分法):\n输入一个正数:\n");
scanf("%f",&a);
do
{
printf("输入根所在的区间:x1,x2 (x1>=0 , x2>=0)\n");
scanf("%lf,%lf",&x1,&x2);
f1=x1*x1-a;
f2=x2*x2-a;
if(f1*f2>0 || x1<0 || x2<0)
printf("所在的区间无解\n");
}
while(f1*f2>0 || x1<0 || x2<0);
printf("--------------------------------------------------\n");
printf("k x1 x2\n");
do
{
x0=(x1+x2)/2;
f0=x0*x0-a;
if(f1*f0<0)
{
x2=x0;
f2=f0;
}
else
{
x1=x0;
f1=f0;
}
printf("%d %.16f %.16f\n",k++,x1,x2);
}
while(fabs(x1-x2)>=1e-8);
printf("%.16f\n",x0);
}
二分法大家比较熟悉就不讲了。
---by adrian
阅读(2024) | 评论(0) | 转发(0) |