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ść

Opór powietrza i cieczy

Diagram oporu aero(hydro)dynamicznego wokół samolotu
Tarcie także ma miejsce, gdy ciało przechodzi przez ciecz lub gaz. Ta siła ma wiele różnych nazw, ale wszystkie z nich oznaczają to samo: siłę lepkości, siłę oporu aerodynamicznego, opór hydrodynamiczny. O ile końcowy rezultat jest taki sam jak w naszych poprzednich przykładach tarcia (obiekt zwalnia), sposób w jaki obliczamy siłę oporu aerodynamicznego będzie trochę inny. Spójrzmy na wzór:
Fd=12ρv2ACdv^
Rozbijmy to na poszczególne elementy i sprawdźmy, co tak naprawdę potrzebujemy do skutecznej symulacji w ProcessingJS, przy okazji tworząc zdecydowanie prostszy wzór.
  • Fd odnosi się do siły oporu aerodynamicznego - wektora, który ostatecznie chcemy obliczyć i przekazać funkcji applyForce().
  • -1/2 jest stałą: -0,5. To narazie nieistotne z punktu widzenia naszego świata ProcessingJS, ponieważ i tak będziemy wymyślać wartości dla innych stałych. Jednakże, ważny jest fakt, że jest to wartość ujemna, ponieważ mówi nam to, że siła jest skierowana przeciwnie do prędkości (tak jak w przypadku tarcia).
  • ρ jest grecką literą rho i odnosi się do gęstości płynu - wartości, o którą nie musimy się martwić. Możemy to uprościć i przyjąć, że gęstość ma stałą wartość, wynoszącą 1.
  • v oznacza szybkość poruszającego się obiektu. Z tym sobie poradzimy! Szybkość obiektu to nic innego jak długość wektora prędkości: velocity.mag(). v2 oznacza po prostu v do kwadratu lub vv.
  • A oznacza powierzchnię czołową obiektu, który przechodzi przez ciecz lub gaz. Na przykład aerodynamiczne Lamborghini będzie doświadczać mniej oporu powietrza niż kanciaste Volvo. Niemniej, dla podstawowej symulacji możemy uważać, że nasz obiekt ma kształt kuli i pominąć ten element.
  • Cd jest współczynnikiem siły oporu, dokładnie tym samym co współczynnik tarcia (μ). To stała, którą określimy na podstawie tego, czy chcemy by siła oporu aerodynamicznego była duża czy mała.
  • v^ Wygląda znajomo? Powinno. To wyrażenie odnosi się do wektora jednostkowego prędkości, np. velocity.normalize(). Tak jak tarcie, opór aerodynamiczny jest siłą, która jest skierowana w kierunku przeciwnym do prędkości.
Teraz gdy przeanalizowaliśmy każdy z tych składowych i ustaliliśmy co potrzebujemy do prostej symulacji, możemy uprościć nasz wzór do:
Uproszczony wzór: F_drag = ||v^2|| * c_d * v - 1
Albo:
// Część I naszego wzoru (moduł): v^2 * Cd
var c = 0.1;
var speed = velocity.mag();
var dragMagnitude = c * speed * speed;

// Część II naszego wzoru (kierunek): v wektor jednostkowy * -1 
var drag = velocity.get();
drag.normalize();
drag.mult(-1);

// Magnitude and direction together!
drag.mult(dragMagnitude);
Zaimplementujmy tą siłę w naszym typie obiektowym Mover z jednym dodatkiem. Kiedy napisaliśmy nasz przykład z tarciem, siła tarcia była zawsze obecna. Gdy obiekt był w ruchu, tarcie spowalniało go. Wprowadźmy nowy element do środowiska: “ciecz”, przez którą przechodzić będą obiekty Mover. Obiekt Liquid będzie prostokątem i będzie zawierał wiedzę o swoim położeniu, szerokości, wysokości i “współczynniku tarcia”, np. czy łatwo jest obiektom poruszać się przez niego (np. powietrze) czy ciężko (np. syrop)? Dodatkowo powinien zawierać funkcję do narysowania się na ekranie i jeszcze dwie funkcje, które zobaczymy za chwilę.
var Liquid = function(x, y, w, h, c) {
  this.x = x;
  this.y = y;
  this.w = w;
  this.h = h;
  this.c = c;
};

Liquid.prototype.display = function() {
  noStroke();
  fill(50);
  rect(this.x, this.y, this.w, this.h);
};
Teraz główny program zadeklaruje i zainicjalizuje nową instancję obiektu Liquid. Zwróć uwagę, że współczynnik jest niski (0,1), inaczej obiekt zatrzymałby się dość szybko (co pewnego razu może być pożądanym efektem).
var liquid = new Liquid(0, height/2, width, height/2, 0.1);
Teraz pojawia się interesujące pytanie: jak mamy zmusić obiekt Mover do komunikacji z obiektem Liquid? Innymi słowy, chcemy zrealizować to, co następuje:
Kiedy mover przechodzi przez płyn, doświadcza siły aerodynamicznej.
…lub w obiektowym języku (zakładając, że przechodzimy pętlą przez tablicę obiektów Mover z indeksem i):
// Czy Mover znajduje się w płynie?
if (liquid.contains(movers[i])) {
// Oblicz siłę oporu aerodynamicznego
var dragForce = liquid.calculateDrag(movers[i]);
// Przyłóż siłę oporu aerodynamicznego do Movera
movers[i].applyForce(dragForce);
}
Powyższy kod pokazuje nam, że potrzebujemy dwóch funkcji dla typu obiektowego Liquid - funkcję, która określa czy obiekt Mover znajduje się w obiekcie Liquid oraz funkcję, która oblicza siłę oporu aerodynamicznego wywieraną na obiekcie Mover.
Pierwsza jest łatwa - możemy po prostu użyć wyrażenia warunkowego aby ustalić, czy wektor położenia leży w środku prostokąta definiowanego przez płyn.
Liquid.prototype.contains = function(m) {
var p = m.position;
return p.x > this.x && p.x < this.x + this.w &&
p.y > this.y && p.y < this.y + this.h;
};
Funkcja drag() jest trochę bardziej skomplikowana, jednakże napisaliśmy już jej kod. To jest po prostu implementacja naszego wzoru. Siła oporu aerodynamicznego jest równa współczynnikowi siły oporu pomnożonego przez szybkość obiektu Mover, podniesioną do kwadratu, w kierunku odwrotnym do prędkości!
Liquid.prototype.calculateDrag = function(m) {
 // Wartość równa się współczynnik * szybkość do kwadratu
var speed = m.velocity.mag();
  var dragMagnitude = this.c * speed * speed;

 // Kierunek jest odwrotny do prędkości
  var dragForce = m.velocity.get();
  dragForce.mult(-1);

  // Skaluj zgodnie z długością
  dragForce.normalize();
  dragForce.mult(dragMagnitude);
  return dragForce;
};
Z tymi dwoma funkcjami dodanymi do typu obiektowego Liquid jesteśmy gotowi do złożenia wszystkiego w jeden program:
Uruchamiając program, powinieneś zauważyć, że symulujemy kulki wpadające do wody. Obiekty zwalniają tylko wtedy, gdy przekraczają niebieski obszar na dole okna (reprezentujący płyn). Zauważysz także, że mniejsze obiekty będą zwalniać dużo bardziej niż większe obiekty. Pamiętasz drugą zasadę dynamiki Newtona? A = F / M. Przyspieszenie równa się sile podzielonej przez masę. Masywny obiekt będzie przyspieszał mniej. Mniejszy obiekt będzie przyspieszał więcej. W tym przypadku przyspieszenie, o którym mówimy, jest “spowolnieniem” spowodowanym oporem aerodynamicznym. Mniejsze obiekty będą zwalniać w szybszym tempie niż większe.

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.

Chcesz dołączyć do dyskusji?

Na razie brak głosów w dyskusji
Rozumiesz angielski? Kliknij tutaj, aby zobaczyć więcej dyskusji na angielskiej wersji strony Khan Academy.