Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <math.h>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. ofstream fout;
  9.  
  10. double Uo;
  11. double w;
  12. double B;
  13. double S;
  14. double R;
  15. double J;
  16. double to;
  17. double t1;
  18. int n;
  19. double fo;
  20. double eps;
  21. double dfo;
  22.  
  23. void decay_time(double *t, double *f, int len)
  24. {
  25.     double buf_f = f[0], buf1_t, buf2_t;
  26.     int flg = 0;
  27.     for (int i = 1; i < len - 1; i++)
  28.     {
  29.         if (fabs(f[i]) > fabs(f[i-1]) and fabs(f[i]) > fabs(f[i+1]))
  30.         {
  31.             if (flg == 0)
  32.             {
  33.                 cout << f[i] << " " << t[i] << endl;
  34.                 buf_f = f[i];
  35.                 buf1_t = t[i];
  36.                 flg = 1;
  37.             }
  38.             else
  39.             {
  40.                 if (fabs(buf_f) / fabs(f[i]) >= M_E)
  41.                 {
  42.                     cout << f[i] << " " << t[i] << endl;
  43.                     buf2_t = t[i];
  44.                     break;
  45.                 }
  46.             }
  47.  
  48.         }
  49.         else if (i == 1 and fabs(f[i-1]) > fabs(f[i]))
  50.         {
  51.             cout << f[i-1] << " " << t[i-1] << endl;
  52.             buf_f = f[i-1];
  53.             buf1_t = t[i-1];
  54.             flg = 1;
  55.         }
  56.     }
  57.     cout << "decay time: " << buf2_t - buf1_t << endl;
  58. }
  59.  
  60. double func(double f, double t,  double df)
  61. {
  62.     return (-Uo*cos(w*t) - B*S*sin(f)*df)*S*B*sin(f)/(R*J);
  63. }
  64.  
  65. void RungeStep(double* df, double* f, double* t, int N)
  66. {
  67.     double k1, k2, k3, k4;
  68.     double q1, q2, q3, q4;
  69.  
  70.     df[0]=dfo;
  71.     f[0]=fo;
  72.     t[0]=to;
  73.  
  74.     double dt = (double) (t1 - to)/(N-1);
  75.     for (int i = 1; i < N; i++)
  76.     {
  77.         q1 = dt * func(f[i-1]         , t[i-1]         , df[i-1]         );
  78.         k1 = dt * (df[i-1]         );
  79.  
  80.         q2 = dt * func(f[i-1] + k1/2.0, t[i-1] + dt/2.0, df[i-1] + q1/2.0);
  81.         k2 = dt * (df[i-1] + q1/2.0);
  82.  
  83.         q3 = dt * func(f[i-1] + k2/2.0, t[i-1] + dt/2.0, df[i-1] + q2/2.0);
  84.         k3 = dt * (df[i-1] + q2/2.0);
  85.  
  86.         q4 = dt * func(f[i-1] + k3    , t[i-1] + dt    , df[i-1] + q3    );
  87.         k4 = dt * (df[i-1] + q3    );
  88.  
  89.         df[i] = df[i-1] + (q1 + 2.0*q2 + 2.0*q3 + q4)/6.0;
  90.         f[i]  = f[i-1]  + (k1 + 2.0*k2 + 2.0*k3 + k4)/6.0;
  91.         t[i]  = t[i-1]  + dt;
  92.     }
  93. }
  94.  
  95. double maxNorm(double* f1, double* f2, double* t1, double* t2, int n1)
  96. {
  97.     double max = -1.0;
  98.     double diff;
  99.     for (int i = 0; i < n1; i++)
  100.     {
  101.         diff = fabs( f1[i]-f2[2*i]);
  102.         if (diff > max) max=diff;
  103.     }
  104.     return max;
  105. }
  106.  
  107. void Runge(bool flag)
  108. {
  109.     int n1=n;
  110.     int n2=n;
  111.     vector<double>arr_df1, arr_f1, arr_t1;
  112.     vector<double>arr_df2, arr_f2, arr_t2;
  113.  
  114.     arr_df1.resize(n1, 0.0);
  115.     arr_f1.resize(n1, 0.0);
  116.     arr_t1.resize(n1, 0.0);
  117.     RungeStep(&arr_df1[0], &arr_f1[0], &arr_t1[0], n1);
  118.  
  119.     double diff=2.0*eps;
  120.     while (eps<diff)
  121.     {
  122.         n2 = 2 * n1 - 1;
  123.         arr_df2.resize(n2, 0.0);
  124.         arr_f2.resize(n2, 0.0);
  125.         arr_t2.resize(n2, 0.0);
  126.  
  127.         RungeStep(&arr_df2[0], &arr_f2[0], &arr_t2[0], n2);
  128.         diff = maxNorm(&arr_f1[0], &arr_f2[0],  &arr_t1[0], &arr_t2[0], n1);
  129.         diff/= 15.0;
  130.         cout<< n1 <<" "<< n2 <<" "<< diff <<endl;
  131.  
  132.         n1 = n2;
  133.         arr_df1 = arr_df2;
  134.         arr_f1 = arr_f2;
  135.         arr_t1 = arr_t2;
  136.     }
  137.     cout <<"The Runge's step suitable for the given epsilon="<<eps<<" is "<< (double) (t1 - to)/(n2-1) <<endl;
  138.  
  139.     decay_time(&arr_t2[0], &arr_f2[0], n2);
  140.  
  141.     if(flag)
  142.     {
  143.         ofstream fout;
  144.         fout.open("Runge_Kutt.txt");
  145.         for (int i = 0; i < n2; i++)
  146.             fout << arr_t2[i] << "\t" << arr_f2[i] << "\t" << arr_df2[i] << endl;
  147.         fout.close();
  148.     }
  149.  
  150.     arr_df1.clear();
  151.     arr_df2.clear();
  152.     arr_f1.clear();
  153.     arr_f2.clear();
  154.     arr_t1.clear();
  155.     arr_t2.clear();
  156.  
  157. }
  158.  
  159. void EulerStep(double* df, double* f, double* t, int N)
  160. {
  161.     df[0]=dfo;
  162.     f[0]=fo;
  163.     t[0]=to;
  164.     double dt = (double) (t1 - to)/(N-1);
  165.     for (int i = 1; i < N; i++)
  166.     {
  167.         df[i]=df[i-1]  + dt*func(f[i-1], t[i-1], df[i-1]);
  168.         f[i]=f[i-1] + dt*df[i];
  169.         t[i]=t[i-1] + dt;
  170.     }
  171. }
  172.  
  173. void Euler(bool flag)
  174. {
  175.     int n1=n;
  176.     int n2=n;
  177.     vector<double>arr_df1, arr_f1, arr_t1;
  178.     vector<double>arr_df2, arr_f2, arr_t2;
  179.  
  180.     arr_df1.resize(n1, 0.0);
  181.     arr_f1.resize(n1, 0.0);
  182.     arr_t1.resize(n1, 0.0);
  183.     EulerStep(&arr_df1[0], &arr_f1[0], &arr_t1[0], n1);
  184.  
  185.     double diff=2.0*eps;
  186.     while (eps<diff)
  187.     {
  188.         n1 = n2;
  189.         n2 = 2 * n1 - 1;
  190.         arr_df1 = arr_df2;
  191.         arr_f1 = arr_f2;
  192.         arr_t1 = arr_t2;
  193.         arr_df2.resize(n2, 0.0);
  194.         arr_f2.resize(n2, 0.0);
  195.         arr_t2.resize(n2, 0.0);
  196.         EulerStep(&arr_df2[0], &arr_f2[0], &arr_t2[0], n2);
  197.         diff = maxNorm(&arr_f1[0], &arr_f2[0],  &arr_t1[0], &arr_t2[0], n1);
  198.         diff/= 3.0;
  199.         cout<< n1 <<" "<< n2 <<" "<< diff <<endl;
  200.     }
  201.     cout <<"The Euler's step suitable for the given epsilon="<<eps<<" is "<< (double) (t1 - to)/(n2-1) <<endl;
  202.  
  203.     decay_time(&arr_t2[0], &arr_f2[0], n2);
  204.  
  205.     if(flag)
  206.     {
  207.         ofstream fout;
  208.         fout.open("Euler.txt");
  209.         for (int i = 0; i < n2; i++)
  210.             fout << arr_t2[i] << "\t" << arr_f2[i] << "\t" << arr_df2[i] << endl;
  211.         fout.close();
  212.     }
  213.  
  214.     arr_df1.clear();
  215.     arr_df2.clear();
  216.     arr_f1.clear();
  217.     arr_f2.clear();
  218.     arr_t1.clear();
  219.     arr_t2.clear();
  220.  
  221. }
  222.  
  223. void InitDef()
  224. {
  225.     Uo=10;
  226.     w=0;
  227.     B=5;
  228.     S=0.01;
  229.     R=100;
  230.     J=0.001;
  231.     to=0;
  232.     t1=1000;
  233.     n=21;
  234.     fo=M_PI/2 - 0.1;
  235.     dfo=0;
  236.     eps=0.001;
  237.     //   koef = 0.0;
  238. }
  239.  
  240. /* void InitUser()
  241. {
  242.     cout <<"Enter amplitude of voltage: ";
  243.     cin >> Uo;
  244.     cout<<"Enter frequency:   ";
  245.     cin>>w;
  246.     cout<<"Enter B:  ";
  247.     cin>>B;
  248.     cout<<"Enter S:  ";
  249.     cin>>S;
  250.     cout<<"Enter resistance:  ";
  251.     cin>>R;
  252.     cout<<"Enter moment of inertia:  ";
  253.     cin>>J;
  254.     cout<<"Enter t0:  ";
  255.     cin>>to;
  256.     cout<<"Enter t1:  ";
  257.     cin>>t1;
  258.     cout<<"Enter initial angle:  ";
  259.     cin>>fo;
  260.     cout<<"Enter epsilon:  ";
  261.     cin>>eps;
  262.     cout<<"Enter angular velocity:  ";
  263.     cin>>dfo;
  264.     cout <<"Thank you!"<< endl;
  265. }
  266.  */
  267.  
  268. int main()
  269. {
  270.     bool flag = true; //true - print to files, false - do not print
  271.     InitDef();
  272.   //  InitUser();
  273.     Runge(flag);
  274.     Euler(flag);
  275.     return 0;
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement