Jacobi yöntemiyle bir matris denklemi çözme (Revize)


11

Matematiksel Altyapı

A gerçek sayıların bir N by N matrisi, N gerçek sayıların ba vektörü ve xa vektör N bilinmeyen gerçek sayıların olsun. Bir matris denklemi Ax = b'dir.

Jacobi'nin yöntemi şöyledir: ayrıştırma A = D + R; burada D, diyagonallerin matrisidir ve R, kalan girdilerdir.

ilk tahmin çözümünü x0 yaparsanız, gelişmiş bir çözüm x1 = ters (D) * (b - Rx) olur, burada tüm çarpmalar matris-vektör çarpımı ve ters (D) matris tersidir.


Sorun özellikleri

  • Girdi : Tüm programınız girdi olarak şu verileri kabul etmelidir: A matrisi, b vektörü, bir ilk tahmin x0 ve bir 'hata' sayısı e.
  • Çıktı : Program, en son çözümün gerçek çözümden en fazla e farklı olması için minimum yineleme sayısını vermelidir. Bu, vektörlerin mutlak büyüklükteki her bir bileşeninin en fazla e kadar değiştiği anlamına gelir. Yinelemeler için Jacobi'nin yöntemini kullanmalısınız.

Verilerin nasıl girildiği sizin seçiminizdir ; bir komut satırında kendi sözdiziminiz olabilir, ne seçerseniz seçin bir dosyadan girdi alabilirsiniz.

Nasıl veriler çıkarılmaktadır olan seçim ; bir dosyaya yazılabilir, komut satırında görüntülenebilir, ASCII sanatı olarak yazılabilir, her şey, bir insan tarafından okunabildiği sürece.

Daha fazla ayrıntı

Size gerçek çözüm verilmez: gerçek çözümü nasıl hesapladığınız tamamen size bağlıdır. Örneğin Cramer kuralıyla veya doğrudan tersini hesaplayarak çözebilirsiniz. Önemli olan yinelemeleri karşılaştırabilmek için gerçek bir çözümünüz olması.

Hassasiyet bir konudur; bazı insanların karşılaştırma için 'kesin çözümleri' farklı olabilir. Bu kod golf amaçları için kesin çözüm 10 ondalık basamağa kadar doğru olmalıdır.

Kesinlikle net olmak gerekirse, mevcut yineleme çözümünüzün bir bileşeni bile gerçek çözümdeki ilgili bileşenini e ile aşarsa, yinelemeyi sürdürmeniz gerekir.

N'nin üst sınırı, kullandığınız donanımı ve programı çalıştırmak için ne kadar zaman harcamak istediğinize bağlı olarak değişir. Bu kod golf amacıyla, maksimum N = 50 olduğunu varsayın.

Ön koşullar

Programınız çağrıldığında, aşağıdakilerin her zaman geçerli olduğunu varsaymakta özgürsünüz:

  • N> 1 ve N <51, yani asla bir skaler denklem, her zaman bir matris denklemi verilmeyecektir.
  • Tüm girdiler gerçek sayılar alanı üzerindedir ve asla karmaşık olmayacaktır.
  • A matrisi her zaman yöntemin gerçek çözüme yaklaşacağı şekildedir, böylece hatayı (yukarıda tanımlandığı gibi) en aza indirmek veya her zaman e'ye eşitlemek için her zaman bir dizi yineleme bulabilirsiniz.
  • A asla sıfır matris veya kimlik matrisi değildir, yani bir çözüm vardır.

Test Durumları

A = ((9, -2), (1, 3)), b = (3,4), x0 = (1,1), e = 0.04

Gerçek çözüm (0.586, 1.138) 'dir. İlk iterasyon, gerçek çözeltiden 0.04'ten fazla, x1 = (5/9, 1), en az bir bileşen verir. Başka bir yinelemeyle, x2 = (0.555, 1.148), 0.04'ten (0.586, 1.138) farklıdır. Böylece çıktı

2

A = ((2, 3), (1, 4)), b = (2, -1), x0 = (2.7, -0.7), e = 1.0

Bu durumda gerçek çözüm (2.2, -0.8) 'dir ve ilk tahmin x0 zaten e = 1.0'dan daha az hataya sahiptir, bu nedenle 0 çıkarırız. Yani, bir yineleme yapmanız gerekmediğinde,

0

Başvuru Değerlendirmesi

