Kararsız kayan nokta hesaplamaları nasıl belirlenir?


15

Sayısal olarak, kararsız şemaları tanımlayabilmek ve kararlılıklarını geliştirmek çok önemlidir. Kararsız kayan nokta hesaplamaları nasıl belirlenir?

Birçok sayısal şemanın birlikte çalıştığı çok karmaşık bir simülasyon üzerinde çalışıyorum ve zayıf kısımlarını tanımlamak için bir yöntem arıyorum. Diferansiyel denklemleri içeren fiziksel bir model üzerinde çalışıyorum. Genel sürecin kuş bakışı görünümü:

  1. (Ön aşama) fiziksel gözlemler toplayın P .

  2. Simülasyonun başlangıç ​​parametrelerini belirleyin. Bu kullanım şu parametreler için bir parametre alanı ve görünüm yürümek bir optimizasyon algoritması, bazı hata fonksiyonu şu şekilde E (F (° C), p) en aza indirilir, F bazı parametrelerin türetilmiş miktarıdır.

  3. Simülasyon motoruna C takın . Bu EDP'nin bir Euler şemasıdır, böylece her zaman adımında, dinamiği yönlendiren terimleri hesaplıyoruz (her biri potansiyel olarak kararsızlığa maruz kalan karmaşık bir işlevdir) ve bir sonraki hesaplamak için Euler şemasını bu dinamik terimlerle besliyoruz durum. Bu binlerce zaman noktası için geçerli.

  4. Simülasyonun sonunda , son durum S'nin bazı Proof (S) fonksiyonunu hesaplıyor ve gözlenen miktarlardan çıkarılan bazı Require (P) miktarlarını karşılaştırıyoruz. Bu, sonucun resmi bir kanıtı değil, daha fazla inandırıcılık kontrolüdür.

Ayrıca, karmaşık operasyonlar kulesi görüyorum (Euler şeması içinde, İspat içinde dinamik terimlerin hesaplanması ). Ve “kötü kısımları” tanımak ve düzeltmek istiyoruz.

Kayan nokta sayılarının bir yazılım uygulamasını düşük hassasiyetle kullanmanın sayısal şemaların kararsızlığını artıracağını ve böylece farklı uygulamalar arasındaki karşılaştırmayı kolaylaştıracağını tahmin ediyorum. Bu, bu soruyu araştırmak için yaygın bir teknik midir? Programı değiştirmeksizin bunu başarmak için Bochs olarak sanal bir makine kullanmak mümkün müdür?

Kararlılık sorusu ile uygun şekilde başa çıkmak için, bazen sayısal prosedürün tipik girdisini hedeflemek kabul edilebilir, böylece bu girdide iyi yapmak ve belki de diğer geçerli, ancak olası olmayan girdide daha az iyi ayarlanabilir. Tipik girdilerin bir örneği verildiğinde, bazı ara sonuçları gözetlemek ve onlar için istatistiksel bir profil hazırlamak mümkündür . Yine, bu kararlılık konularını incelemek için yaygın bir teknik midir? Sanal makine bunun için yararlı mı?



@Simon Haklı olabilirsiniz, ancak bu kesinlikle alanlar arası bir soru. Sanırım cevaplayabilen kişiler hem matematik hem de programcılara ya da hiçbirine kayıtlı değiller… Bu sorunun cevabını burada bulup bulamayacağını biraz bekleyelim!
user40989

1
Aralık aritmetiği?
SK-logic


2
Euler'i devleti yaymak için kullanmak illa ki kötülük değildir; optimizasyon da değildir, ancak sorunu gerçekten alt görevlere ayırmanız gerekir. Sayısal kararsızlık, en az sizin sıkıntılarınız olabilir - yanlış bir maksimuma yakınlaşma ve ODE / PDE'lerin sertliği ile ilgili problemler bundan daha büyük görünür. Ve evet, asla tek bir hassasiyet kullanmayın :)
Deer Hunter

Yanıtlar:


6

Kayan nokta hesaplamasının kararlılığı çalışması, sayısal analizin bir parçasıdır ve gerçekten sağlam bir sonuç istiyorsanız, gerçekten o alanda bilgili bir kişinin kullanılan algoritmaların analizini yapmasını istersiniz.

Kararsız algoritmaları deneysel olarak tanımlamaya yardımcı olabilecek bazı şeyler vardır. Farklı modlara (yukarı / aşağı / rastgele) ayarlanmış yuvarlama veya farklı hassasiyetle çalıştırma ve sonucun çok fazla değişmediğini kontrol etme. Cevap çok mu fazla? hiç de basit değil ve cevap hayır olsa bile , algoritmanın kararlı olduğu anlamına gelmiyor, sadece kullandığınız veri kümesinde kararsız bulunmadı.

Yorumlarda aralık aritmetiği önerilmiştir. Ona baktığımda, aralık aritmetiğinin en kuduz yanlısı bile, aralık aritmetiği için tasarlanmış algoritmalarla iyi çalıştığını, ancak algoritmayı analiz etmeden ve iyi çalışmadığı bilinen desenlerin olmamasını sağlayarak ona geçmenin, yararlı olmak (rakipler, aralık aritmetiğinin ön koşullarının, pratik ilgi için fazla kısıtlayıcı olduğu durumlarda yararlı olabileceği görüşündeydiler)


3

Kararlı kayan nokta algoritmaları tasarlamak son derece önemsizdir. Kendimden daha matematiksel olarak yetenekli olanlar, mümkün olan yerlerde, kendinizinkini yuvarlamaya çalışmak yerine, saygın kütüphaneleri kullanmanızı önerir. Bölgedeki standart referans şöyledir:

NJ Higham. Sayısal Algoritmaların Doğruluğu ve Kararlılığı. Endüstriyel ve Uygulamalı Matematik Topluluğu, Philadelphia, PA, ABD, ikinci baskı, 2002. ISBN 0-89871-521-0

Hangi tür hesaplamaların, dillerin vb. Hakkında daha fazla şey bilmemek, somut bir cevap vermeyi zorlaştırır. Burada iyi bir ders var: http://introcs.cs.princeton.edu/java/91float/ Bu biraz basit olabilir, ancak java kullanıyorsanız iyi bir tanıtımdır.


1

Kararsız kayan nokta hesaplamaları nasıl belirlenir? Bu, bu soruyu araştırmak için yaygın bir teknik midir?

Hata hakkında bazı istatistikler göstermeniz gerekmedikçe, gerçekten örnek toplamanıza gerek olmadığını düşünüyorum. İhtiyacınız olan şey , Sayısal Yöntemler, Sayısal Doğrusal Cebir, vb. Konularına da giren Nümerik Analiz'dir . Ve bunlar bilgisayar biliminin bir parçasıdır, bu yüzden cs.stackexchange'te de bazı cevaplar alabilirsiniz.

Her neyse, genel programlamada, kayan noktanın nasıl çalıştığı ve temel sayısal yöntemler hakkında bazı temel anlayış göz önüne alındığında, çoğu sorunun fark edilmesi kolaydır. Ancak 128-bit float kullanılabilirliği ile bugün daha karmaşık problemleri çözmek daha kolay, hata örnekleri üretmek için daha da az neden. Demek istediğim bazı örnek problemler:

  1. parasal değerleri hesaplamak için kayan nokta kullanma.
  2. büyük sayılar için kayan nokta kullanma.
  3. mümkün olduğunda diğer işlemlerden önce bölme yapmamak. (değeri 0'a yakın yapmak için).
  4. hata yayılımı için özel işlem yapılmadan uzun hesaplama.

Ayrıca burada varyansın hesaplanması için naif algoritma ve hata dengelemeli algoritma örneği de vardır . Örnekte, saf versiyonuna baktığınızda, döngülerde hesaplama yapmanın bazı hatalar taşıyacağını ve telafi edilmediğini koklayabilirsiniz.


Cevabınız için teşekkür ederim, ancak daha ayrıntılı bilgi arıyorum. Çok büyük bir hesaplamaya sahibim ve zayıf kısımlarını tanımlamak istiyorum. Soruyu buna göre düzenledim.
user40989

Büyük bir hesaplama yaptığınızı ve zayıf kısımları tanımlamak istediğinizi söylediğinizde durumunuzun ne olduğundan tam olarak emin değilim. Sayısal hesaplamalarda doğal olarak hatalar vardır, hatta basit bir ekleme işlemi bile. Yani, büyük hesaplamanız hata telafisi olmadığı sürece, bir bütün olarak düzeltilmesi gerekir. Zayıf noktaların iyileştirilmesi yeterince iyi olmayabilir. Şimdi kayan nokta modelinizin "epsilon "uysanız, basit bir analiz, uzun hesaplamada yayıldıkça hatanın ne kadar büyük olabileceğini gösterecektir.
imel96

0

Uygun veri türlerini (örneğin, sürekli kesirler gibi) kullanarak sayısal hatalardan kaçınabilirsiniz. Kayan nokta aritmetiği gerekiyorsa veya kullanmak istiyorsanız, hataları bilmek için sayısal know-how uygulamanız gerekir.


Sayısal hatalardan kaçınmak istemiyorum, hesaplamanın hangi bölümlerinin kararsız olduğunu bulmak istiyorum. Hız için optimizasyon yaparken hız darboğazlarının yerelleştirilmesine benzer. Bu yüzden hassasiyeti optimize etmek istiyorum ve bu nedenle hassas darboğazlar bulmak istiyor. (Devam eden kesirler burada yararlı değildir.)
user40989

1
@ user40989, o zaman kesinlikle aralık aritmetikleri gerekir.
SK-logic
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.