Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51373
  • 博文数量: 10
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-30 10:39
文章分类

全部博文(10)

文章存档

2007年(10)

我的朋友

分类: C/C++

2007-05-01 01:25:33

#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) |
给主人留下些什么吧!~~