If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Modelowanie grawitacji i tarcia

Spróbujmy sprawić, aby nasze siły trochę bardziej odpowiadały temu, co mamy w świecie rzeczywistym, poprzez ulepszenie grawitacji z ostatniego przykładu oraz wprowadzenie siły tarcia.

Grawitacja na ziemi

Być może rzuciło Ci się w oczy, że coś jest bardzo nie w porządku w tym przykładzie. Im mniejsze kółko, tym szybciej opada pod wpływem siły ciążenia. To może wydawać się logiczne; przecież, jeśli siła jest stała, to z drugiej zasady dynamiki Newtona wynika, że im mniejsza masa, tym większe przyspieszenie.
Ale w przyrodzie jest inaczej. Jeśli wspiąć się na szczyt Krzywej Wieży w Pizie i zrzucić z niej dwie kule o różnych masach, to która z nich pierwsza uderzy w ziemię? Według legendy, Galileusz wykonał to doświadczenie w 1589, odkrywając że obie kule spadają z tym samym przyspieszeniem i uderzają w ziemię w tym samym momencie.
Skąd to się bierze? Jak zobaczymy później, siła ciężkości jest proporcjonalna do masy, na którą działa. Im większą masę ma dany obiekt, z tym większą siłą grawitacji działa na niego Ziemia. A jeśli siła jest proporcjonalna do masy, to masa upraszcza się, gdy dzielimy przez nią aby obliczyć przyspieszenie. W naszym kodzie może wziąć to pod uwagę mnożąc wprowadzone przez nas przyspieszenie (pod wpływem siły grawitacji) przez masę:
for (var i = 0; i < movers.length; i++) {
    gravity.set(0, 0.1 * movers[i].mass);
    movers[i].applyForce(gravity);
    …
}
Chociaż obiekty spadają teraz w tym samym tempie, ponieważ siła wiatru jest niezależna od masy, mniejsze obiekty wciąż szybciej przyspieszają w prawo.
Wymyślanie sił może naprawdę przynieść ciekawe rezultaty. Świat ProcessingJS to zmyślony świat pikseli, a Wy jesteście jego mistrzami. Tak więc cokolwiek uznacie za zjawisko odpowiednie do bycia nazwanym siłą, powinniście zrobić z tego siłę. Mimo to może nadejść czas, gdy zaczniecie się zastanawiać: “Ale jak to wszystko tak na prawdę działa?”
Otwórzcie dowolny podręcznik do fizyki ze szkoły średniej, a znajdziecie wiele wykresów i wzorów opisujących różne siły—grawitacji, elektrodynamicznej, tarcia, napięcia, elastyczności i inne. Albo przejrzyjcie kursy z fizyki na Khan Academy. W tym dziale skupimy się na dwóch siłach—tarcia i grawitacji. Nie chodzi o to, że siły grawitacji i tarcia to najważniejsze siły które powinniście mieć w każdym waszym programie opartym na ProcessingJS. Zamiast tego chcemy opisać te dwie siły jako przypadki studyjne w następujących celach:
  • Zrozumienie, co to są siły
  • Rozbicie wzoru na siłę na dwie części:
    • Jak wyznaczyć kierunek, w którym działa siła?
    • Jak wyznaczyć wartość siły?
  • Przetworzenie wzoru na siłę na kod w ProcessingJS, który obliczy PVector, który potem wyślemy do funkcji applyForce() naszego obiektu Mover.
Jeżeli opanujemy te zagadnienia za pomocą tych dwóch sił, to miejmy nadzieję, że jeżeli kiedykolwiek o trzeciej w nocy będziecie Google'ować “atomic nuclei weak nuclear force” , będziecie już posiadali umiejętności aby zrozumieć znalezione wyniki i móc zastosować je w ProcessingJS.
Przekształcanie wzorów
OK, za chwilę zobaczysz wzór na siłę tarcia. Nie będzie to pierwszy raz, gdy zobaczysz wzór w tym rozdziale; aby nie szukać daleko - właśnie skończyliśmy omawiać wzór na drugą zasadę dynamiki Newtona, F, with, vector, on top, equals, M, dot, A, with, vector, on top​ (lub słowami siła = masa * przyspieszenie). Ten wzór wygląda prosto i zrozumiale. Czasem bywa gorzej, na przykład wzór na rozkład normalny prawdopodobieństwa, o którym mówiliśmy na początku (nie wypisując wzoru matematycznego) wygląda tak:
f, left parenthesis, x, comma, mu, comma, sigma, right parenthesis, equals, start fraction, 1, divided by, sigma, square root of, 2, pi, end square root, end fraction, e, start superscript, left parenthesis, minus, start fraction, left parenthesis, x, minus, mu, right parenthesis, squared, divided by, 2, sigma, squared, end fraction, right parenthesis, end superscript
Jak widać na powyższym wzorze, wzory lubią posiadać wiele symboli (które dosyć często są literami z alfabetu greckiego). Spójrzmy na wzór na tarcie.
F, r, i, c, t, i, o, n, with, vector, on top, equals, minus, µ, N, v, with, hat, on top
Jeżeli dawno nie mieliście styczności z wzorami matematycznymi lub fizycznymi, warto przypomnieć, że istnieją trzy kluczowe kwestie które powinny zostać omówione, zanim będziemy kontynuować.
  • Oblicz wyrażenie po prawej i podstaw wynik do wyrażenia po lewej. Dokładnie tak, jak w przypadku instrukcji programu! Obliczamy wyrażenie zapisane po prawej stronie znaku równości i przypisujemy jego wartość zmiennej, stojącej po lewej stronie. W tym przypadku, chcemy obliczyć siłę tarcia—lewa strona równości mówi nam, co chcemy obliczyć, a prawa mówi nam, w jaki sposób należy to zrobić.
  • Czy siła tarcia jest wektorem, czy skalarem? Siła tarcia jest wektorem, ale w pewnych sytuacjach będziemy interesować się tylko jej wartością, czyli skalarem. W tym przypadku, siła tarcia jest wektorem. Widać to po tym małym daszku nad słowem “tarcie.” Ma wartość i zwrot. Prawa strona jest także wektorem, co wynika z symbolu v, with, hat, on top, który w tym przypadku oznacza wektor jednostkowy skierowany tak, jak wektor prędkości.
  • Kiedy dwa symbole stoją we wzorze obok siebie, to znaczy, że trzeba je pomnożyć. Ten wzór zawiera cztery takie elementy: -1, µ, N, oraz v, with, hat, on top. Ze wzoru wynika, że powinniśmy pomnożyć je przez siebie, w ten sposób: F, r, i, c, t, i, o, n, with, vector, on top, equals, minus, µ, N, v, with, hat, on top

Tarcie

Zacznijmy realizację powyższych punktów na przykładzie tarcia.
Tarcie to siła dyssypacyjna. Siła dyssypacyjna to taka, w której całkowita energia układu zmniejsza się, gdy obiekt jest w ruchu. Załóżmy, że prowadzisz samochód. Gdy przyciśniecie pedał hamowania, hamulce w samochodzie użyją tarcia w celu spowolnienia ruchu opon. Energia kinetyczna (ruch) zamienia się w energię cieplną (ciepło). Zawsze, gdy dwie powierzchnie połączą się, następuje tarcie. Pełny model tarcia zawierałby osobne klasy dla tarcia statycznego (występującego na przykład między powierzchnią a ciałem będącym w spoczynku) i tarciem kinetycznym (ciało poruszające się po powierzchni), ale dla naszych celów skupimy się tylko na tarciu kinetycznym.
Oto wzór na tarcie, wraz z ilustracją:
Ilustracja osoby zjeżdżającej na sankach z załączonym wzorem na tarcie. Tarcie = -1µN*v
Pora podzielić ten wzór na dwie części które pozwolą nam wyznaczyć kierunek tarcia, jak i jego moduł. Na podstawie powyższego rysunku widzimy, że kierunek tarcia jest przeciwny do kierunku prędkości. To jest następujący fragment wzoru: minus, 1, times, v, with, hat, on top, albo -1 pomnożone przez wektor jednostkowy prędkości. W ProcessingJS oznacza to wzięcie wektora prędkości, znormalizowanie go a następnie pomnożenie przez -1.
var friction = velocity.get();
friction.normalize();
// Znajdźmy kierunek siły tarcia
//  (jest to wektor jednostkowy w kierunku przeciwnym do prędkości)
friction.mult(-1);
Zwróćcie uwagę na dwa dodatkowe kroki, które zostały tu wykonane. Po pierwsze, zrobienie kopii wektora prędkości jest bardzo ważne, ponieważ nie chcemy przez przypadek odwrócić kierunku obiektu. Po drugie, normalizujemy wektor. Wynika to z tego, że moduł tarcia nie jest powiązany z tym jak szybko obiekt się porusza, a chcemy zacząć od wektora tarcia z modułem 1, aby łatwiej było go skalować.
Według wzoru, moduł wynosi mu, times, N. μ, Grecka litera mu (wymawiana “miu”), jest tutaj użyta w celu opisania współczynnika tarcia. Współczynnik tarcia określa siłę tarcia danej powierzchni. Im wyższy jest, tym silniejsze tarcie; im niższy, tym słabsze. Na przykład blok lodu ma znacznie niższy współczynnik tarcia niż, powiedzmy, papier ścierny. Ponieważ jesteśmy w zmyślonym świecie ProcessingJS, możemy według własnej zachcianki ustawić ten współczynnik, w oparciu o to jak duże tarcie chcemy symulować.
var c = 0.01;
Teraz coś o drugiej wielkości w tym wzorze: N. To N oznacza siłę normalną, siłę działającą między dwoma obiektami gdy stykają się ze sobą, a dokładnie składową tej siły prostopadłą do powierzchni, którą te ciała się stykają.
Pomyśl o samochodzie poruszającym się po drodze. Samochód wywiera nacisk na powierzchnię drogi i zgodnie z trzecią zasadą dynamiki Newtona droga reaguje siłą skierowaną przeciwnie, działającą na samochód. Siła nacisku samochodu na drogę to jest właśnie ta siła normalna, o której tutaj mówimy. W przypadku, gdy samochód porusza się poziomo, siła normalna równa się iloczynowi masy i przyspieszenia grawitacyjnego, F, start subscript, n, end subscript, equals, m, g. To oznacza, że w przypadku lekkiego, sportowego samochodu siła normalna będzie mniejsza, niż w przypadku masywnego TIRa.
W przypadku powyższego wykresu z sankami, obiekt porusza się po powierzchni pod pewnym kątem, więc wyliczenie siły nacisku jest trochę trudniejsze, gdyż siła ta nie ma tego samego kierunku co siła grawitacji. Aby sobie z tym poradzić, musimy przypomnieć sobie trochę kątów i trygonometrii.
Na razie, naszym celem jest napisanie "wystarczająco" dobrej symulacji dla naszych kodów w ProcessingJS, więc nie będziemy dążyć do perfekcji. Na przykład, możemy przyjąć że siła normalna jest zawsze równa 1. W takim przypadku, N będzie po prostu dane przez:
var normal = 1;
Gdy w następnej części omówimy trygonometrię, wrócimy do tej kwestii, aby uczynić nasz przykład z tarciem bardziej wyrafinowanym.
Teraz, gdy mamy zarówno moduł jak i kierunek tarcia, możemy połączyć to w całość…
var c = 0.01;
var normal = 1;
var frictionMag = c * normal;
var friction = movers[i].velocity.get();
friction.mult(-1);
friction.normalize();
friction.mult(frictionMag);
…i dodać to do naszego przykładu “sił”, gdzie wiele obiektów ma styczność z siłami wiatru i grawitacji, a teraz jeszcze tarcia:
Jeżeli poobserwujecie ten program przez chwilę, zauważycie, że kółka z czasem poruszają się coraz rzadziej i mają tendencję do zatrzymywania się w jednym miejscu. Skoro siła tarcia stale stawia opór obiektom w kierunku przeciwnym do ich ruchu, nasze obiekty powoli zwalniają. To może być przydatna technika lub problem, z zależności od celów waszej wizualizacji.

Ten kurs "Symulacje Natury" jest pochodną z "Natury Kodu " stworzonej przez Daniela Shiffmana, użytej pod licencją Creative Commons Attribution-NonCommercial 3.0 Unported License.