Yoğun Hastalıklı Matrislerin Köşegenleştirilmesi


10

Bazı yoğun, koşulsuz matrisleri köşegenleştirmeye çalışıyorum. Makine hassasiyetinde sonuçlar yanlıştır (negatif özdeğerleri döndürmek, özvektörlerde beklenen simetriler yoktur). Rasgele hassasiyetten yararlanmak için Mathematica'nın Eigensystem [] işlevine geçtim, ancak hesaplamalar son derece yavaş. Ben çok sayıda çözüme açığım. Koşulsuz sorunlara uygun paketler / algoritmalar var mı? Ön koşullandırma konusunda uzman değilim, bu yüzden bunun ne kadar yardımcı olabileceğinden emin değilim. Aksi takdirde, düşünebildiğim tek şey paralel hassas keyfi özdeğer çözücülerdir, ancak Mathematica, MATLAB ve C ++ 'ın ötesinde bir şey bilmiyorum.

Sorun hakkında biraz bilgi vermek için, matrisler büyüktür, ancak çok büyük değildir (en fazla 4096x4096 ila 32768x32768). Bunlar gerçek, simetriktir ve özdeğerler 0 ile 1 (münhasır) arasında sınırlıdır, birçok özdeğer 0'a çok yakın değildir ve hiçbiri 1'e yakın değildir. Matris esasen bir evrişim operatörüdür. Tüm matrislerimi köşegenleştirmem gerekmiyor, ama ne kadar büyük gidersem o kadar iyi. Birçok işlemciye ve dağıtılmış bilgi işlem özelliklerine sahip bilgi işlem kümelerine erişebiliyorum.

teşekkür ederim


2
Gerçek simetrik matrislerinizi köşegenleştirmek için hangi rutini kullanıyorsunuz? Ve bir anlamda özdeğer ayrışması yanlış mı?
Jack Poulson

Arnold'un cevabı ile ilgili bir fikir: SPD matrisinizin Cholesky ayrışmasını gerçekleştirin ve daha sonra elde ettiğiniz Cholesky üçgeninin tekil değerlerini bulun, muhtemelen doğruluğu korumak için bir dqd tipi algoritma kullanın.
JM

1
@JM: Sayısal olarak tekil pozitif belirli bir matrisin Cholesky ayrışmasının oluşturulması, olağan yöntemle sayısal olarak dengesizdir, çünkü muhtemelen negatif pivotlarla karşılaşır. (Örneğin, Matlab'ın kol (A) tipik olarak başarısız olur.) Bunların sıfıra ayarlanması ve faktörlerin karşılık gelen satırlarının imha edilmesi gerekir. Bunu yapmak, sayısal boş alanı güvenilir bir şekilde elde etmenin bir yolunu sunar.
Arnold Neumaier

@Arnold, eğer bellek hizmet veriyorsa, matrisin pozitif yarı- belirsiz (veya neredeyse) olduğu durumlarda simetrik pivot kullanan Cholesky'nin uyarlamaları vardır . Belki
bunlar

@JM: Birinin yarı-yan vakayı çözmek için dönmesine gerek yoktur; verdiğim tarif yeterli. Ben sadece standart konserve programları kullanamayacağına işaret etmek istedim ama bunları kendisi değiştirmek zorunda.
Arnold Neumaier

Yanıtlar:


7

Spektral ayrışma yerine SVD'yi hesaplayın. Matrisiniz simetrik pozitif kesin olduğu için sonuçlar kesin aritmetikte aynıdır, ancak sonlu hassas aritmetikte küçük özdeğerleri çok daha doğru bir şekilde elde edersiniz.

Düzenleme: Bkz. Demmel & Kahan, Bidiagonal Matrislerin Doğru Tekil Değerleri, SIAM J. Sci. Stat. Comput. 11 (1990), 873-912'de açıklanmaktadır.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

Edit2; Herhangi bir yöntemin, kullanılan makine doğruluğunun yaklaşık norm katından daha küçük özdeğerleri çözemeyeceğini unutmayın, çünkü bir ulp ile tek bir girişi değiştirmek zaten küçük bir öz değeri değiştirebilir. Bu nedenle, çok küçük olanların yerine sıfır özdeğerlerin elde edilmesi uygundur ve hiçbir yöntem (daha yüksek hassasiyetle çalışmak hariç) karşılık gelen özvektörleri çözemez, ancak ortak sayısal boş alan için bir temel döndürmez.


[0,BT;B,0]

2
@JackPoulson: Mesele, bidiagonal formun küçük tekil değerleri çok daha iyi belirlemesi. İlişkili simetrik tridiagonal form, diyagonal üzerinde sıfırlanmaya sahip, ancak tridiagona uygulanan QR tarafından korunmayan sıfırlar içerir.
Arnold Neumaier

1
Referans? Jacobi'nin yönteminin yüksek derecede doğru olduğu bilinmektedir (yavaş da olsa).
Jack Poulson

@JackPoulson: Deneyin ve görün. Demmel & Kahan, Bidiagonal Matrislerin Doğru Tekil Değerleri, 202.38.126.65/oldmirrors/ftp.netlib.org/lapack/lawnspdf/…
Arnold Neumaier

[0,BT;B,0]

1

Bu öneri için teşekkür ederim. Mathematica'nın SVD komutunu denedim, ancak gözle görülür bir gelişme görmüyorum (hala uygun simetrileri eksik, 'özdeğerler' daha önce yanlış negatif çıktıkları yerde yanlış sıfır). Belki de yerleşik bir fonksiyon yerine yukarıda tarif ettiğiniz algoritmalardan birini uygulamam gerekir? Muhtemelen önceden önemli bir gelişme sunacağından emin olmadıkça böyle bir yöntemi kullanma sorununa girmekten kaçınmak isterim.

@JackPoulson, Jacobi'nin referansını aldığınız yöntemin gazetesini gözden kaçırdım ve umut verici görünüyor. Siz veya kimse Jacobi'nin öz sistemleri bulma yöntemini uygulamak için iyi bir yol önerebilir mi? Kendimi (MATLAB'da) kodlarsam son derece yavaş olacağını tahmin ediyorum.


Test etmedim, ancak burada bir MATLAB uygulaması var: groups.google.com/forum/?fromgroups#!msg/sci.math.num-analysis/…
Jack Poulson

Herhangi bir yöntemin, kullanılan makine doğruluğunun yaklaşık norm katından daha küçük özdeğerleri çözemeyeceğini unutmayın, çünkü bir ulp ile tek bir girişi değiştirmek zaten küçük bir öz değeri değiştirebilir. Bu nedenle, çok küçük olanların yerine sıfır özdeğerlerin elde edilmesi uygundur ve hiçbir yöntem (daha yüksek hassasiyetle çalışmak hariç) karşılık gelen özvektörleri çözemez, ancak ortak sayısal boş alan için bir temel döndürmez. Özdeğerlere ne için ihtiyacınız var?
Arnold Neumaier

@ArnoldNeumaier: MATLAB'da özdeğerleri [0,1] aralığında olan bazı testler yaptım, bir özdeğer manuel olarak 6.3e-16 ve Octave'nin SVD rutini (bidiagonal ve QR) bu değerleri Octave'nin eig'inden çok daha doğru bir şekilde alır. Bağlı Jacobi kodu, mütevazı boyutlu matrislerde bile kullanımı çok yavaş görünüyor.
Jack Poulson

@JackPoulson: Evet. Ancak Leigh birden çok çok küçük özdeğerden şikayet ediyor gibi görünüyor ve özvektörleri nadiren tasarlananlar olacak, ancak hangi yöntem kullanılırsa kullanılsın serbestçe karışacaklar. Ve pozitif çok küçük pozitif değerler (1e-16'dan küçük) elbette sıfır bulunacaktır.
Arnold Neumaier

@ArnoldNeumaier, problemi daha da kötüleştirdiğini düşündüğüm çok küçük özdeğerler bulduğum konusunda haklı. 1e-16'dan düşük özdeğerlerin kayan noktada sıfır olacağını fark etmemiştim (geçmişe bakıldığında açıktır). Sanırım sayı saklanabilir, ancak daha büyük bir sayıya eklerken yuvarlama hatası oluşur. Özvektörler bana belirli bir sorunun çözülüp çözülemeyeceğini söylüyor. Özvektör, sorunun çözülebilir ve çözülemez parçalara ayrılmasını sağlar. Temel olarak hassasiyetle sınırlıysam, daha hızlı çözüm için herhangi bir paket önerebilir misiniz?
Leigh
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.