VPython Kullanan Basit Fizik Animasyonları

Fatih Küçükkarakurt

Fatih Küçükkarakurt

7 min read

Fizik deneyleri, genellikle pahalı ve gürültülü ekipmanlara sahip olmanızı gerektirdiğinden, gerçek hayatta uygulaması zor olabilen bir konudur. Günümüzde deneyler daha karmaşık hale geldikçe, simülasyon ve modelleme yöntemleri, verileri analiz etmek ve yorumlamak için ilgi çekici bir alan haline geldi. Bu makale, simülasyonlar için 3D Python ortamı olan VPython kullanarak fiziksel sistemleri modellemeye başlamanızı amaçlamaktadır.

Az sonra manyetik bir alandaki yüklü bir parçacığın sarmal hareketini modellemek için Python ve GlowScript ile bir 3D fizik simülasyonu oluşturacağız.

Manyetik bir alanda yüklü parçacıkların hareketlerini simüle etme

Elektromanyetizma, elektrik ve manyetik alanların nasıl etkileşime girdiğinin incelenmesidir. Bu makalede, yüklü parçacıkların manyetik bir alanda nasıl hareket ettiğine bakıp, biraz da elektromanyetizma konuşacağız.

Yüklü parçacıklar dış manyetik alana dik bir hızla hareket ettiklerinde, hıza sürekli dik olan manyetik kuvvet, merkezcil kuvvet olarak hareket ettiğinden, dairesel hareket gerçekleştirir. Buraya kadar bir problem yok. Peki, ya hız, manyetik alana tam olarak dik değilse? Bu, manyetik alana dik olan hız bileşeninin, yüklü parçacığın dairesel hareket halinde olması için merkezcil kuvveti sağlamaya devam edeceği anlamına gelir. Öte yandan, manyetik alana paralel hız bileşeni, merkezcil ivmesinde ve yönünde herhangi bir değişiklik yaşamayacaktır. Bu nedenle, aşağıda gösterildiği gibi sarmal bir yol gözlemleyeceğiz.

Manyetik bir alanda yüklü bir parçacığın sarmal hareketi

VPython'a Giriş

Yukarıda bahsettiğimiz fizik fenomenini yeniden yaratmak için VPython kullanacağız. VPython, bu fenomenin 3 boyutlu görselleştirmelerini gerçekleştirmemize izin verir. VPython için çevrimiçi bir kod editörü olan GlowScript'i kullanacağız. Buradan GlowScript'e erişebilirsiniz.

Bağlantıya tıkladıktan sonra, "Sign in" butonuna tıklayın ve Google Hesabınızı kullanarak giriş yapın. Ardından GlowScript sayfasındaki "here" butonuna tıklayın ve başlamak için "Create New Program" sekmesine tıklayın.

Alternatif olması açısından, VPython'u yerel olarak çalıştırmak isteyebilirsiniz. Bu durumda VPython modülünü içe aktarmanız gerekecektir. VPython / Glowscript belgelerini burada bulabilirsiniz.

Ortamı Oluşturmak

Herhangi bir hareketli parçacıkla uğraşmaya başlamadan önce, ilk olarak çalışma alanımızı tanımlamalıyız. Aşağıdaki kod, kullanacağımız sahnenin boyutunu tanımlayarak VPython'da nasıl bir sahne oluşturabileceğimizi göstermektedir.

scene = display(width=1500, height=600)

İlk olarak, deneyimizin sınırlarını tanımlamaya başlayalım. Deneyimizi kapalı bir küp içerisinde gerçekleştireceğiz. Bu küpün kenarlarını yine küplerden oluşturacağız. Yani kendi konteynerimizi çizeceğiz.

xlen, ylen , zlen = 100, 100, 100  
boundaries = [  
box(pos = vector(0,-ylen/2,0), size = vector(xlen, .2, zlen)),  
box(pos = vector(0,ylen/2,0), size = vector(xlen, .2, zlen)),  
box(pos = vector(-xlen/2,0,0), size = vector(.2, ylen, zlen)),  
box(pos = vector(xlen/2,0,0), size = vector(.2, ylen, zlen)),  
box(pos = vector(0,0,-zlen/2), size = vector(xlen, ylen, .2))  
]

Burada küp konteynerimizin uzunluğunu 100 birim olacak şekilde belirlemiş olduk. Ayrıca konteynerimizin kenarlarını oluşturmak için bir box listesi tanımladık. Şimdi buradaki her bir "box" argümanının ne yaptığına göz atalım.

  • pos, bağımsız değişken kutuların merkezlerinin, konum vektörünü temsil eder, bir vektördür.
  • size, 3 vektör değeri alır. x, y ve z eksenlerinde değerleri vardır. Kutularımızın kalınlığının 0.2 birim olduğuna dikkat edelim.

Artık deneyimizi devam ettirmek için bir konteynerimiz var. Gerçek nesneler yaratmaya geçmeden önce, birkaç fizik sabiti tanımlayalım. Bu tanımlayacağımız sabitlerin ne anlama geldiğini açıklayacağım. Ancak bu noktada, tanımlayacağımız değerlerin ne işe yaradığına dair kabaca bir fikir sahibi olmak yeterli olacaktır.

dt = .001 #zaman adımı 
Bfield = 5 #manyetik alan gücü  
v_mag = 20 #protonun hızının büyüklüğü 
Q = 0.5 #rastgele birimlerde protonun yükü
theta = pi/4 #protonun fırlatma açısı
v = vector(v_mag*cos(theta), v_mag*sin(theta), 0) #hız vektörü
B = vector(0,-Bfield,0) #manyetik alan vektörü
starting_point = vector(0,-ylen/2 + 1,0) #protonun başlangıç pozisyonu vektörü

Python Sınıflarını kullanarak nesneleri tanımlama

Bu bölümde, manyetik bir alanda seyahat eden protonumuzu temsil etmek için bir Python sınıfı kullanacağız.

class create_proton:  
    def __init__(self, v): #v hızı temsil eden bir vektördür 
        self.v = v  
        self.proton = sphere(pos = starting_point, color = color.red, radius = 1, make_trail=True, trail_type="curve")  
        self.a = vector(0,0,0)  
      
    def move(self): #protonu küçük adımlarla hareket ettirir 
        self.a = Q * cross(self.v, B) # F = ma = q v x B  
        self.v += self.a * dt #a = dv/dt  
        self.proton.pos += self.v * dt #v = dx/dt  
      
    def reset_proton(self): #proton konumunu ve yolunu sıfırlar 
        self.proton.pos = starting_point   
        self.v = v  
        self.proton.clear_trail()  
        self.a = vector(0,0,0)  
          
    def check_collision(self): #sınırları kontrol eder
        if self.proton.pos.y < ylen / 2 and self.proton.pos.x < xlen/2 and self.proton.pos.y > -ylen/2 and self.proton.pos.x > -xlen/2 and self.proton.pos.z > -zlen/2 and self.proton.pos.z < zlen/2:  
            return True  
        else:  
            return Falseproton = create_proton(v) # 'proton' değişkenini yaratır

Bu kod parçacığında yer alan creat_proton sınıfımızın 4 işlevi vardır.

  • init

Bu işlev, sınıf oluşturulduğunda çağrılacaktır. Bu, protonun varsayılan hız vektörünü self.v olarak ayarlar. VPython'da küre olarak modellenen protonu da oluşturuyoruz. Protonun yarıçapını tanımladık ve protonun yolunun arkasına bir iz çizmek için kullanacağımız ayarı açtık.

  • move

Bu işlev, protonu belirli bir zamanda küçük bir artışla hareket ettirir. İvme (self.a),

F = Q ( v x B )

şeklinde belirtilen Lorentz Kuvvet Yasasına göre hesaplanır. Bu nedenle v vektörlerinin çapraz çarpımını kullanırız. B ise sonucun ivmesini ve yönünü belli eder. Hızların bileşenlerini çözmeye gerek yoktur. Protonu her seferinde küçük bir adımla hareket ettirdiğimiz, hızı ve yer değiştirmeyi kademeli olarak güncellediğimiz için zaman adımlarımızın devreye girdiği yer de burasıdır. Böylece, küçük zaman adımını (dt), protonun yer değiştirmesi ve hızıyla çarparız.

  • reset_proton

Bu işlev, denemeyi daha sonra birçok kez çalıştırabilmemiz için tüm parametreleri sıfırlar.

  • check_collision

İçinde bulunulan büyük küpün duvarlarıyla çarpışma yoksa, bu işlev bize true döndürür. Değilse, false döndürür ve program sona erer.

Bu noktada, "Run this program" butonuna tıklarsanız, aşağıdaki gibi bir yapı ile karşılaşmalısınız.

Kutunun altında kırmızı küre şeklinde protonlu 3B kutu

Kutuyu sürüklemek için farenizin sağ tıkına basılı tutabilirsiniz.

Başlatma işlevi

Aşağıda, deneyimizin bir örneğini gerçekleştiren ana başlatma işlevini tanımlıyoruz. İlk olarak, sistemdeki tüm değişkenleri sıfırlıyoruz ve proton konteynerin herhangi bir duvarıyla çarpışmazken, her küçük zaman adımını (dt) bekledikten sonra protonu hareket ettiriyoruz. Algoritmanın verimliliğini artırmak için zaman adımı yerleştirmemiz önemli.

def launch():  
proton.reset_proton()  
while proton.check_collision():  
rate(1/dt) #basit bir gecikme işlevi  
proton.move()

Bundan sonra, deneyi başlatmak için bir başlatma düğmesi oluşturuyoruz. Düğmenin kodu aşağıdaki gibidir:

button(text="Launch!", bind=launch) #butonu ve işlevi bağlıyoruz

Sliders kullanarak parametreleri ayarlama

Herhangi bir deneyde, eğilimleri gözlemlemek için parametrelerimizi değiştirebilmek isteriz. Sliders, bu işlevi gerçekleştirmede son derece kullanışlıdır. Örneğin, manyetik alan kuvvetini ( B ) ayarlamak için kod aşağıdaki gibi kullanılabilir.

scene.append_to_caption("\n\n") #düzenli bir yapı için satırlar...
def adjustBfield():  
    global Bfield #Global değer güncellemek için  
    Bfield = BfieldSlider.value  
    B = (0,-Bfield,0) #B aşağıya doğru
    BfieldSliderReadout.text = BfieldSlider.value + " Tesla"BfieldSlider = slider(min=0, max=10, step=.5, value=5,  
bind=adjustBfield)  
scene.append_to_caption(" B-field Strength = ")  
BfieldSliderReadout = wtext(text="5 Tesla")

İşlev, Slider'dan girişi alır ve koddaki manyetik alan gücü değerlerini günceller. Slider ayarlandığında, adjustBfield işlevi çağrılacak ve koddaki tüm değerler güncellenecektir. B'nin değerinin görüntüsü de ekranda güncellenecektir. Slider'ı oluştururken, slider'ın aralıklarını da belirtebilirsiniz. Bu parametrelerden herhangi birini değiştirmek isterseniz, buradaki slider belgelerine başvurabilirsiniz.

Yük miktarı ( Q ) ve fırlatma açısı ( θ ) için benzer sliderlar kullanılabilir ve ilgili kod aşağıda verilmiştir.

#Q yükünü ayarla 
scene.append_to_caption("\n\n")  
def adjustQ():  
    global Q  
    Q = QSlider.value  
    QSliderReadout.text = QSlider.value + " Coulumbs"QSlider = slider(min=0, max=1, step=.1, value=.5,  
bind=adjustQ)  
scene.append_to_caption(" Q = ")  
QSliderReadout = wtext(text="0.5 Coulumbs")#Thera açısını ayarla  
scene.append_to_caption("\n\n")  
def adjustAngle():  
    global theta  
    theta = angleSlider.value * pi / 180 #Derece-Radyan dönüşümü 
    angleSliderReadout.text = angleSlider.value + " degrees"  
    proton.v = vector(v_mag*cos(theta), v_mag*sin(theta), 0)  
      
  
angleSlider = slider(min=0, max=90, step=1, value=45,  
bind=adjustAngle)  
scene.append_to_caption(" Angle = ")  
angleSliderReadout = wtext(text="45 degrees")

Sliderları oluşturduktan sonra, canvas'ın altında şu şekilde görünmelidir:

Deneysel parametreleri ayarlamak için başlat düğmesi ve sliders

Protonun yolunu ve parametreleri değiştirmek için sliderları sürükleyebilirsiniz.

Simülasyonu çalıştırma

Artık protonu fırlatmaya hazırsınız! "Run this program" a tıklayın ve ardından oluşturduğunuz başlat düğmesine tıklayın. Daha önce öğrendiğimiz gibi, protonun sarmal bir yolda ilerlediğini fark edeceksiniz.

Protonun sarmal yolu

Sliderları kullanarak farklı değerleri deneyebilir, farklı yarıçap ve aralıklarda sarmallar oluşturabilirsiniz. Simülasyonu denemek için buraya tıklayabilirsiniz.

Özet

VPython'un 3 boyutlu arayüzü, her türlü harika deney ve animasyonu yapmamızı sağlar. Fizik simülasyonlarında yaygın olarak kullanılır. VPython'un birçok heyecan verici uygulaması var ve yaptığımız örnek çalışma bunlardan sadece biri.

VPython ile yapacağınız simülasyonlar, deneyler ve testler konusunda size başarılar diliyorum. Umarım yararlı bir makale olmuştur.

Kendinize iyi bakın.

Anatoliacode Makale Aboneliği

Bize abone olarak tüm makaleleri ilk siz okuyabilirsiniz. Ayrıca asla reklam veya spam yapmıyoruz.