Advertisement
bolek117

[NM] Ordinary Differential Equations

Sep 15th, 2013
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <iomanip>
  5. #include <sstream>
  6. #include <fstream>
  7.  
  8. #define PI 3.1415926535897932384626433832795028841971
  9. #define _E 2.71828182846
  10. #define WIDTH 7
  11. #define WIDTH_i 4
  12. #define WIDTH_xi 5
  13. #define WIDTH_f 15
  14.  
  15. #define MAX_X 2
  16. #define START_X -15
  17. #define STEP 0.2
  18.  
  19. using namespace std;
  20.  
  21. class Results
  22. {
  23. private:
  24.     vector < vector < double > > results;
  25.  
  26. public:
  27.     Results() {}
  28.     ~Results() {}
  29.  
  30.     vector < vector < double > > get()
  31.     {
  32.         return results;
  33.     }
  34.    
  35.     void set(vector < vector < double > > input)
  36.     {
  37.         results = input;
  38.     }
  39.  
  40.     void pushLine(double x_i, double y_i, double f, double delta, double diff, double realV)
  41.     {
  42.         vector < double > tmp;
  43.         tmp.push_back(x_i);
  44.         tmp.push_back(y_i);
  45.         tmp.push_back(f);
  46.         tmp.push_back(delta);
  47.         tmp.push_back(diff);
  48.         tmp.push_back(realV);
  49.        
  50.         results.push_back(tmp);
  51.     }
  52.  
  53.     vector < double > getLine(unsigned int i)
  54.     {
  55.         return results[i];
  56.     }
  57.  
  58.     bool createCSVstr()
  59.     {
  60.         ofstream csv;
  61.         csv.open("output.csv");
  62.         if (!csv.is_open())
  63.             return false;
  64.  
  65.         csv << "x;y;f(xy);delta;error;realV;\n";
  66.         for (unsigned int i=0;i<results.size();++i)
  67.         {
  68.             for (unsigned int j=0;j<results[i].size();++j)
  69.             {
  70.                 csv << results[i][j] << ";";
  71.             }
  72.             csv << "\n";
  73.         }
  74.  
  75.         csv.close();
  76.         return true;
  77.     }
  78. };
  79.  
  80. double f(double x, double y)
  81. {
  82.     return (y-10.0)/4.0 + 12.0*x*exp((5.0+x)/4.0);
  83. }
  84.  
  85. double f1(double x)
  86. {
  87.     return (10.0 + 6.0*exp((5.0+x)/4.0)*x*x);
  88. }
  89.  
  90. int main()
  91. {
  92.     const double interval = STEP;
  93.     const double initialCondition = f1(START_X);
  94.    
  95.     stringstream buffer;
  96.     buffer << "|" << setw(WIDTH_i) << "i" << "|"
  97.         << setw(WIDTH_xi) << "x_i" << "|"
  98.         << setw(WIDTH_f) << "y_i" << "|"
  99.         << setw(WIDTH_f) << "f(x,y)" << "|"
  100.         << setw(WIDTH_f) << "d y_i" << "|"
  101.         << setw(WIDTH_f) << "Real v" << "|"
  102.         << setw(WIDTH_f) << "Error" << "|\n";
  103.     cout << buffer.str();
  104.     for (unsigned int i=0;i<buffer.str().length()-1;++i)
  105.         cout << "-";
  106.     cout << "\n";
  107.  
  108.     unsigned int i=0;
  109.     Results result;
  110.  
  111.     do
  112.     {
  113.         double x_i = START_X+i*interval;
  114.  
  115.         double y_i;
  116.         if (i != 0)
  117.             y_i = result.getLine(i-1).at(1)+result.getLine(i-1).at(3);
  118.         else
  119.             y_i = initialCondition;
  120.        
  121.         double f_i = f(x_i, y_i);
  122.         double delta = interval*f_i;
  123.         double realValue = f1(x_i);
  124.         double diff = realValue - y_i;
  125.  
  126.         result.pushLine(x_i, y_i, f_i, delta, diff, realValue);
  127.  
  128.         buffer.str("");
  129.         buffer << "|" << setw(WIDTH_i) << i << "|"
  130.             << setw(WIDTH_xi) << x_i << "|"
  131.             << setw(WIDTH_f) << y_i << "|"
  132.             << setw(WIDTH_f) << f_i << "|"
  133.             << setw(WIDTH_f) << delta << "|"
  134.             << setw(WIDTH_f) << realValue << "|"
  135.             << setw(WIDTH_f) << diff << "|\n";
  136.         cout << buffer.str();
  137.         ++i;
  138.     } while((START_X+i*interval) <= MAX_X);
  139.  
  140.     if (result.createCSVstr())
  141.         cout << "Results writen to file.\n";
  142.     else
  143.         cout << "File saving failed.\n";
  144.  
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement