Guest User

Неявный метод Рунге Кутта второго порядка (a)

a guest
May 5th, 2012
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.53 KB | None | 0 0
  1. // Ne9vn_RK_k2(a).cpp: îïðåäåëÿåò òî÷êó âõîäà äëÿ êîíñîëüíîãî ïðèëîæåíèÿ.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdlib.h>
  6. #include <math.h>
  7.  
  8. struct y1y2
  9. {
  10.     double y1, y2, h;
  11. };
  12.  
  13. double f1(y1y2 y1_y2)
  14. {
  15.     return (-501*y1_y2.y1+500*y1_y2.y2);
  16. }
  17.  
  18. double f2(y1y2 y1_y2)
  19. {
  20.     return (500*y1_y2.y1-501*y1_y2.y2);
  21. }
  22.  
  23. void print(int i, y1y2 y1_y2)
  24. {
  25.     printf("hod %d y1=%f y2=%f\n",i,y1_y2.y1,y1_y2.y2);
  26.     system("pause");
  27. }
  28.  
  29. y1y2 eler(y1y2 y1_y2_h)
  30. {
  31.     y1y2 yn;
  32.     yn.y1=y1_y2_h.y1+y1_y2_h.h*f1(y1_y2_h);
  33.     yn.y2=y1_y2_h.y2+y1_y2_h.h*f2(y1_y2_h);
  34.     yn.h=y1_y2_h.h;
  35.     return yn;
  36. }
  37.  
  38. y1y2 pr_it(y1y2 y1_y2_h, y1y2 y1ny2nh)
  39. {
  40.     y1y2 n={0, 0, 0}, t={0, 0, 0}, y1ky2kh=y1ny2nh;
  41.     double eps=0.0001;
  42.     do
  43.     {
  44.         y1ny2nh=y1ky2kh;
  45.         n.y1=f1(y1ny2nh);
  46.         n.y2=f2(y1ny2nh);
  47.         t.y1=y1ny2nh.y1-y1_y2_h.h*n.y1;
  48.         t.y2=y1ny2nh.y2-y1_y2_h.h*n.y2;
  49.         y1ky2kh.y1=y1_y2_h.y1+(y1_y2_h.h/2)*(n.y1+f1(t));
  50.         y1ky2kh.y2=y1_y2_h.y2+(y1_y2_h.h/2)*(n.y2+f2(t));
  51.     }
  52.     while((fabs(y1ky2kh.y1-y1ny2nh.y1)>eps)||(fabs(y1ky2kh.y2-y1ny2nh.y2)>eps));
  53.     return y1ky2kh;
  54. }
  55.  
  56. y1y2 RK(y1y2 y1_y2_h, y1y2 y1ky2kh)
  57. {
  58.     y1y2 n={f1(y1ky2kh),f2(y1ky2kh),0}, t={y1ky2kh.y1-y1_y2_h.h*n.y1,y1ky2kh.y2-y1_y2_h.h*n.y2,0};
  59.     y1ky2kh.y1=y1_y2_h.y1+(y1_y2_h.h/2)*(n.y1+f1(t));
  60.     y1ky2kh.y2=y1_y2_h.y2+(y1_y2_h.h/2)*(n.y2+f2(t));
  61.     return y1ky2kh;
  62. }
  63.  
  64. void main(void)
  65. {
  66.     y1y2 y1_y2_h={5, -10, 0.000001};
  67.     int i=0;
  68.     print(i, y1_y2_h); 
  69.     while(1)
  70.     {
  71.         y1_y2_h=RK(y1_y2_h, pr_it(y1_y2_h, eler(y1_y2_h)));
  72.         print(((++i)*10), y1_y2_h);
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment