Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Copyright (C) 2013 Marcin Waszak
- Kod źródłowy programu, który jest rozwiązaniem zadania T4 (63. Olimpiada Fizyczna)
- Informacje dodatkowe:
- Wszystkie zmienne wyrażone w jednostkach SI
- Język programowania C++
- */
- #include <iostream>
- #include <fstream>
- #include <cmath>
- #include <conio.h>
- using namespace std;
- // stałe symulacji
- const double pi = 3.14159265359;
- const double g = 9.80665; // przyśpieszenie ziemskie
- const double ds = 0.001; // krok klocka na okręgu, domyślnie 1 mm
- const double f_step = 10E5; // pierwszy krok dla wysokości w algorytmie szukania minimalnego H
- const double epsilon = 10E-8; // klasa dokładności w algorytmie szukania minimalnego H
- // warunki początkowe symulacji
- double R; // promień pętli
- double u; // współczynnik tarcia klocka o tor
- double H; // szukana wysokosc początkowa klocka
- // zmienne pomocnicze
- double step; // aktualny krok dla wysokości w algorytmie szukania minimalnego H
- double h; // aktualna wysokość podczas symulacji
- double S_Wt; // suma dotychczasowej pracy wykonanej przez tarcie podczas symulacji
- double s; // aktualna droga, którą pokonał klocek po okręgu
- double alpha; // aktualna współrzędna kątowa klocka na pętli wyrażona w radianach
- double v; // aktualna prędkość klocka
- double Fod; // aktualna siła odśrodkowa klocka
- double Q2; // składowa ciężaru klocka prostopadła do toru w punkcie styczności klocka z torem
- bool go_on = true; // flaga informująca czy klocek pokonał kolejny krok symulacji
- void init() // resetowanie zmiennych
- {
- S_Wt = 0.0; //suma pracy tarcia
- s = 0.0;
- go_on = true;
- }
- // pomocnicze funkcje używane w programie
- inline double get_alpha() { return s/R; } // zwracanie aktualnego kąta klocka na okręgu
- inline double get_h() { return R*(1-sin(alpha)); } // zwracanie aktualnej wysokości klocka
- inline double get_v() { return sqrt(2*g*H - 2*g*h - 2*S_Wt); } // zwracanie aktualnej prędkości klocka
- inline double get_Fod() { return v*v/R; } // aktualna siła odśrodkowa klocka
- inline double get_Q2() { return g*sin(alpha); } // aktualna składowa nacisku klocka na pętlę
- inline double dWt() { return ds*u*(Fod + Q2); } // praca tarcia podczas danego kroku symulacji
- int main()
- {
- // tworzenie pliku eksportującego dane symulacji do pliku
- fstream plik("details.txt", ios::out );
- if(!plik.good())
- {
- cout << "File error!";
- getch();
- return 0;
- }
- cout << "(C) 2013 Marcin Waszak" << endl;
- cout << "Rozwiazanie zadania T4 (63. Olimpiada Fizyczna)" << endl << endl;
- cout << "Marcin Waszak" << endl << "ul. Rybnicka 7c" << endl << "87-800 Wloclawek" << endl << endl;
- cout << "Podaj R: ";
- cin >> R;
- plik << "R = " << R << endl;
- for(u = 0.0; u < 0.5; u += 0.05)
- {
- H = 0.0;
- step = f_step;
- while(step > epsilon) // szukaj minimalnego H aż do osiągnięcia ustalonej dokładności
- {
- init();
- H += step;
- do
- {
- // kalkulowanie aktualnych parametrów symulacji
- alpha = get_alpha();
- v = get_v();
- h = get_h();
- Q2 = get_Q2();
- Fod = get_Fod();
- S_Wt += dWt();
- if(alpha >= pi && alpha < 2*pi)
- {
- if(Fod + Q2 > 0.0) // jak klocek na górze pętli, to patrz na oderwanie od niej
- s += ds; // klocek jedzie dalej po okręgu
- else
- {
- go_on = false; // klocek oderwał się od górnej części pętli
- break;
- }
- }
- else
- {
- if(v > 0.0) // jak na dole pętli, to patrz na zwolnienie klocka do zera
- s += ds; // klocek jedzie dalej po okręgu
- else
- {
- go_on = false; // klocek się zatrzymał na dolnej części pętli
- break;
- }
- }
- }
- while(alpha < 2.5*pi); // koniec symulacji gdy klocek wykona 450 stopni kątowych
- if(go_on) // jeśli klocek dojechał do końca pętli, to cofnij się z wysokością i zmniejsz
- { // krok szukania minimalnego H o połowę
- H -= step;
- step *= 0.5;
- }
- }
- cout << fixed << endl << "u: " << u << endl;
- cout << "H: " << H << endl;
- plik << fixed << u << "\t" << H << endl;
- }
- plik.close();
- cout << endl << "Zakonczono pomyslnie." << endl << "Zapisano do pliku details.txt";
- getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement