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

Bağlandığınız bilgisayar bir web filtresi kullanıyorsa, *.kastatic.org ve *.kasandbox.org adreslerinin engellerini kaldırmayı unutmayın.

Ana içerik

Yay kuvvetleri

Bu bölümün başında, sinüs dalgasını bir piksel aralığıyla eşleştirerek basit harmonik hareketi modellemeye baktık, ve bu sinüs dalgasını kullanarak bir çekül modellemenizi istemiştik. sin() fonksiyonunu kullanmak bir şeyi çalıştırmak için hızlı tek satır kod kullanan bir yol olsa da, bir yaydan sarkan ve iki boyutlu uzayda ortamdaki (rüzgar, yerçekimi, vb.) diğer kuvvetlere tepki veren bir çekül istiyorsak, bu işe yaramayacaktır. Böyle bir simülasyonu başarmak için (kolun yaylı bir bağlantı olması dışında sarkaç örneğiyle aynı), yayın kuvvetlerini PVector kullanarak modellememiz gerekir.
Bir yayın kuvveti, Hooke Yasası'na göre hesaplanır, bu yasa formülü 1660'da geliştiren İngiliz fizikçi Robert Hooke'Un adıyla anılır. Hooke yasayı orijinal olarak Latince ifade etmiştir: "Ut tensio, sic vis," veya “Gerilme ne kadarsa, kuvvet de o kadar olur.”Bunu şöyle düşünelim:
<div class="callout">
Yaydaki kuvvet, yayın gerilmesiyle doğru orantıdadır.
</div>
Başka bir deyişle, bir çekülü çok çekerseniz, kuvvet güçlü olur; bir çekülü az çekerseniz, kuvvet zayıf olur. Matematiksel olarak, yasa şöyle ifade edilir:
Fyay=k×x
  • k bir sabittir ve değeri sonunda kuvveti ölçekler. Yay yüksek derecede elastik midir, yoksa çok sert midir?
  • x yayın yer değiştirmesini, yani şimdiki uzunlukla durma uzunluğu arasındaki farkı, kasteder. Durma uzunluğu, yayın denge durumundaki uzunluğu olarak tanımlanır.
Şimdi kuvvetin bir vektörün olduğunu hatırlayın, onun için hem büyüklük, hem de yönü hesaplamamız gerekiyor. Yayın bir şemasına daha bakalım ve programda olan tüm verilenleri işaretleyelim.
Üstteki şemada gösterilen üç başlangıç değişkenini, mantıklı değerlerle kuralım.
var anchor = new PVector(100, 10);
var bob = new PVector(110, 100);
var restLength = 20;
Önce, kuvvetin büyüklüğünü hesaplamak için, Hooke Yasası’nı kullanalım. k ve x'i bilmemiz gerekiyor. k kolay; sadece bir sabit, o zaman bir şeyler uyduralım.
var k = 0{,}1;
x belki biraz daha zordur. “Geçerli uzunlukla durağan uzunluk arasındaki uzunluğu” bilmemiz gerekiyor. Durağan uzunluk restLength değişkeniyle tanımlanır. Şimdiki uzunluk nedir? Çapayla çekül arasındaki uzaklık. Bu uzaklığı nasıl hesaplayabiliriz? Çapadan çeküle giden bir vektörün büyüklüğüne ne dersiniz? (Bunun Yerçekimi bölümünde uzaklık hesaplarken kullandığımız süreçle aynı olduğuna dikkat edin.)
var dir = PVector.sub(bob, anchor);
var currentLength = dir.mag();
var x = restLength - currentLength;
Artık kuvvetin büyüklüğü için gereken öğelerin hepsini (-1 * k * x) toparladığımıza göre, yönü, kuvvet yönündeki bir birim vektörü, bulmamız gerekiyor. İyi haber, bu vektörü zaten bulduk. Öyle değil mi? Az önce şöyle soruyorduk: “Bu uzaklığı nasıl hesaplarız? Ya çapadan çeküle doğru uzanan bir vektörün uzunluğu?” İşte bu vektör kuvvetin yönüdür!
Üstteki şemada, yayı durağan uzunluğunun ötesine gerersek, çapaya doğru onu çeken bir kuvvet olması gerektiğini görebiliriz. Durağan uzunluğun altına inerse, kuvvet onu çapadan uzağa itmelidir. Yön değişimi formülde -1 ile kapsanır. O zaman, yapmamız gereken tek şey, uzaklık hesaplaması için kullandığımız PVector'ü normalize etmektir! Koda bakalım ve PVector değişkenini “kuvvet” olarak yeniden isimlendirelim.
var k = 0{,}01;
var force = PVector.sub(bob, anchor); 
var currentLength = force.mag();
var x = restLength - currentLength;
// Yay kuvvetinin yönü, bir birim vektör
force.normalize();
// Bir araya koyma: yön ve büyüklük!
force.mult(-1 * k * x);
Artık yay kuvvet vektörünü hesaplamak için algoritmayı bulduğumuza göre, şu soruyu sorabiliriz: hangi nesne yönelimli programlama yapısını kullanmalıyız? Yine, bu “doğru” cevabın olmadığı durumlardan biridir. Burada birkaç olasılık vardır; hangisini seçtiğimiz programın hedeflerine ve kişinin kendi kişisel kodlama stiline bağlıdır. Yine de, bir Mover nesnesiyle çalışageldiğimiz için, aynı çerçevede devam edelim. Mover nesnemizi yayın “çekülü” olarak düşünelim. Çekülün ekranda hareket etmesi için konum, hız, ve ivme vektörleri gerekir. Mükemmel—biz bunu zaten bulmuştuk! Belki, çekül applyForce() yöntemiyle yerçekimi kuvvetine tabidir. Bir adım daha—yay kuvvetini uygulamalıyız:
var bob = new Bob();

draw = function()  {
  // Our “make-up-a-gravity force”
  var gravity = new PVector(0, 1);
  bob.applyForce(gravity);
  // Ayrıca, bir yay kuvveti hesaplamalı ve uygulamalıyız!
  var springForce = \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_????
  bob.applyForce(spring);

  // Our standard update() and display() methods
  bob.update();
  bob.display();
};
Bir seçenek, yay kuvveti kodunun tamamını ana draw() döngüsünde yazmak olurdu. Ancak birden çok çekül ve yay bağlantısı olan günleri düşünerek, ek bir nesne Spring nesnesi yazmanın mantıklı olduğunu düşünürüz. Üstteki şemada gösterildiği gibi, Bob nesnesi çekülün hareketlerini izler; Spring nesnesi yayın çapasını ve durağan uzunluğunu izler ve çekül üstündeki yay kuvvetini hesaplar.
Bu, bizim bunları birleştiren bu güzel kodu yazmamızı sağlar:
var bob = new Bob();
var spring = new Spring();

draw = function()  {
  // Our “make-up-a-gravity force”
  var gravity = new PVector(0, 1);
  bob.applyForce(gravity);
  // Spring.connect yay kuvvetini hesaplayacak ve uygulayacaktır
  spring.connect(bob);

  // Standart update() ve display() metodlarımız
  bob.update();
  bob.display();
};
Bunun Yerçekimi bölümünde çekim kaynağıyla yaptığımızla benzerlik gösterdiğini farkededebilirsiniz. Orada, şöyle bir şey demiştik:
var force = attractor.calculateAttraction(mover);
mover.applyForce(force);
Burada yayla benzer durum şöyle olurdu:
var force = spring.calculateForce(bob);
bob.applyForce(force);
Bununla birlikte, bu örnekte tüm yaptığımız şuydu:
spring.connect(bob);
Ne oldu? Çekülde applyForce() çağırmamız neden gerekmez? Tabii ki, cevap çeküle applyForce() çağırmamız gerektiğidir. Sadece bunu draw()'da yapmak yerine, gösterdiğimiz şey, gayet mantıklı (ve bazen tercih edilen) alternatifin, çekülde applyForce() çağrılmasını connect() yöntemiyle halletmesini istemek olduğudur.
Spring.prototype.connect(bob) {
var force = /* some fancy calculations */;
bob.applyForce(force);
};
Neden Attractor nesnesiyle Spring nesnesinden daha farklı bir yoldan bunu yapıyoruz? Kuvvetleri ilk öğrenirken, uygulanan tüm kuvvetleri ana draw() döngüsünde göstermek, daha açık bir yöntemdi, ve umarız, bu kuvvet birikimini öğrenmenize yardımcı olmuştur. Artık buna alıştığımıza göre, belki bazı detayları nesnelere yerleştirmek daha basit olur.
Aşağıdaki programda, bunların hepsini birleştirelim. Birkaç şey ekledik: (1) Bob nesnesi çekülün ekranda sürüklenebilmesi için fare etkileşimliliği fonksiyonlarına sahiptir (2) Spring nesnesi bağlantının uzunluğunu bir minimumla maksimum arasında sınırlandırmak için bir fonksiyona sahiptir.

Bu "Doğal Simülasyonlar" dersi, Daniel Shiffman'ın"Kodun Doğası"'nın bir türevidir ve Creative Commons Yüklemesi-Ticari Olmayan 3,0 Dağıtıma Açık Lisansla kullanılmaktadır.

Tartışmaya katılmak ister misiniz?

Henüz gönderi yok.
İngilizce biliyor musunuz? Khan Academy'nin İngilizce sitesinde neler olduğunu görmek için buraya tıklayın.