Sayısal türev ve sonlu fark katsayıları: Fornberg yönteminde herhangi bir güncelleme var mı?


11

Sayısal türevleri hesaplamak istendiğinde, Bengt Fornberg tarafından burada (ve burada rapor edilir ) sunulan yöntem çok uygundur (hem kesin hem de uygulanması basittir). 1988'deki orijinal bildiri tarihi olarak, bugün daha iyi bir alternatif olup olmadığını bilmek istiyorum (ya da neredeyse basit ve daha kesin)?


1
Neyi farklılaştırmak istediğinizi bilmeden söylemek zor. Otomatik farklılaşmayı düşündünüz mü ?
Biswajit Banerjee

@BiswajitBanerjee: Sonlu fark katsayıları için otomatik farklılaşma geçerli değildir.
Geoff Oxberry

@GeoffOxberry: Asıl fiziksel problemden, yani "hesaplama bilimi" nin bilim kısmından bahsediyordum.
Biswajit Banerjee

@Vincent: Bir işlevi veya tabloyu ayırt etmeye mi çalışıyorsunuz? Tablo verileri varsa, tablo verileri gürültülü mü? Bir PDE'yi takdir etmeye mi çalışıyorsunuz?
user14717

Yanıtlar:


9

genel bakış

İyi soru. R. Baltensperger tarafından "Keyfi kollokasyon noktaları için matris farklılaştırma yönteminin doğruluğunun artırılması" başlıklı bir makale bulunmaktadır. Bu Bence önemli değil, ama (zaten 2000 yılında ortaya çıkmasından önce bilindiğini) bir noktası vardır: sabit fonksiyon türevi olduğunu aslında doğru bir temsilinin önemini vurgulamaktadır should sıfır olması (tam olarak matematiksel anlamda geçerlidir, ancak sayısal gösterimde olması gerekmez).f(x)=1

Bunun n. Türev türev matrislerinin satır toplamlarının sıfır olmasını gerektirdiğini görmek kolaydır . Bu kısıtlamayı çapraz girişi ayarlayarak, yaniKayan nokta hesaplamalarındaki yuvarlama hataları nedeniyle bir bilgisayarda çalışırken bu özelliğin tam olarak geçerli olmadığı açıktır. Daha şaşırtıcı olan, türev matris için analitik formüller kullanıldığında (örneğin birçok klasik kollokasyon noktası, örneğin Gauss-Lobatto için kullanılabilir) bu hataların daha da şiddetli olmasıdır.D(n)

(1)Djj(n):=i=1ijNDij.

Şimdi, makale (ve içindeki referanslar), türevin hatasının satır toplamlarının sapma sıfıra göre olduğunu belirtir. Bu nedenle amaç, bunları mümkün olduğunca sayısal hale getirmektir.

Sayısal testler

İyi nokta şu ki Fornberg prosedürü bu açıdan oldukça iyi görünüyor. Aşağıdaki resimde, değişken Chebyshev-Lobatto kollokasyon noktalarının kesin, yani analitik, ilk türev matrisinin ve Fornberg algoritması tarafından türetilmiş olanın davranışını karşılaştırdım.

Yine, alıntılanan makaledeki ifadeye inanarak, Fornberg algoritmasının türev için daha doğru sonuçlar vereceği anlamına gelir.

Bunu kanıtlamak için, kağıttaki ile aynı işlevi kullanacağım, veBu, (i) analitik olarak elde edilen türev matrisi, (ii) Fornberg türev matrisi ve (iii) Fornberg matrisinin düzeltilmiş bir versiyonudur; (1) aracılığıyla oldukça basit bir şekilde uygulanırİşte ne olsun (yine Gauss-Lobatto abscissas örneği için):

(2)f(x)=11+x2.
(3)En=maxi{0,,n}|f(xi)j=1nDijf(xj)|.
(4)D~jj=Djj(i=1nDji),for all j.

Sonuç

Sonuç olarak, Fornberg'in yöntemi oldukça doğru görünmektedir, olması durumunda bile, analitik formüllerden elde edilen sonuçlardan yaklaşık 3 kat daha büyüklükte daha doğrudur. Bu, çoğu uygulama için yeterince doğru olmalıdır. Dahası, bu dikkate değerdir, çünkü Fornberg bu gerçeği yöntemine açıkça dahil etmemektedir (en azından iki Fornberg gazetesinde hiç söz yoktur).N=512

Bu örnek için, Denklem (4) 'ün doğrudan dahil edilmesiyle başka bir büyüklük derecesi elde edilebilir. Bu oldukça basit bir yaklaşım olduğundan ve her bir türev için sadece bir kez uygulandığından, onu kullanmamanın bir sebebi görmüyorum.

