C# ile dinamik Gauss-Legendre sayısal integrasyonu: düğüm ve ağırlıkları taşma olmadan anında hesaplamak
Legendre polinomlarının köklerini ve ağırlıklarını hazır tablolardan okumak yerine runtime'da hesaplayan bir C# Gauss-Legendre kareleme uygulaması. Bonnet özyinelemesi polinom değerlendirmesini 15. derecenin üzerinde de kararlı tutuyor, Newton yöntemi her kökü birkaç iterasyonda yaklaşık 1e-10 hassasiyetle buluyor.
Kilit noktalar
- Polinom değerleri Bonnet'in üç terimli özyinelemesiyle hesaplanıyor; katsayı tablosu kurulmadığı için 15. derecenin üzerinde taşma olmuyor.
- Kökler cos(π(4(n−i)−1)/(4n+2)) başlangıcından Newton yöntemiyle yaklaşık 1e-12 hassasiyete kadar iyileştiriliyor.
- Her ağırlık 2/((1−x²)·P′ₙ(x)²) ile bulunuyor; son Newton adımındaki türev yeniden kullanıldığı için ek geçiş gerekmiyor.
- Kareleme düğümleri [−1, 1] aralığından çağıranın aralığına taşıyor ve varsayılan olarak 32 nokta kullanıyor; derece runtime'da serbestçe seçilebiliyor.
- Döngü sabit iterasyon sayısı yerine ardışık değerler arasındaki farka bakıyor, böylece kök arama kısa sürüyor.
- Yazarın karşılaştırması: 16 Gauss-Legendre noktası 12 ondalık basamağı verirken Simpson yöntemi 5 basamak için 1000 noktaya ihtiyaç duyuyor.
Gauss-Legendre karelemesi, Simpson gibi sabit adımlı yöntemlere göre çok daha az fonksiyon değerlendirmesiyle yüksek doğruluk verir; ancak Legendre polinomlarının köklerine ve bu köklere karşılık gelen ağırlıklara ihtiyaç duyar. Polinom katsayılarını açık formülden hesaplamak 15. dereceden sonra taşmaya yol açtığı için yazar, polinomu Bonnet'in üç terimli özyinelemesiyle, türevini de kapalı bir formülle hesaplıyor; x = ±1 uçlarında paydanın sıfıra gitmesi ayrıca ele alınıyor.
Her kök, cos(π(4(n−i)−1)/(4n+2)) başlangıç değerinden Newton yöntemiyle bulunuyor ve birkaç iterasyonda yaklaşık 1e-10 hassasiyete ulaşıyor; ağırlık ise 2/((1−x²)·P′ₙ(x)²) formülüyle çıkıyor. Kareleme rutini düğümleri istenen aralığa taşıyor ve varsayılan olarak 32 nokta kullanıyor. Yazarın testinde 16 nokta 12 ondalık basamağı doğru verirken Simpson yöntemi 1000 noktada bile bunu yakalayamıyor.
Gerçek dünyada kullanımı
- İş, akı veya alan gibi düzgün fonksiyonları döngü içinde çok basamağa kadar integre eden bir mühendislik/fizik aracı.
- Hazır düğüm tabloları gömmek istemeyen, istenen derecede kareleme kuralına ihtiyaç duyan bir simülasyon kütüphanesi.
- Uyarlamalı bir integrator'ı yüksek dereceli Gauss-Legendre referans değeriyle karşılaştıran unit test'ler.
- Sürekli dağılımların beklenen değerini hesaplayan, polinom integrandlarda az değerlendirme isteyen bir istatistik aracı.
Neden önemli
Derecesini runtime'da seçebildiğiniz, hazır tablo gerektirmeyen yeniden kullanılabilir bir kareleme rutini elde ediyorsunuz; düzgün integrandlarda sabit adımlı yöntemlerin harcadığı değerlendirmelerin küçük bir kısmıyla makine hassasiyetine yakın sonuç alınıyor.
Benzer haberler
- C# interface'lerinde collection dönüş tipleri: interface, view ve snapshot farkıNick Cosentino (Dev Leader)2 gün önce
- C# olayları ve delegate'ler: sözleşme, abonelik ve bildirimNick Cosentino (Dev Leader)3 gün önce
- C# 15 ile kendi türünüze köşeli parantez indexer'ı ekleyinDEV Community: #csharp3 gün önce