Advertisement
osipyonok

Ira 4m lab2

Mar 12th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.30 KB | None | 0 0
  1. // Ira_4m_lab2.cpp: определ¤ет точку входа дл¤ консольного приложени¤.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. #include <vector>
  8. #include <map>
  9. #include <queue>
  10. #include <stack>
  11. #include <deque>
  12. #include <set>
  13. #include <sstream>
  14. #include <fstream>
  15. #include <cmath>
  16. #include <algorithm>
  17. #include <cstdlib>
  18. #include <cstdio>
  19. #include <ctime>
  20. #include "gnuplot_i.hpp"
  21. #include <conio.h>
  22. #include <windows.h>
  23.  
  24. using namespace std;
  25.  
  26. typedef vector<pair<double , pair<double , double> > > vpdd;
  27.  
  28. #define cyrillic setlocale(LC_CTYPE, "rus")
  29.  
  30. string path1 = "C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\Ira_4m_lab2\\Ira_4m_lab2\\1.txt";
  31. string path2 = "C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\Ira_4m_lab2\\Ira_4m_lab2\\2.txt";
  32.  
  33. inline string DoubleToString(double d){ostringstream strs; strs << d; return strs.str();}
  34.  
  35. double f(double x , double y);
  36. double g(double x , double y);
  37. void wait();
  38.  
  39. class Runge_Kutta{
  40. private:
  41.     double h , a , b , x , y;
  42.     int n;
  43.  
  44. public:
  45.     Runge_Kutta(double N , double mx , double x0 , double y0){
  46.         n = N;
  47.         h = mx / n;
  48.         x = x0;
  49.         y = y0;
  50.     }
  51.  
  52.     vpdd Order_1(){
  53.         vpdd ans;
  54.         double a = x , b = y;
  55.  
  56.         ans.push_back(make_pair(0 , make_pair(x , y)));
  57.  
  58.         for(int i = 1 ; i <= n ; ++i){
  59.             x += h * f(x , y);
  60.             y += h * g(x , y);
  61.  
  62.             double t = h * i;
  63.  
  64.             ans.push_back(make_pair(t , make_pair(x , y)));
  65.         }
  66.  
  67.         x = a , y = b;
  68.  
  69.         return ans;
  70.     }
  71.  
  72.     vpdd Order_4(){
  73.         vpdd ans;
  74.         double a = x , b = y;
  75.  
  76.         ans.push_back(make_pair(0 , make_pair(x , y)));
  77.  
  78.         vector<double> k(5) , m(5);
  79.  
  80.         for(int i = 1 ; i <= n ; ++i){
  81.             k[1] = h * f(x , y);
  82.             m[1] = h * g(x , y);
  83.  
  84.             k[2] = h * f(x + k[1] / 2 , y + m[1] / 2);
  85.             m[2] = h * g(x + k[1] / 2 , y + m[1] / 2);
  86.  
  87.             k[3] = h * f(x + k[2] / 2 , y + m[2] / 2);
  88.             m[3] = h * g(x + k[2] / 2 , y + m[2] / 2);
  89.  
  90.             k[4] = h * f(x + k[3] , y + m[3]);
  91.             m[4] = h * g(x + k[3] , y + m[3]);
  92.  
  93.             x += (k[1] + 2 * (k[2] + k[3]) + k[4]) / 6.0;
  94.             y += (m[1] + 2 * (m[2] + m[3]) + m[4]) / 6.0;
  95.  
  96.             double t = h * i;
  97.  
  98.             ans.push_back(make_pair(t , make_pair(x , y)));
  99.         }
  100.  
  101.         x = a , y = b;
  102.  
  103.         return ans;
  104.     }
  105. };
  106.  
  107. double f(double x , double y){
  108.     return (4.0 - 2.5 * y) * x - 0.1 * x * x;
  109. //  return 2 * x - 0.02 * x * y;
  110. }
  111.  
  112. double g(double x , double y){
  113.     return (1.0 * x - 2.0) * y - 0.1 * y * y;
  114. //  return 0.0002 * x * y - 0.8 * y;
  115. }
  116.  
  117. int main(){
  118.     double t , n , x , y;
  119.     int ord;
  120.     cout << "T:\n";
  121.     cin >> t;
  122.     cout << "n:\n";
  123.     cin >> n;
  124.     cout << "x(0):\n";
  125.     cin >> x;
  126.     cout << "y(0):\n";
  127.     cin >> y;
  128.     cout << "Order (1 or 4):\n";
  129.     cin >> ord;
  130.  
  131.     Runge_Kutta rk(n , t , x , y);
  132.  
  133.     vpdd ans = (ord == 1 ? rk.Order_1() : rk.Order_4());
  134.  
  135.     FILE * file1 = fopen(&path1[0] , "w");
  136.     FILE * file2 = fopen(&path2[0] , "w");
  137.  
  138.     pair<double , double> mx1 , mx2;
  139.     mx1 = mx2 = make_pair(DBL_MAX , DBL_MIN);
  140.  
  141.     for(int i = 0 ; i < ans.size() ; ++i){
  142.         fprintf(file1 , "  %lf   %lf\n" , ans[i].first , ans[i].second.first);
  143.         fprintf(file2 , "  %lf   %lf\n" , ans[i].first , ans[i].second.second);
  144.  
  145.         mx1.first = min(mx1.first , ans[i].second.first);
  146.         mx1.second = max(mx1.second , ans[i].second.first);
  147.  
  148.         mx2.first = min(mx2.first , ans[i].second.second);
  149.         mx2.second = max(mx2.second , ans[i].second.second);
  150.     }
  151.  
  152.     fclose(file1);
  153.     fclose(file2);
  154.  
  155.     Gnuplot gnu("lines");
  156.  
  157.     gnu.set_grid();
  158.  
  159.     int offset = 5;
  160.  
  161.     string aa = "";
  162.     aa += "set yrange [" + DoubleToString(mx1.first - offset) + ":" + DoubleToString(mx1.second + offset) + "]\n";
  163.     aa += "set y2range [" + DoubleToString(mx2.first - offset) + ":" + DoubleToString(mx2.second + offset) + "]\n";
  164.     aa += "set xrange [0:" + DoubleToString(t) + "]\n";
  165.     aa += "set y2tics\n";
  166.     aa += "set ylabel \"Жертви \"\n";
  167.     aa += "set y2label \"Хижаки \"\n";
  168.     aa += "Жертви = '" + path1 + "'\n";
  169.     aa += "Хижаки = '" + path2 + "'\n";
  170.     string bb = "plot Жертви axes x1y1 with lines , Хижаки axes x1y2 with lines";
  171.  
  172.     gnu.plot_points(bb , aa);
  173.  
  174.     wait();
  175.  
  176.     remove(&path1[0]);
  177.     remove(&path2[0]);
  178.  
  179.     gnu.remove_tmpfiles();
  180.     return 0;
  181. }
  182.  
  183. void wait(){
  184.     FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
  185.     #ifndef FOUT
  186.         cout << endl << "Press any key to continue..." << endl;
  187.     #endif
  188.     _getch();
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement