algo.cpp 955 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "algo.hpp"
  2. void Thomas(size_t n,double* a,double* b,double* c,double* d,double* x){
  3. double last=c[0]=c[0]/b[0];
  4. for(size_t i=1;i<n-1;++i){
  5. last=c[i]=c[i]/(b[i]-a[i-1]*last);
  6. }
  7. last=d[0]=d[0]/b[0];
  8. for(size_t i=1;i<n;++i){
  9. last=d[i]=(d[i]-a[i-1]*last)/(b[i]-a[i-1]*c[i-1]);
  10. }
  11. last=x[n-1]=d[n-1];
  12. for(int i=n-1;i>0;--i){
  13. last=x[i-1]=d[i-1]-c[i-1]*last;
  14. }
  15. }
  16. double
  17. norm2(double* u,size_t n){
  18. double r=0;
  19. for(size_t i=0;i<n;++i){
  20. double t=u[i];
  21. r+=(t*t);
  22. }
  23. return sqrt(r);
  24. }
  25. double
  26. error2(double* u,double* v,size_t n){
  27. double r=0;
  28. for(size_t i=0;i<n;++i){
  29. double t=u[i]-v[i];
  30. r+=(t*t);
  31. }
  32. return sqrt(r);
  33. }
  34. void
  35. clear(double* u,size_t n){
  36. for(size_t i=0;i<n;++i){
  37. u[i]=0;
  38. }
  39. }
  40. void
  41. display(string name,double* u,size_t n){
  42. cout<<"------| "<<name<<" |------"<<endl;
  43. for(size_t i=0;i<n;++i){
  44. cout<<i<<" : "<<u[i]<<endl;
  45. }
  46. cout<<"--------------------------"<<endl;
  47. }