Gistrec

Метод Рунге-Кутта 2го порядка

Oct 31st, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. vector<double> y = { 1, 1, 1 };
  8.  
  9.  
  10. vector<double> k1(3, 0), k2(3, 0), k3(3, 0), k4(3, 0);
  11.  
  12. double e = 0.001;
  13.  
  14. vector<vector<double>> A = {
  15.     { -1.f / e,     1.f / e,           1.f / e },
  16.     { 0,            1.f - 1.f / e,     0 },
  17.     { 0,            0,                 1.f }
  18. };
  19.  
  20. double h;
  21. double step = 0.1f;
  22.  
  23. auto getK1() {
  24.     vector<double> result(3, 0);
  25.     for (int i = 0; i < 3; i++) {
  26.         result[i] = step * (A[i][0] * y[0] + A[i][1] * y[1] + A[i][2] * y[2]);
  27.     }
  28.     return result;
  29. }
  30.  
  31. auto getK2() {
  32.     vector<double> result(3, 0);
  33.     for (int i = 0; i < 3; i++) {
  34.         result[i] = step * (A[i][0] * (y[0] + k1[0]) + A[i][1] * (y[1] + k1[1]) + A[i][2] * (y[2] + k1[2]));
  35.     }
  36.     return result;
  37. }
  38.  
  39. auto getY() {
  40.     vector<double> result(3, 0);
  41.     for (int i = 0; i < 3; i++) {
  42.         result[i] = y[i] + 1.f / 2.f * (k1[i] + k2[i]);
  43.     }
  44.     return result;
  45. }
  46.  
  47. int main() {
  48.     for (h = 0 + step; h < 1; h += step) {
  49.         k1 = getK1();
  50.         k2 = getK2();
  51.         y = getY();
  52.         cout << h << ";" << (double)y[0] << ";" << (double)y[1] << ";" << (double)y[2] << endl << endl;
  53.     }
  54.     system("pause");
  55.     return 0;
  56. }
Add Comment
Please, Sign In to add comment