Baltensperger kağıdından - denklem (1) 'deki toplamı, yuvarlama hatalarını azaltmak için değerlendirmek için daha sofistike bir yaklaşım kullanan yöntem, hata için yaklaşık aynı büyüklük derecesini verir. Yani, en azından bu örnek için, kabaca yukarıdaki "Düzeltilmiş Fornberg" yöntemine eşdeğerdir.


4

Sürekli bir işlevin sayısal bir uygulamasını ayırt etmeye çalıştığınızı varsayarsak, çok sayıda yöntem vardır:

1) Otomatik farklılaşma. En doğru ve genel yöntem. Kodlama acılıdır, operatörün aşırı yüklenmesi ve argümana bağlı arama gerektirir. Bu kavramları anlaması için kullanıcıya yük bindirir. Ayrıca içtenliği ayırt etmek gibi çıkarılabilir tekilliklerle mücadele eder .x=0

2) Bir Chebyshev dönüşümü. İşlevinizi bir Chebyshev polinomları aralığına yansıtın ve üç dönem tekrarını ayırt edin. Süper hızlı, çok doğru. Ancak, kompakt olarak desteklenen bir ilgi alanınıza sahip olmanızı gerektirir; seçilen alan adının dışında, üç terim yinelenmesi kararsızdır.[a,b]

3) Sonlu farklar. 1D'de küçültülmüş; bkz. Nick Higham'ın Sayısal Hesaplamadaki İpuçları ve Püf Noktaları . Fikir, kesme hatasını ve yuvarlama hatasını dengelerseniz, bir adım boyutu seçmeniz gerekmez; otomatik olarak seçilebilir. Boost'da bu fikir, tür için doğru basamakların 6 / 7'sini kurtarmak için (varsayılan olarak) kullanılır. (Higham sadece doğru rakamların 1/2 daha basit durumu için fikri gösterir, ancak fikir kolayca genişletilebilir.) Katsayılar Fornberg'in eşdeğerli tablosundan, ancak adım boyutu, işlevin 1ULP olarak değerlendirilebileceği varsayımı altında seçilir. doğruluk. Dezavantajı, tipteki rakamların yarısını kurtarmak için 2 fonksiyon değerlendirmesi, rakamları 3/4 rakamını kurtarmak için 4 gerektirir. 1D'de kötü bir anlaşma değil. Daha yüksek boyutlarda, felaket.

4) Karmaşık adım türevi. Kullanım . Birim yuvarlanması için alın ve bu hemen hemen her biti düzeltir. Bununla birlikte, biraz hile, çünkü karmaşık düzlemde bir işlevi uygulamak, gerçek türevini elle kodlamaktan daha zordur. Hala harika bir fikir ve bazı durumlarda yararlı.f(x)(f(x+ih))h


1

Fornberg'in algoritmasını geliştiren kimsenin farkında değilim (biraz daha yeni makalesine de bakınız ). Bir kenara, bana göre, algoritmasına sayısal türevleri hesaplamanın bir yolu olarak bakmak doğru değil. Tek yaptığı sonlu fark yöntemleri için ağırlıkları hesaplamak için etkili bir algoritma türetmek . Yönteminin avantajı, bir seferde istenen türeve kadar tüm türevler için ağırlık vermesidir.


"Algoritmasına sayısal türevleri hesaplamanın bir yolu olarak bakmak doğru değil" ifadesine katılmıyorum. ağırlıkları noktası için değerlendirildikten sonra , üzerinden herhangi bir fonksiyonunun sayısal türevini doğrudan hesaplayabilirsiniz . z f ( x ) f ( z ) = i w i f ( x i )wizf(x)f(z)=iwif(xi)
davidhigh

@davidhigh: Fornberg'in gazetelerini okursanız, onlar sonlu fark yaklaşımları için ağırlıkların hesaplanması hakkında konuşurlar, yaklaşımların hesaplanması hakkında değil. Tabii ki türevleri hesaplamak için algoritmayı da kullanabilirsiniz, ancak ağırlıkları hesaplamak, saklamak ve daha sonra yaklaşık türevleri hesaplamak için bunları tekrar tekrar kullanmak daha mantıklıdır. Aksi takdirde, ihtiyaç olmadığında ağırlıkları tekrar tekrar hesaplarsınız.
Brian Zatapatique

1

Daha basit bir şema

Fornberg yönteminin bir uzantısıyla ilgili diğer cevabımın yanı sıra , burada daha basit alternatifler için soruya değineceğim.

Bunun için Lagrangian enterpolasyonunun türev katsayılarını daha doğrudan üreten alternatif bir şema çiziyorum. Uygulanması sadece birkaç satır kod gerektirir, keyfi ızgaralar için çalışır ve ilk deneylerime göre Fornberg'inki kadar doğrudur.

Uygulama temeli hayali adımlı türevidir makine hassasiyeti sırasıyla bir değişkendir. Hayali-adım türevinin kararlı bir şekilde türev değerleri ürettiği bilinmektedir ve ile bir Sonlu farklar uygulamasının sayısal dengesizliğine maruz kalmamaktadır .

f(x) = 1hIm(f(x+ih)),
hh0

İkinci bileşen, ızgarasındaki Lagrange enterpolasyon polinomu , barycentric formlardan biriyle değerlendirildi, örn. burada Karmaşık adım türevini kullanmak için, bu formüllerin karmaşık için de çalıştığından emin olunmalıdır argümanlar . Ayrıca, belirli bir f (x) fonksiyonu ve katsayılarının vektörü için, enterpolasyon polinomunu ile Li(x){x1,,xN}

Li(z) = {1if z=xi μizxkkμkzxkotherwise.
μi=1ki(xixk)zfi=f(xi)(x1,fi)
P(x;f)=i=1NfiLi(x).


Algoritma

Algoritma aşağıda gösterilmiştir. Fornberg ile aynı giriş ve çıkış parametrelerine sahiptir, ancak daha çok beyinsizdir.

Giriş:

  • x : N farklı ızgara noktalı bir ızgara
  • ord : türev siparişi
  • z: Türevin değerlendirileceği bir nokta
  • Olası: noktalarındaki fonksiyonu veya funciton değerleri f_i (yalnızca çıkış değişkeni 2 için gereklidir)f(x)fi

Başlatma

  • Barentrik interpolasyon yoluyla Lagrange polinomları başlatın .L
  • için -matris dizisini başlatN×ND(o)o=0,,ord
  • Takım örneğin, boyut, birim matrisineD(0):=INN×N
  • Seto:=0

Algoritma

İken :o<ord

  • Hesaplama kompleksi adımlı türevinin için tüm ve . Burada, belirtmektedir arasında inci satır .Dik(o+1)=CSD(P(xk;Di(o)))CSDik
    Di(o)iD(o)

  • Set o = o + 1;

Ne karar verin Çıktı :

  1. noktasında Sonlu Fark katsayılarının vektörü , burada . Fornberg'in yaptığı budur.d(ord)zdi=P(z;Di(ord))

  2. İnterpolasyon fonksiyonu için türev sipariş . Bunun için, bir işlev girmeniz gerekir. fonksiyon değerleri de algoritmasına.p(ord)(x)=i=1Nf(xi)P(x;Di(ord))f(ord)(x)ordfixi

  3. Varyant 2'nin enterpolasyon işlevini döndüren, ancak ızgara noktalarında enterpolasyon yapılacak keyfi bir fonksiyonu için bir meta işlev .diff(int ord,function g)g

Şahsen, 3. varyantı en çok seviyorum.


Algoritmanın analizi

Fornberg gibi, bu algoritma . Zamanı bulursam doğruluk, istikrar vb. İle ilgili daha ampirik sonuçlar vereceğim.O(ordN2)


0

Sayısal farklılaşmanın hassasiyetini artırmak için aşağıdakileri yapın:

1) Bazı adım boyutlarına göre en sevdiğiniz yüksek hassasiyetli "standart" yöntemi seçin h .

2) Türev değerini 1) 'de seçilen yöntemle farklı ama makul adım boyutları h ile birçok kez hesaplayın . Her seferinde h'yi , kullandığınız yöntem için uygun bir adım boyutu olduğu aralıktan (0.5 * H / 10, 1.5 * H / 10) rastgele bir sayı olarak seçebilirsiniz .

3) Sonuçların ortalaması.

Sonuç, mutlak hata wrt'sinde 2-3 büyüklük derecesi kazanabilir. ortalamasız sonuç.

https://arxiv.org/abs/1706.10219


3
SciComp.SE'ye hoş geldiniz! Yöntemi kısaca özetlerseniz, bu cevap daha da iyi olacaktır.
Christian Clason

2
Ayrıca kullanıcı adınız bu makaleyi yazmanızı önerir. Lütfen kendi tanıtımınızla ilgili yönergelerimizi okuyun ve gönderinizi buna göre düzenleyin .
Wrzlprmft

Dürüst olmak gerekirse, cevabım gerçekten geçerli bir cevaba işaret ediyorsa, olumsuz oylamanın adil olmadığını düşünüyorum.
F.Jatpil

1
Beni de ... öyleyse benim +1 ... :-) al
davidhigh
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.