Kuartik denklemin çözümü


10

Kuartik denklemlerin çözümü için açık bir C uygulaması var mı:

ax+bx³+cx²+dx+e=0

Ferrari'nin çözümünün uygulanmasını düşünüyorum. Wikipedia'da çözümün, katsayıların olası işaret kombinasyonlarından bazıları için hesaplama kararlı olduğunu okudum. Ama belki de şanslıyım ... Bir bilgisayar cebir sistemi kullanarak analitik olarak çözüp C'ye ihraç ederek pragmatik bir çözüm buldum. Ama test edilmiş bir uygulama varsa bunu kullanmayı tercih ederim. Hızlı bir yöntem arar ve genel bir kök bulucu kullanmamayı tercih ederim.

Sadece gerçek çözümlere ihtiyacım var.


Tüm (gerçek) çözümlere aynı anda mı ihtiyacınız var? GertVdE'nin dediği gibi, kapalı bir form çözümüyle ilgili kararlılık sorunlarınız varsa, bazı kök bulma algoritmalarını kullanmamanın gerçekten iyi bir nedeni yoktur.
Godric Seer

3
Bunun Hessenberg formunda olan ve QR taramalarını uygulamak basit bir matrisin özdeğerlerini basitçe hesaplayabildiğiniz için, bunun doğrusal olmayan cebir olarak etiketlendiğini komik buluyorum.
Victor Liu

2
ACM TOMS (Algoritma 954) 'da yayınlanan kübik / çeyrek çözücülere bir göz atın . Bu dergiye giriş yapan kod genellikle çok yüksek kalitededir. Kağıdın kendisi bir ödeme duvarının arkasında, ancak kod bu bağlantıdan indirilebilir .
GoHokies

... (daha sonra düzenleme) ACM kod FORTRAN 90 ile yazılmış ama benim ilk izlenim biri olduğu olmasıdır olabilir çaba içinde koymadan C'den diyoruz.
GoHokies

1
@GoHokies Bence yorumunuzu bir cevaba dönüştürmelisiniz çünkü bu soruya iyi bir cevap olduğunu düşünüyorum. Özellikle bağlantılı kağıt olağan sayısal dengesizliklerden kaçınmayı başardığından ve bu kesinlikle önemsiz bir şey değildir.
Kirill

Yanıtlar:


20

Sayısal olarak çok kararsız olmaları nedeniyle kapalı form çözümlerinin kullanılmasına karşı şiddetle tavsiye ediyorum. Ayrımcı ve diğer parametreler hakkındaki değerlendirmelerinize ve düzeninize çok dikkat etmeniz gerekir.

Klasik örnek kuadratik denklem için olan örnektir x 1 , 2 = - b ± ax2+bx+c=0 . Kökleri hesaplamak, olan polinomlar için belaya girmenizi sağlayacaktır . payı. yı hesaplamanız gerekir . b4acx1=-(b+sign(b)

x1,2=-b±b2-4birc2bir
b»4birc
x1=-(b+sbengn(b)b2-4birc)2bir;x2=cbir1x1

Higham başyapıtında "Sayısal Algoritmaların Doğruluğu ve Kararlılığı" (2. baskı, SIAM) klasik analitik kübik çözümün çok yanlış sonuçlar verdiği kübik bir polinomun katsayılarını bulmak için doğrudan bir arama yöntemi kullanır. örnek . Bu polinom için kökler iyi ayrılmıştır ve bu nedenle problem kötü durumda değildir. Bununla birlikte, eğer analitik yaklaşımı kullanarak kökleri hesaplar ve bu köklerdeki polinomu değerlendirirse, kararlı bir standart yöntem (tamamlayıcı matris yöntemi) kullanırken kalıntısı elde eder. , artıkO ( 10 - 2 ) O ( 10 - 15 )[bir,b,c]=[1.732,1,1,2704]Ö(10-2)Ö(10-15). Algoritmada hafif bir değişiklik öneriyor, ancak o zaman bile , kesinlikle iyi olmayan tortularına yol açan bir dizi katsayı bulabilir . Bkz. Yukarıda adı geçen kitabın p480-481.Ö(10-11)

Sizin durumunuzda, Bairstow'un yöntemini uygularım . Kuadratik formlar (ve sonra kuadratik kökleri çözülür) ve deflasyon üzerinde Newton iterasyonunun yinelemeli bir kombinasyonunu kullanır. Kolayca uygulanır ve web üzerinde bazı uygulamalar bile vardır.


1
"Sayısal olarak çok kararsız olma eğiliminde oldukları için kapalı form çözümlerini kullanmaya karşı şiddetle tavsiye ediyorum" derken ne demek istediğinizi açıklar mısınız? Bu sadece 4. derece polinomlar için mi geçerli yoksa genel bir kural mı?
NoChance

@EmmadKareem Yukarıdaki cevabımı güncelledim.
GertVdE

3

Bunlara bakın:


2
x1=-1,602644912244132e+00Ö(10-8)Ö(10-7)Ö(10-15). Bunun yeterince iyi olup olmadığına bağlı olarak (bilgisayar grafikleri için, diğer bazı uygulamalar için olmayabilir)
GertVdE

1

C'deki sayısal tarifler, kuadratik ve kübik gerçek kökler için muhtemelen iyi bir hassasiyete sahip kapalı form ifadesi sağlar. Kuartiğin cebirsel çözümü bir kübik çözmeyi ve daha sonra iki kuadratiyi çözmeyi içerdiğinden, belki kapalı bir form kuartik w iyi hassasiyet söz konusu değildir.


C (press et al) kübik formüllerindeki sayısal tarifleri kullanarak kübik örneğin kökünü 2e-16 (şamandıralarımın hassasiyeti üzerinde biraz) içinde alıntıladım. Yani umut etmek için bir sebep var.
Nemocopperfield
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.