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

Ако си зад уеб филтър, моля, увери се, че домейните *. kastatic.org и *. kasandbox.org са разрешени.

Основно съдържание

Съпротива на въздух и флуид

Диаграма на съпротивлението на флуида около самолет
Триенето се проявява и когато едно тяло минава през течност или газ. Тази сила има много различни имена, които значат едно и също: сила на вискозитета, сила на влачене, съпротивление на флуида. Въпреки че резултатът е същият като в предишните примери за триене (обектът се забавя), начинът, по който изчисляваме силата на влачене, ще бъде малко по-различен. Да разгледаме формулата:
Fd=12ρv2ACdv^
Сега да я разделим на части и да видим какво ни трябва за ефективна симулация в ProcessingJS, като измислим своя много по-проста формула в този процес.
  • Fd се отнася до силата на влачене, векторът, който искаме да изчислим и да подадем на нашата функция applyForce().
  • -1/2 е константа: -0,5. Това може да се пропусне в света на ProcessingJS, тъй като така или иначе ще си измисляме стойности за други константи. Обаче фактът, че е отрицателна, е важен, тъй като това ни казва, че силата е в противоположна посока на скоростта (точно както е при триенето).
  • ρ е гръцката буква ро и се отнася до плътността на течността, нещо, за което не е нужно да се притесняваме. Можем да опростим задачата и да приемем, че плътността има постоянна стойност 1.
  • v се отнася до скоростта на обекта, който се движи. Добре, това го имаме! Скоростта на обекта е величината на вектора на скоростта: velocity.mag(). А v2 означава просто v, повдигнато на квадрат, или vv.
  • A се отнася до предната площ на обекта, който се движи през течността (или газа). Едно аеродинамично Ламборджини например ще изпитва по-малко въздушно съпротивление в сравнение с ръбестото Волво. Въпреки това за една базова симулация можем да приемем, че нашият обект е сферичен и да игнорираме този елемент.
  • Cd е коефициентът на влачене, съвсем същият като коефициента на триене (ρ). Това е константа, която ще определим според това дали искаме силата на влачене да бъде силна или слаба.
  • v^ Изглежда ли ти познато? Би трябвало. Това се отнася до вектора за единица скорост или velocity.normalize(). Точно както е при триенето, влаченето е сила, която сочи в противоположна посока на посоката на скоростта.
След като анализирахме всеки от тези компоненти и определихме какво ни тряба за базова симулация, можем да редуцираме нашата формула до:
Опростена формула: F_drag = ||v ^ 2|| * c_d * v - 1
или:
// Част 1 от нашата формула (величина): v^2 * Cd
var c = 0{,}1;
var speed = v.mag();
var dragMagnitude = c * speed * speed;

// Част 2 от нашата формула (посока): v unit vector * -1 
var drag = velocity.get();
drag.normalize();
drag.mult(-1);

// Величина и посока заедно!
drag.mult(dragMagnitude);
Нека имплементираме тази сила в нашия обект Mover с едно допълнение. Когато написахме примера за триене, силата на триене винаги присъстваше. Когато обектът се движеше, триенето го забавяше. Тук ще включим един елемент от средата – "течността", през която преминава нашият обект Mover. Обектът Liquid ще бъде правоъгълник и ще знае своята локация, широчина, височина и "коефициент на влачене" – т.е. дали за обектите е лесно да минават през него (като през въздуха) или е трудно (като през меласа)? В допълнение трябва да включим и функция, която да го нарисува на екрана (и още две функции, които ще видим след малко).
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);
};
Сега основната програма ще декларира и инициализира нова инстанция на обекта Liquid. Забележи, че коефициентът е нисък (0,1), в противен случай обектът ще спре доста бързо (което някой ден може би ще бъде ефектът, който търсиш).
var liquid = new Liquid(0, height/2, width, height/2, 0{,}1);
А сега един интересен въпрос: как да накараме обекта Mover да си говори с обекта Liquid? С други думи, как да изпълним следното:
Когато обектът мине през течност, той изпитва сила на влачене.
…или казано по обектно-ориентиран начин (ако приемем, че обхождаме масив от обекти Mover с индекс i):
// Дали обектът Mover е в течността?
if (liquid.contains(movers[i])) {
    // Изчисляваме силата на влачене
    var dragForce = liquid.calculateDrag(movers[i]);
    // Прилагаме силата на влачене върху обекта Mover
    movers[i].applyForce(dragForce);
}
Горният код ни казва, че трябва да добавим две функции към обекта Liquid: (1) функция, която определя дали обектът Mover е в обекта Liquid, и (2) функция, която изчислява силата на влачене, упражнявана върху обекта Mover.
Първата е лесна; можем просто да използваме условен израз, за ​​да определим дали местоположението на вектора е във вътрешността на правоъгълника, определен от течността.
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;
};
Функцията drag() е малко по-сложна: но ние вече написахме кода. Това е просто имплементация на нашата формула. Силата на влачене е равна на коефициента на влачене, умножен по скоростта на обекта Mover, повдигнат на квадрат в посока, обратна на тази на скоростта!
Liquid.prototype.calculateDrag = function(m) {
  // Величината е коефициентът * скоростта на квадрат
  var speed = m.velocity.mag();
  var dragMagnitude = this.c * speed * speed;

  // Посоката е обратна на скоростта
  var dragForce = m.velocity.get();
  dragForce.mult(-1);

  // Скалираме според величината
  // dragForce.setMag(dragMagnitude);
  dragForce.normalize();
  dragForce.mult(dragMagnitude);
  return dragForce;
};
И с тези две функции, добавени към обекта Liquid, сме готови да съберем всичко в една програма:
Когато изпълниш програмата, ще забележиш, че симулираме топки, които падат във водата. Обектите се забавят, само когато минават през сивата област в долната част на прозореца (която представлява течността). Ще забележиш още, че по-малките обекти се забавят повече в сравнение с по-големите обекти. Помниш ли втория закон на Нютон? A = F / M. Ускорението е равно на силата, разделена на масата. Един масивен обект ще се ускори по-малко. Един по-малък обект ще се ускори повече. В този случай ускорението, за което говорим, е "забавянето" вследствие на влаченето. По-малките обекти ще се забавят повече в сравнение с по-големите обекти.

Курсът "Компютърни симулации на физични явления" е производeн на "Природата на кода" от Даниел Шифман, използвана от Creative Commons Attribution-NonCommercial 3,0 Unported License.

Искаш ли да се присъединиш към разговора?

Все още няма публикации.
Разбираш ли английски? Натисни тук, за да видиш още дискусии в английския сайт на Кан Академия.