Hitung


13

Fungsi memiliki singularitas dekat . Singularitas itu dapat diangkat, meskipun: untuk , seseorang harus memiliki , karena Dan dengan demikian Namun, bentuk tidak hanya tidak didefinisikan pada , secara numerik juga tidak stabil di sekitar titik itu; dalam rangka untuk mengevaluasi untuk sangat kecil numerik, orang bisa menggunakan ekspansi Taylor, yaitu pemotongan dari seri kekuasaan sungai tersebut.x = 0 x = 1 f ( x ) = 1 e x = k = 0 x kf:x(ex-1)/xx=0x=1f(x)=1(ex-1)/x=k=1x k - 1

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

T : Apakah fungsi memiliki nama? Dengan kata lain, apakah ini masalah umum?f

T : Apakah ada yang mengetahui pustaka C / C ++ yang menangani situasi ini dengan baik, yaitu menggunakan ekspansi Taylor dengan derajat yang sesuai dekat 0 dan representasi lainnya jauh dari nol?

Jawaban:


19

exhalm1ex-1x=0


17

Ini adalah contoh kesalahan pembatalan. Pustaka standar C (mulai C99) menyertakan fungsi yang disebut expm1yang menghindari masalah ini. Jika Anda menggunakan expm1(x) / xalih-alih (exp(x) - 1.0) / x, Anda tidak akan mengalami masalah ini (lihat grafik di bawah). <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </code>

Rincian dan solusi dari masalah khusus ini dibahas panjang lebar di Bagian 1.14.1 Akurasi dan Stabilitas Algoritma Numerik . Solusi yang sama juga dijelaskan di halaman 19 dari makalah W. Kahan berjudul Bagaimana Sia-Sia Penilaian dari Roundoff dalam Perhitungan Floating-Point? . Implementasi aktual expm1dalam pustaka GNU C berbeda dari pendekatan yang dijelaskan dalam referensi di atas dan didokumentasikan secara menyeluruh dalam kode sumber .


1
Terima kasih, itulah yang saya butuhkan! Sayangnya, saya hanya dapat menerima satu jawaban ...
anonim

Tentu saja! Tidak masalah :-)
Juan M. Bello-Rivas

3

Untuk menjawab pertanyaan pertama Anda, tidak, fungsi tidak memiliki nama (setidaknya bukan yang dikenal luas).

Seperti yang disebutkan orang lain, cara terbaik untuk menghitung fungsi ini adalah dengan merawat beberapa kasus khusus. Ini adalah bagaimana perpustakaan mana pun akan menghitung fungsi.

  1. Kasus 0: x = 0, kembali 1.
  2. |x|<δ1+x/2δdouble2e-85e-4
  3. Lain halnya: kembali expm1(x)/x.

Anda bisa menjadi lebih canggih dan khusus kasus lebih banyak hal dengan seri Taylor terpotong, tetapi mungkin tidak layak. Faktanya, tidak sepenuhnya jelas bahwa kasus 1 perlu ditangani secara terpisah, karena seperti yang ditunjukkan k20, pembatalan itu aman. Namun, menangani secara terpisah akan membuat saya merasa lebih percaya diri tentang hal itu.


2

Saya ingat pertanyaan ini telah ditanyakan sebelumnya di situs ini, dan anehnya jawabannya adalah bahwa Anda hanya perlu persamaan kasus yang tepat menjadi nol. Kesalahan dibatalkan mendekati nol. Saya tidak punya tautannya.

Ya jawaban ini sepenuhnya salah. Saya tidak yakin mengapa itu begitu banyak dipilih, mungkin karena dinyatakan begitu otoritatif. Saya menemukan tautan yang ada dalam pikiran saya. Itu di stackexchange matematika di sini , bukan di stackexchange scicomp. The expm1-gratis Formula pembatalan kesalahan diberikan dalam jawaban oleh JM dan menggunakan u = exp(x)transformasi.


xdx(edx-1)/dx(1+dx-1)/dx1

1
dx1+dx=1

0

Untuk menjawab pertanyaan pertama dan menyediakan metode (mungkin tidak efisien secara numerik) untuk pertanyaan kedua, perhatikan bahwa ini adalah kebalikan dari fungsi pembangkitan angka Bernoulli .


Itu koneksi yang menarik, terima kasih telah menunjukkannya. Sayangnya, saya percaya bahwa jumlah rangkap tiga akan membuat ini sangat mahal. Selain itu, tidak segera jelas di mana harus memotong setiap jumlah untuk mendapatkan akurasi yang diinginkan.
anonim

@anonymous: Jumlah tripple mana yang Anda maksud? Anda tidak memerlukan polinomial Bernoulli, hanya nomor Bernoulli, dan Anda dapat mendaftar terlebih dahulu. Tapi ya, itu masih tidak lebih baik dari seri Taylor.
Nikolaj-K

Anda dapat menghitungnya terlebih dahulu jika jelas bahwa Anda hanya memerlukan nomor hingga tetap untuk input apa saja.
Anonim

@anonymous: Ya, sama seperti Anda akan membuat daftar koefisien Taylor sebelumnya.
Nikolaj-K
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.