RK4 neden Euler entegrasyonundan daha iyi? [kapalı]


20

Bu harika slaytların sonunda , yazar sunulan tüm farklı entegratörleri karşılaştırır. Öyle ya da böyle , her ikisi de tüm testleri geçen Geliştirilmiş Euler Entegrasyonu ve Runge Kutta 4 Entegrasyonu dışında hepsi yetersiz kalıyor .

Sanırım çok fizik yoğun olmayan bir 2D oyun üzerinde çalıştığımı söylemeliyim . Sadece Geliştirilmiş Euler Entegrasyonunun nerede yetersiz kalacağını ve bunun yerine RK4'ün nasıl kullanılacağını merak ediyorum.

Oyunum çoğunlukla basit yerçekimi (atlama ve düşme), X ve Y eksenleri boyunca hareket ve sınırlayıcı kutu çarpışmasından oluşur. RK4'ü uygulamaya değer mi yoksa Geliştirilmiş Euler yeterli mi? Euler Integration'ın kullanıcılarının azarlandığı birçok tartışma görüyorum, ancak görebildiğim kadarıyla, Geliştirilmiş Euler basit 2B konularında daha kalitelidir. Ben de daha hızlı olacağını düşünüyorum.


ama bu alan harika slaytlar, örnekler ve hepsi ile çok açık. Bu bağlantı için teşekkürler!
Roy

Bu gerçekten konu dışı ise, muhtemelen Hesaplamalı Bilim için iyi bir seçim olacaktır .
David Z

Ayrıca: Zaman Düzeltmeli Verlet Entegrasyonu - Geliştirilmiş Euler'e benziyor: tam olarak aynı olup olmadığını anlamak için çok tembel. TCV harikadır çünkü sabit zaman adımınızla hoşgörülü olabilirsiniz (diğer entegratörler sabit bir sabit zaman adımı ister).
Jonathan Dickinson

1
Düzenleyemiyorum: Gördüğünü görüyorum. Uygulamasının makalede ana hatlarıyla belirtildiği gibi başlangıç ​​koşulları gereksinimi açısından hata alıp almadığından emin değilim: ancak başlangıç ​​koşullarını doğru bir şekilde hesaplarsam, TCV uygulamamla ilgili yerçekimi sorununu hiç görmedim.
Jonathan Dickinson

Yanıtlar:


15

Ben şahsen Velocity Verlet'i çoğu simülasyon için tercih ediyorum . Bu yöntemle ilgili tecrübelerime göre, oldukça sert denklemler için oldukça uygundur. Bu "geliştirilmiş Euler" yöntemi Velocity Verlet yöntemine oldukça benziyor ve yordayıcı-düzeltici olarak bilinen bir bütünleştirme yöntemlerine dayanıyor . Bugünlerde bu yöntemlerle ilgili birçok şey okuyabilirsiniz, David Baraff'ın örtük yöntemlerin gücünün gerçekten parladığı “Bez simülasyonunda büyük adımlar” ile başlayabilirsiniz . Onların çöküşü sizsiniz:

  1. Yakupyalıları veya Hessianları yaklaştırmak ve sonra,
  2. her bir kare için makul miktarda matris tersi hesaplar.

Eğer bir matematik gurusu değilseniz, parmaklarınızı sıkıştırabilirsiniz. İstediğiniz yöntemi deneyin ve sizin için en iyi performansı gösteren yöntemi tercih edin. Basit her zaman daha iyi değildir, ancak etkileşimli çerçeveler için sadece bir kelime biliyorum: uzlaşma.

Bakmak isteyebileceğiniz bazı ek kaynaklar:

Jakobsen iddialı sorun için bu kadar basit bir fikir bulmak için bir tür dahidir (uzmanlık alanı yanlış anlaşılmadığı takdirde Kriptografi'dir, ancak yönteminin matematiksel eşdeğerliğini Gauss-Seidel yinelemeli algoritma sınıfına kanıtlamayı başardı. ). Basitlik için, örtük yöntemlere derinlemesine bakmadan önce bunu yapın.

DAHA SONRA DÜZENLEME : Kısa bir süre önce , yumuşak veya yarı katı gövde simülasyonu için açık entegratörleri kullanma ve bunların performans ve kalite etkilerinin ne olduğu hakkında bir makale aldım . Bu yazı , senaryoya bağlı olarak belirli bir entegratör seçmek için bir kılavuz görevi görmelidir.


1
+1 Bu aslında içerik açısından gerçekten kaliteli bir cevaptı: ama sindirimi biraz zor (metin duvarı). İyi biçimlendirmenin daima oy almasına yardımcı olduğunu buldum. Bunu geliştirdim ve umarım hak ettiğiniz oyları alırsınız.
Jonathan Dickinson

Teşekkürler Jonathan, "okuyucu dostu" prosedürü göz ardı ederek aceleyle yaptım, ancak bugün bile çok sık kullanıldıkları için bu birkaç kaynaktan bahsetmek zorunda kaldım).
teodron

10

S: Neden gelişmiş Runge Kutta kullanıyorsunuz?
C: Çünkü çok kesin.

S: Neden olmasın?
C: Bir oyun yaptığınız ve çok kesin bir fizik motoru önemli olmadığı için, oyuncuyu kandırmak için yeterince iyi olmalı.

Bu arada, çarpışmada ağır bir nemlendirme varsa, çoğu platformcu gibi, basit bir Euler gayet iyi.

Sunumdaki koddan farklı olarak, size bazı olası aksaklıklardan tasarruf sağlayan ve çok basit bir şekilde enerji kazanma veya enerji kaybetme problemini çözmenizi sağlayan sabit adım fiziği kullanmanızı şiddetle tavsiye ederim. Sadece açık ve kapalı entegrasyon arasındaki orta noktayı araştırın:

velocity += 0.5 * acceleration;
position += velocity;
velocity += 0.5 * acceleration;

Sunumun göstermediği, nesnelerin sınırların ötesine geçmemesi için çarpışmaların nasıl ele alınacağıdır. Bu sorunun basit çözümü yüksek güncelleme sıklığı kullanmaktır. Daha karmaşık ama potansiyel olarak daha iyi performans gösteren bir çözüm, çarpışma anında nesneleri geri hareket ettirmektir, kesin uygulama istenen fizik davranışına bağlıdır.


1
"Oyuncuyu kandırmak" için +1 - ama kişisel olarak 'çok basit' sistemler patladı çünkü euler entegrasyonu yüzünden
Jonathan Dickinson

@JonathanDickinson Euler entegrasyonu yüzünden değil, bir dizi koşul nedeniyle Euler entegrasyonunun bunlardan sadece biri olduğunu söyleyebilirim. Eğer bir örneğiniz varsa, patlayan sistemlerden kaçınmanın bir yolunu bulabileceğime eminim.
aaaaaaaaaaaa

Ah RK / Verlet hakkında bilgi edinmeden önce bazı gerçekten eski VB6 şeyler (tam anlamıyla 14 yaşındayken) benim - artık kod bile yok: Bu başka bir şey olabilir gerçeğine yüksek bir güven verir karışıma :).
Jonathan Dickinson

1
Sanırım eklemeliyim, basit yerçekimi yerine nesneler arasındaki cazibe ile uğraşmaya başlar başlamaz, entegrasyon yöntemini arttırmak benim için makul görünüyor, kesinlikle gerekli olmayabilir, ancak işlem gücüne sahipseniz sadece olumsuz biraz daha karmaşık bir kod.
aaaaaaaaaaaa

1

Sunumda hata var. Sunucu tarafından "Geliştirilmiş Euler" olarak adlandırılan yöntem aslında Hız Verlet yöntemidir!

Daha yetkili kaynak için buraya bakın: http://www.physics.udel.edu/~bnikolic/teaching/phys660/numerical_ode/node5.html

Aynı denklemler Wikipedia'dadır .

Euler metodu üzerinde hemen görülen genel bir gelişme, sunum yapan kişinin muhtemelen aklında olan ancak Velocity Verlet'i gelişmiş Euler olarak yanlış sonuçlandırdığı Midpoint yöntemidir . Midpoint yöntemi ile Velocity Verlet arasındaki tek fark, hızın sadece son ivmeye bağlı olmak yerine son ve sonraki ivmenin ortalaması olmasıdır.

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.