yakınında hesapla


13

işlevinin yakınında tekilliği vardır . Gerçi tekillik, kaldırılabilir: için , bir olması gereken , çünkü ve böylece Ancak, formu yalnızca tanımlanmamıştır , bu noktanın yakınında sayısal olarak kararsızdır; çok küçük sayısal olarak değerlendirmek için , Taylor büyümesi, yani yukarıda bahsedilen kuvvet serisinin bir kesilmesi kullanılabilir.f:x(ex1)/xx=0x=1f(x)=1

ex=k=0xkk!
(ex-1)/xx=0f(x)x
(ex1)/x=k=1xk1k!
(ex1)/xx=0f(x)x

S : işlevinin bir adı var mı? Başka bir deyişle, bu yaygın bir sorun mu?f

S : Herkes bu durumu iyi işleyen bir C / C ++ kütüphanesinin farkında mı, yani 0'a yakın uygun bir derecedeki Taylor genişlemesini ve sıfırdan uzak diğer temsili kullanıyor mu?

Yanıtlar:


19

Muhtemelen , C99 standardının bir parçası olan ve yakınında doğru bir şekilde hesaplayan işlevi ile başlayabilir .e x - 1 x = 0expm1ex1x=0


17

Bu bir iptal hatasının örneğidir. C standart kitaplığı (C99'dan itibaren) expm1bu sorunu önleyen bir işlev içerir . expm1(x) / xBunun yerine kullanırsanız (exp(x) - 1.0) / x, bu sorunla karşılaşmazsınız (aşağıdaki grafiğe bakın). <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </code>

Bu özel sorunun ayrıntıları ve çözümü , Sayısal Algoritmaların Doğruluğu ve Kararlılığı Bölüm 1.14.1'de ayrıntılı olarak ele alınmıştır . Aynı çözüm W. Kahan'ın Kayan Noktalı Hesaplamada Akılsızca Yuvarlanma Değerlendirmeleri Ne Kadar Duyarlı? . expm1GNU C kütüphanesindeki gerçek uygulama, yukarıdaki referanslarda açıklanan yaklaşımdan farklıdır ve kaynak kodunda ayrıntılı olarak belgelenmiştir .


1
Teşekkür ederim, tam da ihtiyacım olan şey bu! Ne yazık ki, sadece bir cevabı kabul edebilirim ...
anonim

Elbette! Sorun değil :-)
Juan M. Bello-Rivas

3

İlk sorunuzu cevaplamak için, hayır, işlevin bir adı yoktur (en azından yaygın olarak bilinen bir ad).

Diğerlerinin de belirttiği gibi, işlevi hesaplamanın en iyi yolu birkaç özel vakayı tedavi etmektir. Herhangi bir kütüphane işlevi bu şekilde hesaplar.

  1. Durum 0: x = 0, dönüş 1.
  2. Durum 1:|x|<δ1+x/2δdouble2e-85e-4
  3. Başka bir durum: dönüş expm1(x)/x.

Kesik Taylor serisi ile daha sofistike ve özel bir durum olabilir, ama muhtemelen buna değmez. Aslında, k20'nin işaret ettiği gibi, iptal güvenli olduğundan, durum 1'in ayrı olarak ele alınması gerektiği tamamen açık değildir. Bununla birlikte, ayrı ayrı ele almak, kendime daha fazla güvenmemi sağlayacaktır.


2

Bu sorunun daha önce bu sitede sorulduğunu hatırlıyorum ve şaşırtıcı bir şekilde cevap, sadece özel eşitliği sıfıra eşitlemeniz gerektiğidir. Hatalar sıfıra yakın iptal edilir. Bağlantım yok.

Evet, bu cevap tamamen yanlıştı. Muhtemelen bu kadar yetkili olduğu için neden bu kadar çok oy kullanıldığından emin değilim. Aklımdaki bağlantıyı buldum. Bu matematik Stack Exchange oldu burada değil scicomp Stack Exchange üzerinde. expm1İçermeyen bir hata iptal formül tarafından JM cevap verilen ve kullanır u = exp(x)dönüşümü.


xdx(edx1)/dx(1+dx1)/dx1

1
dx1+dx=1

0

İlk soruyu cevaplamak ve ikincisine (muhtemelen sayısal olarak verimsiz) bir yöntem sunmak için , bunun Bernoulli sayılarının üretme işlevinin tersi olduğuna dikkat edin .


Bu ilginç bir bağlantı, belirttiğiniz için teşekkürler. Ne yazık ki, üçlü toplamın bunu oldukça pahalı hale getireceğine inanıyorum. Ayrıca, istenen doğruluğu elde etmek için her bir toplamın nerede kesileceği hemen net değildir.
anonim

@anonymous: Hangi tripple toplamını kastediyorsunuz? Bernoulli polinomlarına, sadece Bernoulli numaralarına ihtiyacınız yoktur ve bunları önceden listeleyebilirsiniz. Ama evet, hala Taylor serisinden daha iyi değil.
Nikolaj-K

Bununla birlikte, yalnızca herhangi bir girdi için yalnızca sabit bir sonlu sayıya ihtiyacınız olduğu açıksa bunları önceden hesaplayabilirsiniz.
anonim

@anonymous: Evet, tıpkı Taylor katsayılarını önceden listelediğiniz gibi.
Nikolaj-K
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.