algo.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "algo.hpp"
  2. void Thomas(size_t n,double* a,double* b,double* c,double* d,double* x){
  3. //d[0]=3e-5;
  4. for(size_t i=1;i<n;++i){
  5. double w=a[i-1]/b[i-1];
  6. b[i]=b[i]-w*c[i-1];
  7. d[i]=d[i]-w*d[i-1];
  8. }
  9. x[n-1]=d[n-1]/b[n-1];
  10. for(int i=n-2;i>=0;--i){
  11. x[i]=(d[i]-c[i]*x[i+1])/b[i];
  12. }
  13. }
  14. double
  15. norm2(double* u,size_t n){
  16. double r=0;
  17. for(size_t i=0;i<n;++i){
  18. double t=u[i];
  19. r+=(t*t);
  20. }
  21. return sqrt(r);
  22. }
  23. double
  24. norm1(double* u,size_t n){
  25. double r=0;
  26. for(size_t i=0;i<n;++i){
  27. r+=abs(u[i]);
  28. }
  29. return r;
  30. }
  31. double
  32. error2(double* u,double* v,size_t n){
  33. double r=0;
  34. for(size_t i=0;i<n;++i){
  35. double t=u[i]-v[i];
  36. r+=(t*t);
  37. }
  38. return sqrt(r);
  39. }
  40. void
  41. clear(double* u,size_t n){
  42. for(size_t i=0;i<n;++i){
  43. u[i]=0;
  44. }
  45. }
  46. void
  47. display(string name,double* u,size_t n){
  48. cout<<"------| "<<name<<" |------"<<endl;
  49. for(size_t i=0;i<n;++i){
  50. cout<<i<<" : "<<u[i]<<endl;
  51. }
  52. cout<<"--------------------------"<<endl;
  53. }
  54. double bump(double x,double delta_left,double left,double delta_right,double right){
  55. double left2=left-delta_left;
  56. double right2=right+delta_right;
  57. if(x>left){
  58. if(x<right) return 1;
  59. if(x>right2) return 0;
  60. return (right2-x)/delta_right;
  61. }
  62. else if(x<left2) return 0;
  63. return (x-left2)/delta_left;
  64. }
  65. double interpol(double x0,double x1,double t){
  66. return x0*(1-t)+x1*t;
  67. }