Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Ira_4m_lab2.cpp: определ¤ет точку входа дл¤ консольного приложени¤.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stack>
- #include <deque>
- #include <set>
- #include <sstream>
- #include <fstream>
- #include <cmath>
- #include <algorithm>
- #include <cstdlib>
- #include <cstdio>
- #include <ctime>
- #include "gnuplot_i.hpp"
- #include <conio.h>
- #include <windows.h>
- using namespace std;
- typedef vector<pair<double , pair<double , double> > > vpdd;
- #define cyrillic setlocale(LC_CTYPE, "rus")
- string path1 = "C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\Ira_4m_lab2\\Ira_4m_lab2\\1.txt";
- string path2 = "C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\Ira_4m_lab2\\Ira_4m_lab2\\2.txt";
- inline string DoubleToString(double d){ostringstream strs; strs << d; return strs.str();}
- double f(double x , double y);
- double g(double x , double y);
- void wait();
- class Runge_Kutta{
- private:
- double h , a , b , x , y;
- int n;
- public:
- Runge_Kutta(double N , double mx , double x0 , double y0){
- n = N;
- h = mx / n;
- x = x0;
- y = y0;
- }
- vpdd Order_1(){
- vpdd ans;
- double a = x , b = y;
- ans.push_back(make_pair(0 , make_pair(x , y)));
- for(int i = 1 ; i <= n ; ++i){
- x += h * f(x , y);
- y += h * g(x , y);
- double t = h * i;
- ans.push_back(make_pair(t , make_pair(x , y)));
- }
- x = a , y = b;
- return ans;
- }
- vpdd Order_4(){
- vpdd ans;
- double a = x , b = y;
- ans.push_back(make_pair(0 , make_pair(x , y)));
- vector<double> k(5) , m(5);
- for(int i = 1 ; i <= n ; ++i){
- k[1] = h * f(x , y);
- m[1] = h * g(x , y);
- k[2] = h * f(x + k[1] / 2 , y + m[1] / 2);
- m[2] = h * g(x + k[1] / 2 , y + m[1] / 2);
- k[3] = h * f(x + k[2] / 2 , y + m[2] / 2);
- m[3] = h * g(x + k[2] / 2 , y + m[2] / 2);
- k[4] = h * f(x + k[3] , y + m[3]);
- m[4] = h * g(x + k[3] , y + m[3]);
- x += (k[1] + 2 * (k[2] + k[3]) + k[4]) / 6.0;
- y += (m[1] + 2 * (m[2] + m[3]) + m[4]) / 6.0;
- double t = h * i;
- ans.push_back(make_pair(t , make_pair(x , y)));
- }
- x = a , y = b;
- return ans;
- }
- };
- double f(double x , double y){
- return (4.0 - 2.5 * y) * x - 0.1 * x * x;
- // return 2 * x - 0.02 * x * y;
- }
- double g(double x , double y){
- return (1.0 * x - 2.0) * y - 0.1 * y * y;
- // return 0.0002 * x * y - 0.8 * y;
- }
- int main(){
- double t , n , x , y;
- int ord;
- cout << "T:\n";
- cin >> t;
- cout << "n:\n";
- cin >> n;
- cout << "x(0):\n";
- cin >> x;
- cout << "y(0):\n";
- cin >> y;
- cout << "Order (1 or 4):\n";
- cin >> ord;
- Runge_Kutta rk(n , t , x , y);
- vpdd ans = (ord == 1 ? rk.Order_1() : rk.Order_4());
- FILE * file1 = fopen(&path1[0] , "w");
- FILE * file2 = fopen(&path2[0] , "w");
- pair<double , double> mx1 , mx2;
- mx1 = mx2 = make_pair(DBL_MAX , DBL_MIN);
- for(int i = 0 ; i < ans.size() ; ++i){
- fprintf(file1 , " %lf %lf\n" , ans[i].first , ans[i].second.first);
- fprintf(file2 , " %lf %lf\n" , ans[i].first , ans[i].second.second);
- mx1.first = min(mx1.first , ans[i].second.first);
- mx1.second = max(mx1.second , ans[i].second.first);
- mx2.first = min(mx2.first , ans[i].second.second);
- mx2.second = max(mx2.second , ans[i].second.second);
- }
- fclose(file1);
- fclose(file2);
- Gnuplot gnu("lines");
- gnu.set_grid();
- int offset = 5;
- string aa = "";
- aa += "set yrange [" + DoubleToString(mx1.first - offset) + ":" + DoubleToString(mx1.second + offset) + "]\n";
- aa += "set y2range [" + DoubleToString(mx2.first - offset) + ":" + DoubleToString(mx2.second + offset) + "]\n";
- aa += "set xrange [0:" + DoubleToString(t) + "]\n";
- aa += "set y2tics\n";
- aa += "set ylabel \"Жертви \"\n";
- aa += "set y2label \"Хижаки \"\n";
- aa += "Жертви = '" + path1 + "'\n";
- aa += "Хижаки = '" + path2 + "'\n";
- string bb = "plot Жертви axes x1y1 with lines , Хижаки axes x1y2 with lines";
- gnu.plot_points(bb , aa);
- wait();
- remove(&path1[0]);
- remove(&path2[0]);
- gnu.remove_tmpfiles();
- return 0;
- }
- void wait(){
- FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
- #ifndef FOUT
- cout << endl << "Press any key to continue..." << endl;
- #endif
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement