Advertisement
madras

OF 2013

Mar 10th, 2014
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. /*
  2. Copyright (C) 2013 Marcin Waszak
  3. Kod źródłowy programu, który jest rozwiązaniem zadania T4 (63. Olimpiada Fizyczna)
  4.  
  5. Informacje dodatkowe:
  6. Wszystkie zmienne wyrażone w jednostkach SI
  7. Język programowania C++
  8. */
  9.  
  10. #include <iostream>
  11. #include <fstream>
  12. #include <cmath>
  13. #include <conio.h>
  14.  
  15. using namespace std;
  16.  
  17. // stałe symulacji
  18. const double pi = 3.14159265359;
  19. const double= 9.80665;  // przyśpieszenie ziemskie
  20. const double ds = 0.001;    // krok klocka na okręgu, domyślnie 1 mm
  21. const double f_step = 10E5; // pierwszy krok dla wysokości w algorytmie szukania minimalnego H
  22. const double epsilon = 10E-8; // klasa dokładności w algorytmie szukania minimalnego H
  23.  
  24. // warunki początkowe symulacji
  25. double R; // promień pętli
  26. double u; // współczynnik tarcia klocka o tor
  27. double H; // szukana wysokosc początkowa klocka
  28.  
  29. // zmienne pomocnicze
  30. double step;    // aktualny krok dla wysokości w algorytmie szukania minimalnego H
  31. double h;       // aktualna wysokość podczas symulacji
  32. double S_Wt;    // suma dotychczasowej pracy wykonanej przez tarcie podczas symulacji
  33. double s;       // aktualna droga, którą pokonał klocek po okręgu
  34. double alpha;   // aktualna współrzędna kątowa klocka na pętli wyrażona w radianach
  35. double v;       // aktualna prędkość klocka
  36. double Fod;     // aktualna siła odśrodkowa klocka
  37. double Q2;      // składowa ciężaru klocka prostopadła do toru w punkcie styczności klocka z torem
  38. bool go_on = true; // flaga informująca czy klocek pokonał kolejny krok symulacji
  39.  
  40. void init() // resetowanie zmiennych
  41. {
  42.     S_Wt = 0.0; //suma pracy tarcia
  43.     s = 0.0;
  44.     go_on = true;
  45. }
  46.  
  47. // pomocnicze funkcje używane w programie
  48. inline double get_alpha()   { return s/R; } // zwracanie aktualnego kąta klocka na okręgu
  49. inline double get_h()       { return R*(1-sin(alpha)); } // zwracanie aktualnej wysokości klocka
  50. inline double get_v()       { return sqrt(2*g*H - 2*g*h - 2*S_Wt); } // zwracanie aktualnej prędkości klocka
  51. inline double get_Fod()     { return v*v/R; } // aktualna siła odśrodkowa klocka
  52. inline double get_Q2()      { return g*sin(alpha); } // aktualna składowa nacisku klocka na pętlę
  53. inline double dWt()         { return ds*u*(Fod + Q2); } // praca tarcia podczas danego kroku symulacji
  54.  
  55. int main()
  56. {
  57.     // tworzenie pliku eksportującego dane symulacji do pliku
  58.     fstream plik("details.txt", ios::out );
  59.     if(!plik.good())
  60.     {
  61.         cout << "File error!";
  62.         getch();
  63.         return 0;
  64.     }
  65.  
  66.     cout << "(C) 2013 Marcin Waszak" << endl;
  67.     cout << "Rozwiazanie zadania T4 (63. Olimpiada Fizyczna)" << endl << endl;
  68.     cout << "Marcin Waszak" << endl << "ul. Rybnicka 7c" << endl << "87-800 Wloclawek" << endl << endl;
  69.  
  70.     cout << "Podaj R: ";
  71.     cin >> R;
  72.  
  73.     plik << "R = " << R << endl;
  74.  
  75.     for(u = 0.0; u < 0.5; u += 0.05)
  76.     {
  77.         H = 0.0;
  78.         step = f_step;
  79.         while(step > epsilon) // szukaj minimalnego H aż do osiągnięcia ustalonej dokładności
  80.         {
  81.             init();
  82.             H += step;
  83.             do
  84.             {
  85.                 // kalkulowanie aktualnych parametrów symulacji
  86.                 alpha = get_alpha();
  87.                 v = get_v();               
  88.                 h = get_h();
  89.                 Q2 = get_Q2();
  90.                 Fod = get_Fod();
  91.                 S_Wt += dWt();
  92.  
  93.                 if(alpha >= pi && alpha < 2*pi)
  94.                 {
  95.                     if(Fod + Q2 > 0.0) // jak klocek na górze pętli, to patrz na oderwanie od niej
  96.                         s += ds; // klocek jedzie dalej po okręgu
  97.                     else
  98.                     {
  99.                         go_on = false; // klocek oderwał się od górnej części pętli
  100.                         break;
  101.                     }
  102.                 }
  103.                 else
  104.                 {
  105.                     if(v > 0.0) // jak na dole pętli, to patrz na zwolnienie klocka do zera
  106.                         s += ds; // klocek jedzie dalej po okręgu
  107.                     else
  108.                     {
  109.                         go_on = false; // klocek się zatrzymał na dolnej części pętli
  110.                         break;
  111.                     }
  112.                 }
  113.             }
  114.             while(alpha < 2.5*pi); // koniec symulacji gdy klocek wykona 450 stopni kątowych
  115.  
  116.             if(go_on)   // jeśli klocek dojechał do końca pętli, to cofnij się z wysokością i zmniejsz
  117.             {           // krok szukania minimalnego H o połowę
  118.                 H -= step;
  119.                 step *= 0.5;
  120.             }
  121.         }
  122.         cout << fixed << endl << "u: " << u << endl;
  123.         cout << "H: " << H << endl;
  124.         plik << fixed << u << "\t" << H << endl;
  125.     }
  126.     plik.close();
  127.     cout << endl << "Zakonczono pomyslnie." << endl << "Zapisano do pliku details.txt";
  128.     getch();
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement