C1.cpp
上传用户:zhdd911129
上传日期:2007-05-11
资源大小:722k
文件大小:2k
源码类别:

matlab例程

开发平台:

Matlab

  1. //C1
  2. //Solve a function,using Newton Methom
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <iostream.h>
  6. #include <time.h>
  7. //Original Function
  8. double func(double x)  
  9. {
  10. return x*x*x+x*x-3*x-3;
  11. }
  12. //Differencial Function
  13. double dfunc(double x)
  14. {
  15. return 3*x*x+2*x-3;
  16. }
  17. //decide whether a number is approximate enough to 0
  18. int iszero(double x)
  19. {
  20. if (fabs(x)<1e-7)
  21.     return 1;
  22. else
  23. return 0;
  24. }
  25. //Newton Methom
  26. //Troot:tolerantion of root;Tf:toleration of function
  27. int nmf(double x,double Troot,double Tf,long N,int time)      
  28. {
  29. double x1;
  30.     if (iszero(dfunc(x))==0    &&   N>0    )
  31. {
  32. x1=x-func(x)/dfunc(x);
  33. time++;
  34. if (fabs(x1-x)<Troot  ||   fabs(func(x1))<Tf)
  35. {   
  36. cout<<"The root is: "<<x1<<endl;              //output the root
  37. cout<<"The error is: "<<fabs(func(x1))<<endl; //output the error
  38. cout<<"iteration times"<<time;
  39. return 1;
  40. }
  41. else
  42. {
  43. nmf(x1,Troot,Tf,N-1,time);
  44. }
  45. }
  46. else
  47. {
  48.      cout<<"This methom doesnot work properly.It will return a unkonwn number"<<endl;
  49. }
  50. return 0;
  51. }
  52. void main()
  53. {
  54. double x=1.5,Troot=1e-7,Tf=1e-7;          //Initilaze node and tolerance
  55. long N=1000000;       
  56. clock_t start, finish;                    //Initilaze times
  57.     start = clock();                          // Gets system time 
  58. nmf(x,Troot,Tf,N,0);       
  59. finish = clock();                         // Gets system time again 
  60. cout<<"The methom takes time: "<<(double)(finish - start) / CLOCKS_PER_SEC<<endl;
  61. cin>>x;
  62. }
  63. //解为x=1.73205
  64. //仅迭代4次,精度达到了7.977e-12,程序执行时间<0.01s
  65. //可见在知道解的大致值的情况下,Newton Methom是相当好的解法