__    __                      __                        __ 
  /  |  /  |                    /  |                      /  |
  $$ |  $$ |  ______    _______ $$ |   __   ______    ____$$ |
  $$ |__$$ | /      \  /       |$$ |  /  | /      \  /    $$ |
  $$    $$ | $$$$$$  |/$$$$$$$/ $$ |_/$$/ /$$$$$$  |/$$$$$$$ |
  $$$$$$$$ | /    $$ |$$ |      $$   $$<  $$ |  $$ |$$ |  $$ |
  $$ |  $$ |/$$$$$$$ |$$ \_____ $$$$$$  \ $$ \__$$ |$$ \__$$ |
  $$ |  $$ |$$    $$ |$$       |$$ | $$  |$$    $$/ $$    $$ |
  $$/   $$/  $$$$$$$/  $$$$$$$/ $$/   $$/  $$$$$$/   $$$$$$$/ 
  
                                                                          
               

VPython Kullanan Basit Fizik Animasyonları

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.

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.

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 okumanızı öneririm.

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.

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 create_proton sınıfımızın 4 işlevi vardır.

  1. 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.

  2. 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.

  3. reset_proton

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

  4. 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.

VPython ile çizdirilen kırmızı küre

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, 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")
        

Elde edeceğiniz slider'lar aşağıdaki gibi görünecektir:

VPython animasyon launch canvas görünümü

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 izleyeceği yolun simülasyonu

Sliderları kullanarak farklı değerleri deneyebilir, farklı yarıçap ve aralıklarda sarmallar oluşturabilirsiniz. Simülasyonu denemek için bu örneği kullanabilirsiniz.

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.

Burası Hackod.