Advertisement
Guest User

omm

a guest
Apr 24th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #include <math.h>
  4.  
  5. #define n 500
  6.  
  7. #define pi 3.14159265
  8.  
  9. void solve(double);
  10.  
  11. double g(double);
  12.  
  13. double dg(double);
  14.  
  15. double f(double,double,double,double);
  16.  
  17. double df(double);
  18.  
  19. double ux0(double);
  20.  
  21. double ut0(double);
  22.  
  23. FILE *fp;
  24.  
  25. double xn=0.0,xk=-1.0; // нач. и кон. знач
  26.  
  27. double dt,h,eps=0.0001; // шаг по времени, по координате, точность,
  28.  
  29. double T=0.3, Nt=300; // конечное время, кол-во шагов по времени
  30.  
  31. double u[n+1], un[n+1]; // массивы значений u(x)
  32.  
  33. int i, k;
  34.  
  35. void main(void)
  36.  
  37. {
  38.  
  39. fp=fopen("data.txt","w");
  40.  
  41. dt=T/Nt; // шаг по времени
  42.  
  43. h=(xk-xn)/n; // шаг по х
  44.  
  45. for(i=0;i<=n;i++)
  46.  
  47. {
  48.  
  49. u[i]=ut0(h*i); // нач. усл.
  50.  
  51. if(i%10==0) fprintf(fp,"%f\t%f\t%f\n",0.0,i*h,u[i]); // печать в файл начальных значений (t=0)
  52.  
  53. }
  54.  
  55. for(k=1;k<=Nt;k++)
  56.  
  57. {
  58.  
  59. solve(k*dt);
  60.  
  61. for(i=0;i<=n;i++)
  62.  
  63. {
  64.  
  65. u[i]=un[i];
  66.  
  67. if(i%10==0 && k%10==0) fprintf(fp,"%f\t%f\t%f\n",k*dt,i*h,u[i]); // печать в файл
  68.  
  69. }
  70.  
  71. }
  72.  
  73. fclose(fp);
  74.  
  75. }
  76.  
  77. void solve(double t) // основная процедура
  78.  
  79. {
  80.  
  81. double us0, us1;
  82.  
  83. un[0]=ux0(t); // u(0,t) - граничное условие
  84.  
  85. for(i=0; i<n; i++)
  86.  
  87. {
  88.  
  89. us1=u[i+1]; // начальное приближение
  90.  
  91. do { // цикл итерационного метода
  92.  
  93. us0=us1;
  94.  
  95. us1=us0-f(us0,un[i],u[i+1],u[i])/df(us0); // расчет следующего приближения
  96.  
  97. } while(abs(us1-us0)>eps); // выходим из цикла при достижении точности eps
  98.  
  99. un[i+1]=us1; // найденное значение
  100.  
  101. }
  102.  
  103. }
  104.  
  105. double g(double z)
  106.  
  107. {
  108.  
  109. return -log(exp(2.0*z)+1.0);
  110.  
  111. }
  112.  
  113. double dg(double z)
  114.  
  115. {
  116.  
  117. return -2.0*exp(2.0*z)/(1.0+exp(2.0*z));
  118.  
  119. }
  120.  
  121. double f(double z,double un0,double u1,double u0)
  122.  
  123. {
  124.  
  125. return (un0-u0+z-u1)/2.0/dt+(g(u1)-g(u0)+g(z)-g(un0))/2.0/h;
  126.  
  127. }
  128.  
  129. double df(double z)
  130.  
  131. {
  132.  
  133. return 1.0/2.0/dt+dg(z)/2.0/h;
  134.  
  135. }
  136.  
  137. double ut0(double z) // u(x,0) нач. усл.
  138.  
  139. {
  140.  
  141. return sin(pi*z);
  142.  
  143. }
  144.  
  145. double ux0(double z) // u(0,t) гр. усл.
  146.  
  147. {
  148.  
  149. return 0.0;
  150.  
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement