/project/curs/curs/backTime_solver.cpp

http://cm-kp-406.googlecode.com/ · C++ · 284 lines · 167 code · 58 blank · 59 comment · 13 complexity · 97d420858fb20ed1d752c375ba1ee0ba MD5 · raw file

  1. #include "backTime_solver.h"
  2. CBackTimeSolve :: CBackTimeSolve()
  3. {
  4. pTable = NULL;
  5. analytic = NULL;
  6. right_border = NULL;
  7. }
  8. CBackTimeSolve :: ~CBackTimeSolve()
  9. {
  10. clearArray();
  11. analytic = NULL;
  12. right_border = NULL;
  13. }
  14. double ** CBackTimeSolve::getTable()
  15. {
  16. return pTable;
  17. }
  18. double * CBackTimeSolve::getGradient(double * prev_grad)
  19. {
  20. for (int k =0; k < K; k++)
  21. {
  22. prev_grad[k] = -pTable[k][0];
  23. }
  24. return prev_grad;
  25. }
  26. /*
  27. void ReverseSolve::CheckSolve(string f_name)
  28. {
  29. ofstream out(f_name.c_str());
  30. out << fixed;
  31. float temp;
  32. for (int k = 0; k < K; k++)
  33. {
  34. for (int i = 0; i < N; i++)
  35. {
  36. temp = r(stX + i*h, k*tau);
  37. out << setprecision (5) << "t = " << k*tau << " x = " << stX + i*h << " u(x,y) = " << u_array[k][i] << " u*(x,y) = " << temp << " Difference = " << fabs(u_array[k][i] - temp) << endl;
  38. }
  39. out << endl << endl;
  40. }
  41. }*/
  42. void CBackTimeSolve:: clearArray()
  43. {
  44. if (pTable != NULL)
  45. {
  46. for (int k = 0; k < K; k++)
  47. {
  48. delete [] pTable[k];
  49. }
  50. delete [] pTable;
  51. }
  52. pTable = NULL;
  53. }
  54. /*
  55. void ReverseSolve::CheckResult(double **correct, string f_name)
  56. {
  57. ofstream out(f_name.c_str());
  58. out << fixed;
  59. double temp;
  60. for (int k = 0; k < K; k++)
  61. {
  62. for (int i = 0; i < N; i++)
  63. {
  64. temp = fabs(correct[k][i] - u_array[k][i]);
  65. out << setprecision (5) << "t = " << k*tau << " x = " << stX + i*h << " u(x,y) = " << u_array[k][i] << " u*(x,y) = " << correct[k][i] << " Difference = " << temp << endl;
  66. }
  67. out << endl << endl;
  68. }
  69. }*/
  70. void CBackTimeSolve::checkResult( string f_name)
  71. {
  72. ofstream out(f_name.c_str());
  73. out << fixed;
  74. for (int k = K-1; k >= 0; k--)
  75. {
  76. for (int i = 0; i < N; i++)
  77. {
  78. out << setprecision (5) << "t = " << T - k*tau << " x = " << stX + i*h << " u(x,y) = " << pTable[k][i] << endl;
  79. }
  80. out << endl << endl;
  81. }
  82. }
  83. void CBackTimeSolve::setTask(double _a, double _b, double _c,
  84. double _alpha, double _beta, double _gamma, double _delta,
  85. double _stX, double _endX, double _Tr, int _N, int _K,
  86. double *_right_border, double *_analitic)
  87. {
  88. clearArray();
  89. a = _a;
  90. b = _b;
  91. c = _c;
  92. alpha = _alpha;
  93. beta = _beta;
  94. gamma = _gamma;
  95. delta = _delta;
  96. l = _endX;
  97. T = _Tr;
  98. stX = _stX;
  99. N = _N + 1;
  100. K = _K + 1;
  101. h = _endX/_N;
  102. tau = _Tr/_K;
  103. pTable = createTable();
  104. right_border = _right_border;
  105. analytic = _analitic;
  106. }
  107. double CBackTimeSolve::r(double x, double t)
  108. {
  109. return exp(-1*a*t)*sin(x);
  110. //return sin(t) * cos(x);
  111. //return exp(- a * a * t) * cos(x + b * t);
  112. //return exp((c - a * a) * t) * sin(x + b * t);
  113. }
  114. double ** CBackTimeSolve::createTable()
  115. {
  116. double ** new_array = new double*[K];
  117. for (int i =0; i < K ; i++)
  118. {
  119. new_array[i] = new double[N];
  120. }
  121. return new_array;
  122. }
  123. void CBackTimeSolve::UseSweepMethod(double *d, double *A, double *B, double *C, int N, double *res)
  124. {
  125. double* P = new double[N];
  126. double* Q = new double[N];
  127. double a,b,c;
  128. b = B[0];
  129. c = C[0];
  130. P[0] = -c / b;
  131. Q[0] = d[0] / b;
  132. for (int i=1; i < N-1; i++)
  133. {
  134. a = A[i];
  135. b = B[i];
  136. c = C[i];
  137. P[i] = -c / (b + a*P[i-1]);
  138. Q[i] = (d[i] - a*Q[i-1]) / (b + a*P[i-1]);
  139. }
  140. a = A[N-1];
  141. b = B[N-1];
  142. P[N-1] = 0;
  143. Q[N-1] = (d[N-1] - a * Q[N-2]) / (b + a * P[N-2]);
  144. res[N-1] = Q[N-1]; //SweapMethod
  145. for (int i=N-2; i >= 0; i--)
  146. {
  147. res[i] = P[i]*res[i+1] + Q[i];
  148. }
  149. }
  150. double CBackTimeSolve:: psiT(double x, double t)
  151. {
  152. return 0.0;
  153. }
  154. // ????????????
  155. //double CBackTimeSolve:: psiT(double x, double t)
  156. //{
  157. // return sin (x);
  158. //}
  159. double CBackTimeSolve:: f(double x, double t)
  160. {
  161. return 0.0;
  162. }
  163. double CBackTimeSolve:: phi0(double x, double t)
  164. {
  165. return 0.0;
  166. }
  167. double CBackTimeSolve:: phiL(double x, int k)
  168. {
  169. return (2.0 * ( right_border[k] - analytic[k])) ;
  170. // ?? ??????? ?????? ?????? ??? ????????? ?? ?????? ??????? ???????
  171. // ????????????? ??????? ????????(??????????????) ??????
  172. }
  173. // ????????????
  174. //double CBackTimeSolve:: phiL(double x, double t)
  175. //{
  176. // //return (2.0 * ( border[k] - tStar[k]));
  177. // return -1*exp(-1*a*t);
  178. // //return -sin(t);
  179. // //return ( exp(-a * a * t) * (cos(b * t) + sin (b*t)) );
  180. // //return ( -exp((c - a*a)*t) * (cos (b * t) + sin (b * t)) );
  181. //}
  182. /*
  183. void CBackTimeSolve::setBorder(double * _right_border)
  184. {
  185. right_border = _right_border;
  186. }
  187. */
  188. void CBackTimeSolve::getSolve()
  189. {
  190. double * A = new double[N];
  191. double * B = new double[N];
  192. double * C = new double[N];
  193. double * d = new double[N];
  194. double temp_a, temp_b, temp_c;
  195. temp_a = (a/h/h - b/h/2.0)*tau;
  196. temp_b = -(2*a*tau/h/h + 1 - c*tau);
  197. temp_c = (a/h/h + b/2/h)*tau;
  198. A[0] = 0;
  199. B[0]= ((-3 + temp_a/temp_c )*alpha + 2* beta*h);
  200. C[0]= (4 + temp_b/temp_c)*alpha;
  201. A[N-1] = - (4 + temp_b/temp_a)*gamma;
  202. B[N-1] = (3 - temp_c/temp_a)*gamma + 2*h*delta;
  203. C[N-1] = 0;
  204. for (int i = 1; i < N-1; i++)
  205. {
  206. A[i] = temp_a;
  207. B[i] = temp_b;
  208. C[i] = temp_c;
  209. }
  210. for (int i = 0; i < N; i++)
  211. {
  212. pTable[K-1][i] = psiT(stX + i*h, 0 ); //psiT(i ,0);
  213. }
  214. for (int k = K-2; k >= 0; k-- )
  215. {
  216. for (int i = 1; i < N; i++ )
  217. {
  218. d[i] = -pTable[k+1][i] - f(stX + i* h, ( k*tau) )*tau;
  219. }
  220. d[0] = phi0(0, ( k*tau) )*2*h + ( d[1] + f(0, (k*tau)) )*alpha/temp_c ;
  221. d[N-1] = phiL(l, k )*2*h - (d[N-2] + f(l, k*tau) )*gamma/temp_a;
  222. // ??? ? ?????? ???? ??????? k- ?? ???????? ?? ???????.
  223. //d[N-1] = phiL(l,( k* tau) )*2*h - (d[N-2] + f(l,( k*tau)) )*gamma/temp_a; ????????????
  224. UseSweepMethod(d, A, B, C, N, pTable[k]);
  225. }
  226. }