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

Newton'un Hareket Yasaları

Son bölümün son örneğinde, ekrandaki bir çemberden çıkan ve farenin konumuna işaret eden bir vektöre göre, dinamik ivmeyi nasıl hesaplayabildiğimizi görmüştük. Ortaya çıkan hareket, çember ve fare arasında bir manyetik çekime benziyordu, sanki bir kuvvet çemberi fareye doğru içeri çekiyormuş gibi. Bu bölümde, kuvvet kavramı ve ivmeyle ilgisi hakkında anladıklarımızı biçimselleştireceğiz. Amacımız, nasıl ekranın etrafında birden fazla nesneyi hareket ettireceğimizi ve değişik çevresel kuvvetlere tepki vermelerini sağlayacağımızı anlamaktır.
Kuvvetleri kodla simüle etmenin pratikte yarattıklarını incelemeye başlamadan önce, gerçek hayatta kuvvet olmanın kavramsal olarak anlamına bakalım. Aynen “vektör” sözcüğü gibi, “kuvvet” sözcüğü de birkaç anlama gelebilir. “Betül, taşı büyük bir güçle itti” veya “Ali güçlüce konuştu.” örneklerindeki gibi gücü belirtebilir. Gücün  daha çok resmi tanımı ile ilgileniyoruz ve bu Isaac Newton’un hareket kanunlarından geliyor:
Kuvvet, kütlesi olan bir nesnenin hızlanmasına neden olan bir vektördür.
Buradaki iyi haber, tanımın ilk kısmının tanıdık olmasıdır: kuvvet bir vektördür. Çok şükür, bir bölüm boyunca vektörün ne olduğunu ve PVector'le nasıl programlama yapacağımızı öğrendik!
Kuvvet kavramıyla ilgili olarak Newton'un üç hareket yasasına bir bakalım.

Newton’un Birinci Yasası

Newton’un birinci yasası genelde şöyle ifade edilir:
Duran bir nesne durmaya ve hareket eden bir nesne hareket etmeye devam eder.
Ancak, burada kuvvetlerle ilgili önemli bir öge eksiktir. Bunu şöyle ifade ederek genişletebiliriz:
Dengelenmemiş bir kuvvet etki etmediği sürece, duran bir nesne durmaya devam eder ve hareket halindeki bir nesne sabit hız ve yönde harekete devam eder.
Newton geldiğinde, —Aristoteles'in oluşturduğu— geçerli hareket teorisi neredeyse iki bin yaşındaydı. Belirttiği şey şudur, bir nesne hareket ediyorsa, hareketinin devam etmesini sağlamak için bir tür kuvvet gereklidir. Hareket eden şey çekilmiyor veya itilmiyorsa, sadece yavaşlayacaktır veya duracaktır. Öyle değil mi?
Bu, tabii ki doğru değildir. Herhangi bir kuvvetin yokluğunda, bir nesnenin harekete devam etmesi için herhangi bir kuvvet gerekmez. Dünyanın atmosferinde havaya atılan (top gibi) bir nesne hava direnci nedeniyle (bir kuvvet) yavaşlar. Bir nesnenin hızı, sadece kuvvet olmadığında veya uygulanan kuvvetler birbirini götürdüğünde, yani net kuvvet toplamı sıfır olduğunda, sabit kalır. Buna çoğunlukla denge denir. Düşen top, hava direnci yerçekimi kuvvetine eşitlendiğinde (sabit kalacak) bir hıza ulaşacaktır.
Bir sarkaça üfleyen iki kişinin şeması
Sarkaç hiç hareket etmez çünkü tüm kuvvetler birbirini götürür (toplamları sıfır net kuvvet eder)
ProcessingJS dünyamızda, Newton’un birinci yasasını aşağıdaki gibi yazabiliriz:
Bir nesne denge durumundaysa, PVector sürati sabit kalır.
Newton’un ikinci yasasını şimdilik atlarsak (bu bizim için en önemli yasadır), üçüncü yasaya geçelim.

Newton’un Üçüncü Yasası

Bu yasayı genellikle şu şekilde belirtiriz:
Her etkiye karşılık, eşit ve zıt bir tepki vardır.
Bu yasa, ifade edildiği şekliyle sık sık karışıklık yaratır. İlk olarak, bir kuvvetin başka bir kuvvete neden olduğunu ima etmektedir. Evet, birisini iterseniz, o kişi aktif bir şekilde sizi de itmeye karar verebilir. Ama, Newton’üçüncü yasasında bahsettiği etki ve tepki bu değildir.
Diyelim ki, bir duvarı itiyorsunuz. Duvar aktif olarak sizi geri itmeye karar vermez. “Başlangıç” kuvveti yoktur. İtmeniz, “etki/tepki çifti” olarak tanımlanan iki kuvveti de kapsar.
Bunu şu şekilde daha iyi ifade edebiliriz:
Kuvvetler hep ikili şekilde ortaya çıkar. Bu iki kuvvet eşit güçte, ama ters yöndedir.
Şimdi, bu yine de kafa karışıklığına neden olur, çünkü bu kuvvetlerin birbirini götürdüğü gibi bir anlam ortaya çıkmaktadır. Durum böyle değildir. Unutmayın ki, bu kuvvetler farklı nesnelere etki etmektedir. Ve bu kuvvetlerin eşit olması, hareketlerin eşit olduğu (veya nesnelerin duracağı) anlamına gelmez.
Duran bir kamyonu itmeyi deneyin. Kamyon sizden çok daha güçlü olsa da, hareket eden bir kamyonun aksine, duran bir kamyon sizi ezemez ve geriye doğru uçmanıza neden olamaz. Uyguladığınız kuvvet, elinize uygulanan kuvvete eşittir ve tersi yöndedir. Sonuç, başka etkenlere de bağlıdır. Kamyon, buzlu bir yokuşta, yokuş aşağı duran bir kamyonet ise, hareket etmesini sağlamanız kolay olacaktır. Öte yandan, bu, toprak yolda çok büyük bir kamyonsa ve yeterince iterseniz (belki de koşarak gelir itersiniz), elinizi incitebilirsiniz.
Ya patenliyken bir kamyonu itseniz?
Patenli bir adam bir kamyonu itiyor
ProcessingJS dünyamız için Newton'un üçüncü yasasını belirtelim:
A nesnesinin B nesnesine kuvveti olan bir PVector f'yi hesaplarsak, B'nin A nesnesine uyguladığı kuvveti de—PVector.mult(f,-1);—uygulamalıyız.
ProcessingJS programlama dünyasında, üsttekine hep bağlı kalmamız gerekmez. Bazen, cisimler arasındaki yer çekimsel çekim durumu gibi olaylarda, eşit ve ters yönde kuvvetleri modellemek isteriz. Diğer zamanlarda, sadece şöyle diyoruz, “Hey, ortamda biraz rüzgar var,” bir vücudun havaya uyguladığı kuvveti modellemekle ilgilenmiyoruz. Aslında, havayı hiç modellemiyoruz! Unutmayın ki, sadece doğal dünyadaki fizikten ilham alıyoruz, her şeyi mükemmel bir hassasiyetle taklit etmiyoruz.

Newton'un İkinci Yasası

ProcessingJS programcısı için en önemli yasaya geldik.
Bu yasa, genel olarak şöyle ifade edilir:
Kuvvet eşittir kütle çarpı ivme.
Ya da:
F=MA
Bu, neden bizim için en önemli yasadır? Neyse, farklı bir şekilde yazalım.
A=F/M
İvme, kuvvetle doğru, kütleyle ters orantılıdır. Bunun anlamı şöyledir, itildiğinizde, ne kadar kuvvetli itilirseniz, o kadar hızlı hareket edersiniz (ivme kazanırsınız). Ne kadar büyükseniz, o kadar yavaş hareket edersiniz.
Ağırlık ve Kütle
Bir nesnenin kütlesi, nesnedeki madde miktarının bir ölçüsüdür (kilogram cinsinden ölçülür).
Çoğunlukla kütleyle karıştırılan ağırlık, teknik olarak, bir nesneye etki eden yerçekimi kuvvetidir. Newton’un ikinci yasasına göre, bunu kütle çarpı yerçekiminin ivmesi olarak hesaplayabiliriz (w = m * g). Ağırlık newton cinsinden ölçülür.
Özkütle birim hacim başına, kütle miktarıdır (örneğin, bir santimetreküpteki gram).
Dünyada kütlesi bir kilogram olan bir nesnenin, ayda da kütlesinin bir kilogram olacağını unutmayın. Ancak, ağırlığı altıda biri olacaktır.
Şimdi, ProcessingJS dünyasında, kütle nedir ki? İşimiz sadece piksellerle, değil mi? Daha basit bir şekilde başlamak için, bizim taklit piksel dünyamızda her nesnenin kütlesinin 1'e eşit olduğunu varsayalım. F/1 = F. Ve böylece:
A=F
Bir nesnenin ivmesi, kuvvete eşittir. Bu harika bir haber. Ne de olsa, Vektörler bölümünde, ekrandaki nesnelerin hareketini kontrol etmenin kilit noktasının ivme olduğunu görmüştük. Konum hızla, hız da ivmeyle ayarlanır. İvme, her şeyin başlangıcıdır. Şimdi, her şeyin başladığı yerin gerçekten kuvvet olduğunu öğreniyoruz.
Öğrendiklerimizi kullanarak, şu anda konum, hız, ve ivmesi olan Mover nesnemizi oluşturalım. Şimdi hedefimiz, bu nesneye kuvvet ekleyebilmektir, belki şöyle diyebiliriz:
mover.applyForce(wind);
veya:
mover.applyForce(gravity);
burada rüzgar ve yerçekimi PVectordür. Newton’un ikinci yasasına göre, bu fonksiyonu şöyle uygulayabiliriz:
Mover.prototype.applyForce = function(force) {
this.acceleration = force;
};

Kuvvet Birikimi

Bu gayet iyi görünüyor. Ne de olsa, ivme = kuvvet Newton’un (kütle olmadan) ikinci yasasının birebir çevirisidir. Yine de, burada oldukça büyük bir sorun vardır. Yapmak istediğimiz şeye dönelim: ekranda rüzgar ve yer çekimine tepki veren hareketli bir nesne yaratma.
mover.applyForce(wind);
mover.applyForce(gravity);
mover.update();
mover.display();
Tamam, şimdi bir an için bilgisayar olduğumuzu varsayalım. İlk olarak, rüzgarla applyForce()'u çağırıyoruz. Ve böylece, Taşıyıcı nesne’nin ivmesine, PVector rüzgarı atanmış olur. İkinci olarak, yerçekimiyle applyForce()'u çağırıyoruz. Şimdi Taşıyıcı nesne’nin ivmesi yerçekimi PVector'üne eşitlenmiştir. Üçüncü olarak update()'i çağırırız. update()'de ne olur? İvme hızla toplanır.
velocity.add(acceleration);
Programımızda hata göremeyeceğiz, ama aman! Büyük bir sorunumuz var. Hızla topladığımızda, ivmenin değeri ne olur? Yer çekimi kuvvetine eşit olur. Rüzgar dışarıda kaldı! applyForce()'u birden fazla kere çağırırsak, bir önceki çağrıyı geçersiz kılar. Birden fazla kuvveti nasıl idare edeceğiz?
Aslında, burada Newton’un ikinci yasasının basitleştirilmiş bir ifadesiyle başladık. Bunu ifade etmenin daha doğru bir yolu şudur:
Net Kuvvet eşittir kütle çarpı ivme.
Ya da, ivme eşittir tüm kuvvetlerin toplamı bölü kütle. Bu çok mantıklı. Ne de olsa, Newton’un birinci yasasında gördüğümüz gibi, tüm kuvvetlerin toplamı sıfır olursa, nesne denge durumunda kalır (yani ivme olmaz). Bunu, kuvvet birikimi adı verilen bir süreçle uygularız. Aslında bu çok basittir; yapmamız gereken tek şey, tüm kuvvetleri toplamaktır. Herhangi bir anda, 1, 2, 6, 12, veya 303 kuvvet mevcut olabilir. Nesnemiz bunları nasıl biriktireceğini bildiği sürece, ona etki eden kuvvet sayısının önemi yoktur.
applyForce() yöntemini, her yeni kuvveti ivmeye ekleyecek ve bunları biriktirecek şekilde değiştirelim:
Mover.prototype.applyForce = function(force) {
this.acceleration.add(force);
};
Henüz bitirmedik. Kuvvet birikiminde bir parça daha var. Herhangi bir zamanda tüm kuvvetleri topladığımızdan dolayı, update() her çağrıldığında, ivmenin açık (yani sıfıra eşit) olmasını sağlamalıyız. Şimdi bir dakikalığına rüzgarı düşünelim. Rüzgar bazen çok güçlü, bazen zayıftır ve bazen de hiç rüzgar olmaz. Herhangi bir anda, örneğin kullanıcı fareyi basılı tuttuğunda, kuvvetli bir rüzgar çıkabilir
if (mousePressed) {
  var wind = new PVector(0{,}5, 0);
  mover.applyForce(wind);
}
Kullanıcı fareyi bırakınca rüzgar durur ve Newton’un birinci yasası gereği, nesne sabit hızla hareket etmeye devam edecektir. Ancak, ivmeyi sıfıra eşitlemeyi unuttuysak, ani rüzgar hala etkili olmalıdır. Daha da kötüsü, kuvvetleri biriktirmekte olduğumuz için, önceki çerçeveden kendisine eklenecektir! Bizim simülasyonumuzda, ivmenin belleği yoktur; zamandaki bir anda mevcut çevresel kuvvetlerin hesaplanmasıyla bulunur. Bu, örneğin konumdan farklıdır, konum, nesnenin bir önceki çerçevede nerede olduğunu hatırlamalıdır ki, onu bir sonrakine düzgün bir şekilde geçirsin.
Her çerçevede ivmeyi silmeyi uygulamaya koymanın en kolay yolu, update() sonunda PVector'ü 0 ile çarpmaktır.
Mover.prototype.update = function() {
    this.velocity.add(this.acceleration);
    this.location.add(this.velocity);
    this.acceleration.mult(0);
};

Kütle ile İlgilenme

Tamam. Mover sınıfımıza kuvvetleri entegre etmemiz bitmeden ve örneklere bakmaya hazır olmadan önce, ufacık bir ekleme yapmamız gerekir. Aslında, Newton’un ikinci yasası, A=F değil, F=MA'dır. Kütleyi eklemek, nesnemize bir özellik eklemek kadar kolaydır, ama burada biraz daha zaman harcamamız gerekiyor, çünkü hafif bir komplikasyon ortaya çıkacak.
Ölçü Birimleri
Artık kütleye giriş yaptığımıza göre, ölçü birimleriyle ilgili küçük bir not kaydetmek önemlidir. Gerçek hayatta, ölçüler belirli birimler cinsinden olur. İki nesnenin birbirinden 3 metre uzaklıkta bulunduğunu, beyzbol topunun saatte 90 mil hızla hareket ettiğini veya bovling topunun kütlesinin 6 kilogram olduğunu söyleriz. Bu derste daha sonra göreceğimiz gibi, bazen gerçek hayattaki birimleri dikkate almak isteriz. Ancak, bu bölümde, çoğunlukla bunları görmezden geleceğiz. Bizim ölçü birimimiz pikseldir (“Bu iki çember 100 piksel uzaklıktadır”) ve animasyon karesidir (“Bu çember, kare başına 2 piksel hareket etmektedir”). Kütle söz konusu olduğunda, kullanacağımız bir ölçü birimi yoktur. Bir şey uyduracağız. Bu örnekte, rastgele 10 sayısını seçiyoruz. Bir ölçü birimi olmasa da, kendiniz bir birim icat etmek isteyebilirsiniz, mesela “1 mug” veya “1 yörkıl.” Gösterim amacıyla, kütleyi piksele bağlayacağımızı da not etmenizi istiyoruz (örneğin, yarıçapı 10 olan bir çember çizmek gibi). Bu, bir nesnenin kütlesini görselleştirmemizi sağlayacak. Ancak, gerçek hayatta boyut kesinlikle kütleyi belirtmez. Küçük metal bir topun, yüksek özkütlesi nedeniyle, büyük bir balondan çok daha büyük kütlesi olabilir.
Kütle bir skalerdir (ondalık), vektör değildir, çünkü nesnedeki madde miktarını açıklayan bir sayıdır. Fiyakalı şeyler yapıp bir şeklin alanını kütlesi olarak hesaplayabiliriz, ama şöyle başlamak daha basit olur, “Hey, bu nesnenin kütlesi…hım, bilmiyorum…1 desek?”
var Mover = function() {
    this.mass = 1;
    this.position = new PVector(random(width), random(height));
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
Bu çok da iyi değil, çünkü nesnelerin farklı kütleleri olduğunda, işler ilginçleşir, ama başlangıç için yeterli olur. Kütle nerede işin içine giriyor? Nesnemize Newton’un ikinci yasasını uygularken bunu kullanıyoruz.
Mover.prototype.applyForce = function(force) {
  force.div(this.mass);
  this.acceleration.add(force);
};
Yine de, kodumuz çok mantıklı olsa da, burada çok önemli bir problem var. İkisi de rüzgar kuvvetiyle sürüklenen Mover nesnelerinin senaryosunu düşünün.
var m1 = new Mover();
var m2 = new Mover();

var wind = new PVector(1, 0);

m1.applyForce(wind);
m2.applyForce(wind);
Yine, bilgisayar olalım. m1 nesnesi rüzgar kuvvetini—(1,0)—alır, kütleye (10) böler ve ivmeyle toplar.
| m1 rüzgar kuvvetine eşittir: | (1,0) | | Bölü kütle, yani 10: | (0,1, 0) |
Tamam. m2 nesnesine geçiyoruz. Ayrıca rüzgar kuvvetini de—(1,0) alır. Durun. Bir saniye bekleyin. Bu rüzgar kuvvetinin değeri nedir? Daha yakından bakarsak, rüzgar kuvvetinin artık (0,1, 0) olduğunu görürüz!! Nesnelerle çalışmakla ilgili bu küçük parçayı hatırlıyor musunuz? Bir fonksiyona bir nesne (bu durumda, PVector) geçirdiğinizde, bu nesneye bir referans geçiriyorsunuz. Bu bir kopya değildir! Yani bir fonksiyon bir nesneyi değiştirdiğinde (bu durumda, kütlesini bölerek bunu yapar), o zaman bu nesne kalıcı olarak değişir! Ama m2'nin m1 nesnesinin kütlesine bölünmüş bir kuvveti almasını istemiyoruz. Bu kuvveti başlangıçtaki durumunda—(1,0) almak istiyoruz. Ve böylece, kendimizi korumalıyız ve kütlesiyle bölmeden önce, PVector f'nin kopyasını almalıyız. Neyse ki, PVector nesnesinin kopya—get() yapmak için uygun bir yöntemi vardır. get() aynı verilerle yeni bir PVector nesnesi verir. Ve böylece applyForce()'u şu şekilde gözden geçirebiliriz:
Mover.prototype.applyForce = function(force) {
    var f = force.get();
    f.div(this.mass);
    this.acceleration.add(f);
};
Alternatif olarak, yöntemi div()'in statik versiyonunu kullanarak, önceki bölümde statik fonksiyonlarla ilgili bildiklerimizi kullanarak, yeniden yazabiliriz:
Mover.prototype.applyForce = function(force) {
  var f = PVector.div(force, this.mass);
  this.acceleration.add(f);
};
Önemli olan, orijinal kuvvet vektörüne etki etmeyen bir yol bulmaktır, böylece birden çok Mover nesnesine uygulanabilir.

Kuvvet Oluşturma

Kuvvetin ne olduğunu (vektör) biliyoruz, ve bir nesneye kuvvet uygulamayı (kütleye bölme ve nesnenin ivme vektörüne ekleme) biliyoruz. Burada ne eksik? Hala ilk başta bir kuvveti nasıl elde edeceğimizi bulamadık. Kuvvetler nereden ortaya çıkar?
Bu bölüm boyunca, ProcessingJS dünyamızda kuvvet oluşturmak için iki yönteme bakacağız:
  • Bir kuvvet oluşturun! Ne de olsa, programcı, dünyanızın yaratıcısı olan sizsiniz. Herhangi bir kuvveti uydurmamanız ve uygulamamanız için hiçbir neden yok.
  • Bir kuvveti modelleyin! Evet, kuvvetler gerçek dünyada vardır. Ve fizik ders kitaplarında çoğu zaman bu kuvvetlerin formülleri bulunur. Bu formülleri alabiliriz, kaynak koduna çevirebiliriz ve ProcessingJS'de gerçek hayattaki kuvvetleri modelleyebiliriz.
Bir kuvveti oluşturmanın en kolay yolu, bir sayı seçmektir. Rüzgarı simüle etme fikriyle başlayalım. Sağa bakan, oldukça zayıf bir rüzgar kuvvetine ne dersiniz? Taşıyıcı bir m nesnesini varsayarsak, kodumuz şöyle görünür:
var wind = new PVector(0{,}01, 0);
  m.applyForce(wind);
Bu sonuç çok da ilginç değil, ama başlangıç olarak iyi bir nokta. Bir PVector nesnesi oluştururuz, başlangıç değeri veririz, ve bir nesneye geçiririz (bu da onu kendi ivmesine uygulayacaktır). İki kuvvetimiz olsun istiyorsak, belki rüzgar ve yerçekimi (aşağı doğru ve biraz daha kuvvetli), aşağıdakini yazabiliriz:
var wind = new PVector(0{,}01, 0);
var gravity = new PVector(0, 0{,}1);
m.applyForce(wind);
m.applyForce(gravity);
Şimdi ikisi de m nesnesine uygulanmakta olan, değişik yönleri işaret eden, farklı büyüklükte iki kuvvetimiz var. Bir yerlere varıyoruz. ProcessingJS'de nesnelerimiz için, gerçekten de tepki verebilecekleri, bir dünya yarattık.
Şimdi hepsini birleştirdiğimizde, programımız şöyle görünür:
Vay! Birçok konu işledik, ama şimdi o kadar şey yapabiliyoruz ki. Devam edin - kuvveti kullanmayı öğrenin!

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.