Matris Pozitif-Tanımlı mı?


19

Giriş

Bugün birinci sınıf lineer cebir öğrencilerinin bane ile ilgileneceğiz: matris kesinliği! Görünüşe göre bunun henüz bir zorluğu yok, işte başlıyoruz:

Giriş

  • Herhangi bir uygun formatta bir n×n simetrik Matris A (tabii ki matrisin sadece üst veya alt kısmını da alabilirsiniz)
  • İsteğe bağlı olarak: n matrisinin boyutun

Ne yapalım?

Zorluk basit: Gerçek değerli bir matris n×n Matris verildiğinde, doğruysa bir doğruluk değeri ve eğer değilse bir falsey değeri çıkararak pozitif kesin olup olmadığına karar verin.

Yerleşik araçlarınızın tam olarak doğru çalıştığını varsayabilirsiniz ve bu nedenle "kanıt" stratejisinin doğru sonuç vermesi durumunda yanlış davranışa yol açabilecek sayısal sorunları hesaba katmak zorunda kalmazsınız.

Kim kazanır?

Bu , yani bayt (dil başına) en kısa kod kazanır!


Zaten pozitif olarak tanımlanmış bir Matris nedir?

Görünüşe göre simetrik bir matrisin pozitif-kesin olduğu zaman 6 eşdeğer formülasyon vardır. Üç kolay olanı yeniden üreteceğim ve daha karmaşık olanlar için sizi Wikipedia'ya yönlendireceğim .

  • Eğer vRn{0}:vTAv>0 sonra A pozitif kesin.
    Bu, aşağıdaki gibi yeniden formüle edilebilir:
    Eğer sıfır olmayan her v vektörü için v ve Av (standart) nokta ürünü pozitifse , A pozitiftir.
  • İzin ver λii{1,,n} olmaközdeğerlerveA ise, şimdii{1,,n}:λi>0 (bütün özdeğerler pozitif olan) daha sonraA pozitif kesin.
    Özdeğerlerin ne olduğunu bilmiyorsanız, en sevdiğiniz arama motorunu kullanmanızı öneririm, çünkü açıklama (ve gerekli hesaplama stratejileri) bu yayında yer almak için çok uzun.
  • Eğer Cholesky-Ayrışma bir A var, yani bir alt üçgen matris vardır L öyle ki LLT=A daha sonra A pozitif kesin. Herhangi bir noktada algoritma sırasında kök hesaplaması negatif bir argüman nedeniyle başarısız olursa, bu, erken dönen "false" ile eşdeğerdir.

Örnekler

Doğru çıktı için

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

Falsey çıkışı için

(en az bir özdeğer 0 / pozitif yarı tanımlıdır)

(322240202)

(özdeğerlerin farklı işaretleri / belirsizliği vardır)

(100010001)

(0'dan küçük tüm özdeğerler / negatif belirli)

(100010001)

(0'dan küçük tüm özdeğerler / negatif belirli)

(230350001)

(0'dan küçük tüm özdeğerler / negatif belirli)

(7.152.452.459.37)

(üç pozitif, bir negatif özdeğer / belirsiz)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



Hepimiz matematiksel gösterimi okuyabileceğimizi (ya da bir "özdeğer" in ne olduğunu bildiğimizi) varsaymak yerine, ne aradığımızı daha iyi tanımlamanız gerekir. İşlenmiş bir örnek de faydalı olacaktır.
Shaggy

9
@Shaggy Bence arka planı tıkanmak için arka plan olmadan daha iyi olduğunu düşünüyorum. Başka bir yerde bir öz değerin ne olduğuna dair mevcut birçok açıklama var ve bu yazı zaten gerçekten büyük.
Buğday Büyücüsü

1
Girdiyi simetrik matrislerle kısıtlamasaydınız zorluk daha güzel olurdu .
polfosol ఠ_ఠ

1
Sadece özdeğerlerin işaretini kontrol etmek de sıkıcıydı. Bildiğim farklı tatlar;)
polfosol ఠ_ఠ 24:18

Yanıtlar:


11

C, 108 bayt

Logern sayesinde -1 bayt Tavan kedisi
sayesinde -3 bayt

f(M,n,i)double**M;{for(i=n*n;i--;)M[i/n][i%n]-=M[n][i%n]*M[i/n][n]/M[n][n];return M[n][n]>0&(!n||f(M,n-1));}

Çevrimiçi deneyin!

Gauss eliminasyonunu gerçekleştirir ve tüm diyagonal elemanların pozitif olup olmadığını kontrol eder (Sylvester'in kriteri). Bağımsız değişken n, matrisin eksi bir boyutudur.


Belki de çift yerine float ile bir karakter kaydedebilir misiniz?
Jens


i=0For döngüsüne girerseniz , özyinelemeli çağrıyı f(M,n-1,0)ve ilk çağrıyı üçüncü argüman olarak 0 ile yaparsanız başka bir karakteri tıraş edebilirsiniz .
Jens

@Jens 1. Çiftler yerine şamandıralar kullanmak hızlı bir şekilde fark edilir yuvarlama hatalarına yol açabilir, bu yüzden kaydedilen bir baytın buna değer olduğunu düşünmüyorum. 2. Bir değişkeni ek bir argümanla başlatmak bana hile yapmak gibi görünür.
nwellnhof

@ Logosu C cevaplarımda "geri dönme ifadesini atla" numarasını kullanmayı reddediyorum. Ama kurtarılan diğer bayt için teşekkürler.
nwellnhof

9

MATLAB / Oktav , 19 17 12 bayt

@(A)eig(A)>0

Çevrimiçi deneyin!

Eig işlevi özdeğerleri artan düzende sağlar, bu nedenle ilk özdeğer sıfırdan büyükse, diğerleri özendir.


f=Başlangıçta bırakabilirsiniz - anonim işlevler genellikle yanıt olarak kabul edilir.
Delfad0r

Bahşiş için teşekkürler!
Daniel Turizo

Bu bir vektör olsa bile? İlginç
Daniel Turizo

1
+1. Çevrimiçi denemek için bir bağlantı ekledim. Umursamıyorsun umarım. Dizilere rağmen çıkış değerlerinin, yayınlanan @ Delfad0r bağlantısına göre doğru "gerçek" veya "falsey" değerler olarak sayıldığını da kanıtladığını unutmayın.
Tom Carpenter

2
Bunu söyledikten sonra, TIO'daki ilk "falsey" test durumu için başarısız oluyor. Hassas bir sorun nedeniyle tahmin ediyorum - Eigen değerlerinden biri 8.9219e-170 yerine çıktı.
Tom Carpenter

7

Jöle , 11 10 bayt

ṖṖ€$ƬÆḊṂ>0

Sylvester'in ölçütünü kullanır .

Çevrimiçi deneyin!

Nasıl çalışır

ṖṖ€$ƬÆḊṂ>0  Main link. Argument: M (matrix)

   $Ƭ       Do the following until a fixed point is encountered.
Ṗ             Pop; remove the last row of the matrix.
 Ṗ€           Pop each; remove the last entry of each row.
     ÆḊ     Take the determinants of the resulting minors.
       Ṃ    Take the minimum.
        >0  Test if the least determinant is positive, i.e., if all determinants are.


6

Haskell , 56 bayt

f((x:y):z)=x>0&&f[zipWith(-)v$map(u/x*)y|u:v<-z]
f[]=1>0

Çevrimiçi deneyin!

Temelde nwellnhof'un cevabının bir limanı . Gauss yok etme işlemini gerçekleştirir ve ana diyagonaldeki öğelerin pozitif olup olmadığını kontrol eder.

Yuvarlama hataları nedeniyle ilk falsey çıktısında başarısız olur, ancak teorik olarak sonsuz hassasiyetle çalışır. Sayesinde Curtis Bechtel'in önerisi , şimdi çıkışlar hepsi doğru.


2
inputs :: [[[Rational]]]doğru cevapları almak için ekleyebilirsiniz
Curtis Bechtel

4

Wolfram Dili (Mathematica) , 20 bayt

0<Min@Eigenvalues@#&

Çevrimiçi deneyin!


4. test durumu yanlış mı olmalı?
tsh

@tsh Sabit, aptalım!
Bay Xcoder

8
Mathematica'nın bunun için nasıl yerleşik olduğu komik , ancak adı çözümünüzden daha uzun.
Federico Poloni

@FedericoPoloni: NullSpace veya MatrixRank kullanan bir çözüm daha kısa olmaz mı? Boş alan sıfırsa, matris pozitif tanımlıdır.
Phil H

@PhilH Hayır, korkarım ki bu kendi başına çalışmaz. Örneğin, ikinci falsey örneği ((1, -1,1) ile diyagonal matris) rütbe 3'e sahiptir, ancak pozitif kesin değildir.
Federico Poloni




2

MATL , 6 bayt

Daha az bayt kullanarak bunu yapmak mümkündür, @Mr. Xcoder 5 bayt MATL cevabı bulmayı başardı !

YvX<0>

açıklama

Yv     compute eigenvalues
  X<   take the minimum
    0> check whether it is greather than zero

Çevrimiçi deneyin!


İlk yanlış test durumunda başarısız olur . Silinen cevabımı görün .
Bay Xcoder

1
@ Mr.Xcoder Oh, benden önce bir cevap bile gönderdin. Sadece yuvarlama sorunlarına bağlı olduğu için cevabınızı silmeniz gerektiğini düşünüyorum. (Sanırım cevapların sınırlı hassasiyetli aritmetik kullanmalarını bekleyebilirsiniz - Bence sadece buradaki CAS dilleri tam hesaplamaları kullanıyor.)
flawr

Tavsiyenizi takiben, geri aldım .
Bay Xcoder

1

Akçaağaç , 33 bayt

(yani 2 sentim)

with(LinearAlgebra):
IsDefinite(A)

Merhaba ve PPCG'ye hoş geldiniz; Maple'ı bilmiyorum, ancak yeni satır gerekli mi?
Jonathan Frech

@JonathanFrech Merhaba ve teşekkürler. Hayır değil. Ben saymadım btw.
polfosol ఠ_ఠ

Bana göre mevcut bayt sayınız satırsonu karakterini yansıtıyor gibi görünüyor.
Jonathan Frech


1
...Ey ... ţimdi kodun ve bayt sayýsýna katılmýyor.
Jonathan Frech

0

JavaScript (ES6),  99 95  88 bayt

01

f=(m,n=0,R=m[n])=>R?f(m,n+1)&R[m.map((r,y)=>y<n&&R.map((v,x)=>r[x]-=v*r[n]/R[n])),n]>0:1

Çevrimiçi deneyin!

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.