Bu kod golf, burada tüm standart boşluklar izin verilmiyor. En kısa doğru tam program (veya işlev), yani en düşük bayt sayısı kazanır. Bu edilir cesaretini bir fonksiyonun içine gerekli adımları bir sürü sarmak, ancak istedikleri dili kullanma Mathematica gibi kullanım şeyler.


2
Özellikle son kapatılan yazı göz önüne alındığında, daha fazla geri bildirim almak için gerçekten beklemelisiniz. PPCG zorlukları genellikle yorucu ve belirsiz olmaktan ziyade kolay anlaşılır olmalarına katkıda bulunan spesifikasyonlardaki ortak yapıyı paylaşır. Makul seviyede yükseltilmiş bazı zorluklara bakmaya ve formatı taklit etmeye çalışın.
Uriel

@Uriel Bunu fark ettim, ancak spesifikasyonumda kapsamlı olduğumu hissediyorum ve soruların çoğuna tam olarak uymuyorken format doğrusal olarak okunabilir ve okuyucuya uygun şekilde yönlendirilebilir. Biçim ayrıca sorunun içeriğini de göz önünde bulundurmalıdır.
user1997744 15:07

3
"En kısa doğru tam program " fonksiyonlara değil yalnızca programlara izin verdiğiniz gibi duyulur. "/ Function" eklerdim.
Adam

2
+1 biçimlendirmesi beynimin bir soruya konsantre olma yeteneğini
Stephen

1
@ user1997744 Evet, mantıklı. Varsayılan, diğer işlevler veya python ithalatı gibi diğer kodlara izin verildiğini, ancak bayta dahil edildiğine inanıyorum.
Stephen

Yanıtlar:


4

APL (Dyalog) , 78 68 65 49 bayt

Tam olarak APL için yaratılan sorunun türü.

-3 Outgolfer Erik sayesinde . -11 teşekkürler ngn .

Anonim infix işlevi. A'yı sol argüman, x'i sağ argüman olarak alır. Baskılar, STDOUT sonucunu 1taksitli işaretler olarak ve ardından 0noktalama işaretleri olarak dikey tekli olarak gösterir. Hatta 0-sonucu görülebilir Bu demektir ki, bir varlık 1önce s 0.

{⎕←∨/e<|⍵-b⌹⊃A b e←⍺:⍺∇D+.×b-⍵+.×⍨A-⌹D←⌹A×=/¨⍳⍴A}

Çevrimiçi deneyin!

Okuma düzeninde açıklama

Kodun sorun belirtimine çok benzer şekilde nasıl okunduğuna dikkat edin:

{... } verilen A, B ve E, ve verilen x ile,
⎕← baskı
∨/ bu açıklamada bir gerçek olup olmadığını
e< E daha küçük
|⍵- mutlak değeri X eksi
b⌹ bir matris bölünmüş ile B
⊃A b e A, B ve birinci ve e (örneğin bir)
←⍺ sol bağımsız değişken olan
: ve bu nedenle, eğer
  ⍺∇ ilgili recurse
  D+.× D matris kez
  b- eksi b
  ⍵+.×⍨ x, matris ile çarpımı
  A- , eksi
  ⌹D D (kalan girişler) 'nin tersine
   D
   bir
  =/¨ eşit bulunmaktadır
   koordinatları
  ⍴A  şekil A'nın (yani köşegen)

Adım adım açıklama

Sağdan sola gerçek yürütme sırası:

{} Anonim işlev A'nın olduğu ve ⍵'nun x olduğu:
A b c←⍺ sola bağımsız değişkeni A, b ve e'ye böler  . X'in  geçerli değerleri ile  kabul edilebilir  mutlak değerler arasındaki b (
 ilk
b⌹x değerini verir ) ile ilk (A) matris bölümünü seçer hata daha az?  herhangi biri için doğru mu? (yanan VEYA azaltma)  Boolean'ı STDOUT'a yazdırın  ve eğer öyleyse:  her hücrenin her hücre için kendi koordinatı olduğu bu şeklin  bir matrisi  , dikey ve yatay koordinatlar eşit mi? (diyagonal)  A'nın hücrelerini  D'deki ( diyagonal ayıklar)  ters deposuyla ( D
⍵-
|
e<
∨/
⎕←
:
  ⍴A
  
  =/¨
  
  
  D← iagonal için) çarpın
    ters (normale dönerek)
  A- A
  ⍵+.×⍨ matrisinden çıkarma (nokta çarpımı ile aynı şey, dolayısıyla .x ile)  , D ile
  b- b
  D+.×matris çarpımından çıkarma ve
  ⍺∇ verilen A be ile bu fonksiyonu uygulayan ve x'in yeni değeri olarak


Çıktı, doğruluğu için gereken yineleme sayısı olmalıdır e.
Zgarb

-1: Bu bir çözüm değil. X0'a ihtiyacınız var, çünkü tüm nokta, belirli bir başlangıç ​​noktasından istenen doğruluğa ulaşmak için kaç adım gerektiğini bilmek.
user1997744 15:17

@ user1997744 Ah, sorunu yanlış anladım. Afedersiniz.
Adam

@ user1997744 Daha iyi?
Adam

1
@ user1997744 Değil aritmetik işlem, okuma sadece yetenek tekli gerçekten 0, başka bir şey değildir .
Adam

1

Python 3 , 132 bayt

f=lambda A,b,x,e:e<l.norm(x-dot(l.inv(A),b))and 1+f(A,b,dot(l.inv(d(d(A))),b-dot(A-d(d(A)),x)),e)
from numpy import*
l=linalg
d=diag

Çevrimiçi deneyin!

Özyinelemeli bir çözüm kullanır.


@ Adam tam olarak anladığımdan emin değilim. Ben fşimdi sabit olan kod bloğu içinde adı olmayan olarak yorumladı ; ancak, bu tamamen farklı bir konuysa, yine de bir sorun olabilir.
notjagan

@ Adám Bu cevap şu anda sahip olduğum şeyi destekliyor gibi görünüyor; tanımından sonra birim olarak çalışabilen yardımcı kodlu bir işlevdir.
notjagan

Ah tamam. Boş ver o zaman. Python'u tanımıyorum, bu yüzden sadece merak ettim. Aferin!
Adám

Durdurma kriteri "Bu, mutlak büyüklükteki vektörlerin her bir bileşeninin en fazla e kadar farklı olduğu anlamına mı gelir?" Temel olarak max-norm, L2-norm değil.
NikoNyrh

@NikoNyrh Düzeltildi.
notjagan

1

R , 138 bayt

function(A,x,b,e){R=A-(D=diag(diag(A)))
g=solve(A,b)
if(norm(t(x-g),"M")<e)T=0
while(norm((y=solve(D)%*%(b-R%*%x))-g,"M")>e){T=T+1;x=y}
T}

Çevrimiçi deneyin!

bir hatayı düzelttiği için NikoNyrh'e teşekkürler

Ayrıca (çözüm) ve (gerekli yineleme sayısı ) ile bir liste döndüren Rlinsolve, bir lsolve.jacobiişlev içeren bir R paketi olduğunu belirtmek gerekir, ancak doğru hesaplamaları yaptığından emin değilim.xiter


Durdurma kriteri "Bu, mutlak büyüklükteki vektörlerin her bir bileşeninin en fazla e kadar farklı olduğu anlamına mı gelir?" Temel olarak max-norm, L2-norm değil.
NikoNyrh

@NikoNyrh haklısın! Neyse ki, normişlev benim için ek bayt için de sağlar.
Giuseppe

1

Clojure, 212 198 196 bayt

#(let[E(range)I(iterate(fn[X](map(fn[r b d](/(- b(apply +(map * r X)))d))(map assoc % E(repeat 0))%2(map nth % E)))%3)](count(for[x I :while(not-every?(fn[e](<(- %4)e %4))(map -(nth I 1e9)x))]x)))

Bir matris kütüphanesi olmadan uygulandığında, doğru cevabı almak için işlemi 1e9 kez tekrarlar. Bu, çok koşulsuz girdiler üzerinde işe yaramaz, ancak uygulamada iyi çalışmalıdır.

Az ı ifadelerle oldukça mutlu oldu, golfed Rve D:) ilk girişi %(A) böylece bir vektör, bir liste olması gerekir assockullanılabilir.

(def f #(let[R(map assoc %(range)(repeat 0))
             D(map nth %(range))
             I(iterate(fn[X](map(fn[r x b d](/(- b(apply +(map * r x)))d))R(repeat X)%2 D))%3)]
          (->> I
               (take-while (fn[x](not-every?(fn[e](<(- %4)e %4))(map -(nth I 1e9)x))))
               count)))
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.