Don't like ads? PRO users don't see any ads ;-)
Guest

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

By: a guest on May 5th, 2012  |  syntax: C++  |  size: 1.53 KB  |  hits: 17  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }