Garip sonuçlarla 3. dereceden 4. dereceye kadar sezgisel entegratör testi


10

Gelen Cevabıma a MSE üzerinde soruya 2D Hamilton fizik simülasyonu ile ilgili olarak, daha yüksek bir dereceden kullanarak sürmüştür simplektik entegratörü .

Daha sonra, farklı zaman adımlarının yöntemlerin farklı siparişlerle küresel doğruluk üzerindeki etkilerini göstermenin iyi bir fikir olabileceğini düşündüm ve bu yönde bir Python / Pylab betiği yazdım ve çalıştırdım. Karşılaştırma için seçtim:

Garip olan şey, ne zaman seçersem seçelim, Ruth'un 3. dereceden yöntemi testimde Ruth'un 4. dereceden yönteminden, hatta bir büyüklük sırasına göre daha doğru gibi görünüyor.

Benim sorum şu: Burada neyi yanlış yapıyorum? Detaylar aşağıda.

Yöntem sistemlerde gücünü açığa ayrılabilir , örneğin, aşağıdaki gibi ifade edilebilir olanlar Hamiltonyenlerin her konum koordinatları içerir, konjugatı momentumları, içeren kinetik temsil enerji ve potansiyel enerji.

H(q,p)=T(p)+V(q)
qpTV

Bizim düzenimizde, kuvvetleri ve momentumları uygulandıkları kütlelerle normalleştirebiliriz. Böylece kuvvetler ivmeye, anlıklar da hızlara dönüşür.

ve etiketleyeceğim özel (verilen, sabit) katsayılarla birlikte gelir . Bu katsayılar ile zaman sistemin gelişen için bir adım süresi şeklindedira1,,anb1,,bntt+δt

  • İçin :i=1,,n

    1. İşlem vektör tüm ivmelerin verilen vektör tüm pozisyonlarıngq
    2. Tüm hızların vektörünüvbigδt
    3. Tüm konumların vektörel değeriniqaivδt

Bilgelik şimdi katsayılarda yatıyor. Bunlar

[a1a2b1b2]=[121201](leap2)[a1a2a3b1b2b3]=[2323172434124](ruth3)[a1a2a3a4b1b2b3b4]=1223[12123212321201231](ruth4)

Test için 1D başlangıç ​​değeri problemini seçtim ayrılabilir Hamiltonian olan . Burada, ile tespit edilir .

y+y=0y(0)=1y(0)=0
(y(t),y(t))=(cost,sint)
(q,v)(y,y)

Ben üzerinden yukarıdaki yöntemlerle IVP entegre bir adım boyu ile bir tamsayı ile arasından seçilen bir yerde ve . Artık2'nin hızını dikkate alarak , bu yöntem için üçe katladım . Daha sonra elde edilen eğrileri faz boşluğuna ve eğrilerin ideal olarak tekrar gelmesi gereken yakınlaştırdım .t[0,2π]δt=2πNN10100N-(1,0)N(1,0)t=2π

ve için çizimler ve yakınlaştırmalar :N=12N=36

N = 12N = 12, yakınlaştırılmış

N = 36N = 36, yakınlaştırılmış

İçin , leap2 adım büyüklüğü ile daha yakın ev gelmesi olur ruth4 adım boyutu ile . İçin , ruth4 üzerinden kazanç leap2 . Ancak, ruth4 ile aynı adım büyüklüğüne sahip ruth3 , şimdiye kadar test ettiğim tüm ayarlarda eve her ikisinden de çok daha yakın geliyor.N=122π3N 2π2πNN=36

İşte Python / Pylab betiği:

import numpy as np
import matplotlib.pyplot as plt

def symplectic_integrate_step(qvt0, accel, dt, coeffs):
    q,v,t = qvt0
    for ai,bi in coeffs.T:
        v += bi * accel(q,v,t) * dt
        q += ai * v * dt
        t += ai * dt
    return q,v,t

def symplectic_integrate(qvt0, accel, t, coeffs):
    q = np.empty_like(t)
    v = np.empty_like(t)
    qvt = qvt0
    q[0] = qvt[0]
    v[0] = qvt[1]
    for i in xrange(1, len(t)):
        qvt = symplectic_integrate_step(qvt, accel, t[i]-t[i-1], coeffs)
        q[i] = qvt[0]
        v[i] = qvt[1]
    return q,v

c = np.math.pow(2.0, 1.0/3.0)
ruth4 = np.array([[0.5, 0.5*(1.0-c), 0.5*(1.0-c), 0.5],
                  [0.0,         1.0,          -c, 1.0]]) / (2.0 - c)
ruth3 = np.array([[2.0/3.0, -2.0/3.0, 1.0], [7.0/24.0, 0.75, -1.0/24.0]])
leap2 = np.array([[0.5, 0.5], [0.0, 1.0]])

accel = lambda q,v,t: -q
qvt0 = (1.0, 0.0, 0.0)
tmax = 2.0 * np.math.pi
N = 36

fig, ax = plt.subplots(1, figsize=(6, 6))
ax.axis([-1.3, 1.3, -1.3, 1.3])
ax.set_aspect('equal')
ax.set_title(r"Phase plot $(y(t),y'(t))$")
ax.grid(True)
t = np.linspace(0.0, tmax, 3*N+1)
q,v = symplectic_integrate(qvt0, accel, t, leap2)
ax.plot(q, v, label='leap2 (%d steps)' % (3*N), color='black')
t = np.linspace(0.0, tmax, N+1)
q,v = symplectic_integrate(qvt0, accel, t, ruth3)
ax.plot(q, v, label='ruth3 (%d steps)' % N, color='red')
q,v = symplectic_integrate(qvt0, accel, t, ruth4)
ax.plot(q, v, label='ruth4 (%d steps)' % N, color='blue')
ax.legend(loc='center')
fig.show()

Zaten basit hataları kontrol ettim:

  • Wikipedia yazım hatası yok. Özellikle referansları kontrol ettim ( 1 , 2 , 3 ).
  • Katsayı dizisini doğru buldum. Wikipedia'nın sıralamasıyla karşılaştırırsanız, operatör uygulamasının sıralamasının sağdan sola doğru çalıştığını unutmayın. Numaram Candy / Rozmus ile aynı fikirde . Yine de başka bir sipariş denersem, sonuçlar daha da kötüleşir.

Şüphelerim:

  • Yanlış kademeli sipariş: Belki Ruth'un üçüncü dereceden düzeni bir şekilde çok daha küçük zımni sabitlere sahiptir ve adım boyutu gerçekten küçük yapılmışsa, 4. dereceden yöntem kazanırdı? Ama bile denedim ve 3. dereceden yöntem hala üstündür.N=360
  • Yanlış test: Testimle ilgili özel bir şey, Ruth'un 3. dereceden yönteminin daha üst düzey bir yöntem gibi davranmasına izin veriyor mu?

Sayısal hata değerleri verebilir misiniz? Arsadan söylemek biraz zor. Hatalar değiştirirken nasıl ölçeklenir ? Yöntemlerin emirlerinden beklendiği gibi ölçekleniyor mu? Genellikle biri bunu kontrol etmek için bir log-log grafiğinde karşı hataları çizer. NNN
Kirill

@Kirill: Bunun üzerinde çalışıyoruz. Yakında düzenleyecek.
ccorn

1
Şüphelendiğim bir şey doğrusal bir rhs seçimidir: yöntemlerin kesme hataları genellikle rhs'nin bazı yüksek türevlerine bağlıdır, bu nedenle rhs'nin tüm yüksek türevleri kaybolursa, bazı garip yakınsama davranışları gözlemleyebilirsiniz. Muhtemelen daha alışılmadık bir rhs denemeye değer.
Kirill

Yanıtlar:


9

Kirill'in önerisini takiben testi kabaca geometrik olarak artan değerler listesinden ile çalıştırdım ve her için hatayı burada yaklaşıklığı temsil eder sayısal entegrasyon ile elde edilir. Bir günlük-günlük grafiğinde sonuç:N ϵ (NN˜z

ϵ(N)=z~(2π)z~(0)2wherez~(t)=(y~(t),y~(t))
z~

resim açıklamasını buraya girin

Yani ruth3 gerçekten aynı düzene sahip olarak ruth4 bu test durumla ve sadece ima sabitleri büyüklüğü.141100

İlginç. Daha fazla araştırmam gerekecek, belki de diğer testleri deneyeceğim.

Bu arada, hata grafiği için Python komut dosyasına eklenenler:

def int_error(qvt0, accel, qvt1, Ns, coeffs):
    e = np.empty((len(Ns),))
    for i,N in enumerate(Ns):
        t = np.linspace(qvt0[2], qvt1[2], N+1)
        q,v = symplectic_integrate(qvt0, accel, t, coeffs)
        e[i] = np.math.sqrt((q[-1]-qvt1[0])**2+(v[-1]-qvt1[1])**2)
    return e

qvt1 = (1.0, 0.0, tmax)
Ns = [12,16,20,24,32,40,48,64,80,96,128,160,192,
      256,320,384,512,640,768,1024,1280,1536,2048,2560,3072]

fig, ax = plt.subplots(1)
ax.set_xscale('log')
ax.set_xlabel(r"$N$")
ax.set_yscale('log')
ax.set_ylabel(r"$\|z(2\pi)-z(0)\|$")
ax.set_title(r"Error after 1 period vs #steps")
ax.grid(True)
e = int_error(qvt0, accel, qvt1, Ns, leap2)
ax.plot(Ns, e, label='leap2', color='black')
e = int_error(qvt0, accel, qvt1, Ns, ruth3)
ax.plot(Ns, e, label='ruth3', color='red')
e = int_error(qvt0, accel, qvt1, Ns, ruth4)
ax.plot(Ns, e, label='ruth4', color='blue')
ax.legend(loc='upper right')
fig.show()

Soruyla ilgili değil, ancak ayrı bir yanıt olarak göndermek yerine, lütfen sorunun kendisinde değişiklik ve güncelleme koyabilir misiniz? Bu, cevapların soruyu cevaplaması gerektiği konvansiyonunu muhafaza eder .
Kirill

1
@Kirill: O olduğu bir cevap. ruth3 gerçekten daha yüksek düzen ve daha az sabittir. Bir günlük günlüğü hata grafiği yapma öneriniz nedeniyle keşfedildi. Bu nedenle soru cevaplanır ve bir soru cevaplandıktan sonra cevabını değiştirmeyeceğim, cevap benim tarafımdan oluşturulmuş olsa bile.
ccorn

Bununla birlikte, daha fazla analizi kabul etmekten memnuniyet duyarım. (Kendi kendine cevaplanan sorular otomatik olarak kabul edilir, ancak sanırım biri değişebilir.)
ccorn

2
Biraz baktım ve ikna edici bir açıklama bulamadım. Ruth3'ün bu 4-sıralı yakınsamasının başlangıç ​​koşullarıyla bir ilgisi vardır: ayarını deneyin ve tam bir süre (ne de yarım dönem) için entegre çalışın. Kolayca gerçekleşebilecek bir şey, kısaltma hatasının, tam bir döneme entegre ettiğinizde iptal edilen bazı "sıfır ortalama" bileşenine sahip olmasıdır. Ayrıca , birkaç yüksek türevi olan ile bir ilgisi olup olmadığını kontrol etmek için denedim , ancak testlerimde başlangıç ​​koşulları ve periyodikliğin bununla daha fazla ilgisi var gibi görünüyor. V ( q ) = 1 / q + log q Vp00V(q)=1/q+logqV
Kirill

2
Bu bir süper yakınsamadır. Bunun gibi basit test problemleri, çoğu durumda bu sorunu yaşar. Doğrusal bir denklem kullanmak bu davranışı verebilir ve Taylor serisinin garip terimleri çoğu zaman bu durumda iptal edebilir. Analitik bir çözümü olmayan doğrusal olmayan bir test probleminin bunun meydana gelme olasılığı daha düşüktür.
Chris Rackauckas

2

, hatasını tam beklenen sıraya göre verilen adım büyüklüğünün gücüyle ölçeklenir.q¨=qq(0)=1,q˙(0)=0

resim açıklamasını buraya girin

Beklendiği gibi, alt aralıkların sayısının artması için grafikler, gitgide artan hata katsayısı olan bir sınır eğrisine giderek daha fazla yaklaşmaktadır. Bir komplo dışında tüm bu yakınsama gözle görülür derecede hızlıdır, neredeyse hiç sapma yoktur. Bu, nispeten büyük adım boyutları için bile, önde gelen hata teriminin diğer tüm terimlere egemen olduğu anlamına gelir.

3. derece Ruth yönteminde, bileşeninin başlangıç katsayısı sıfır gibi görünür, görünür sınır eğrisi yatay eksene yakın veya eşittir. Görünür grafikler, 4. derece hata teriminin baskınlığını açıkça göstermektedir. 4. sıra hatası için ölçeklendirme, diğerlerine benzer bir grafik verir.p

Görüldüğü gibi, her üç durumda da, bileşenindeki siparişin hata katsayısı, tam bir süreden sonra sıfırdır . Her iki bileşenin hatalarını birleştirirken, bileşeninin davranışı egemen olur, bu da loglog grafiğinde 4. dereceden bir yöntem izlenimi verir.qt=2πp

bileşenindeki maksimum katsayı . Buradaki loglog grafiği, doğru global hata siparişlerini yansıtmalıdır.q3π/2


Ruth3p'de 3. derece hata teriminin ortadan kaybolmasının doğrusal denklemin basitliğinin bir artefaktı olması doğrusal olmayan örneği gösterir , karşılık gelen grafiklerleq¨=sin(q)q(0)=1.3, q˙(0)=0

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.