Bagaimana cara menghindari pembatalan bencana dalam fungsi python?

13

Saya mengalami masalah dalam mengimplementasikan fungsi secara numerik. Itu menderita dari kenyataan bahwa pada nilai input besar hasilnya adalah jumlah yang sangat besar kali jumlah yang sangat kecil. Saya tidak yakin apakah pembatalan katastropik adalah istilah yang tepat, jadi mohon perbaiki jika itu benar. Bukti ada yang salah:

masukkan deskripsi gambar di sini

Bagaimana saya bisa menghindari osilasi dan tugas 0,0 untuk input yang lebih besar dari 6?

Inilah fungsi saya:

import numpy as np

def func(x):
    t = np.exp(-np.pi*x)
    return 1/t*(1-np.sqrt(1-t**2))
Dipol
sumber

Jawaban:

31

Ini memang disebut pembatalan bencana. Faktanya, kasus khusus ini sangat mudah: menulis ulang fungsi menggunakan persamaan yang setara dan stabil secara numerik Karena Anda mungkin memerlukan referensi, ini dibahas dalam sebagian besar metode numerik buku teks sehubungan dengan rumus untuk menyelesaikan persamaan kuadrat (rumus yang dalam bentuk standar secara numerik tidak stabil untuk beberapa nilai parameter). Cara untuk menghilangkan adalah dengan mengalikan dan membaginya dengan . Berikut ini perbandingannya:

t1+1-t2.
1-1-t21+1-t2

masukkan deskripsi gambar di sini

Kirill
sumber
Fantastis! Bisakah Anda merekomendasikan satu buku seperti itu jika teknik ini diuraikan?
Dipole
2
@Jack "Akurasi dan Stabilitas Algoritma Numerik" adalah buku tingkat atas yang bagus. Buku teks pengantar apa pun akan membahas hal ini juga.
Kirill
Saya ingin tahu apakah Anda menggunakan Wolfram Mathematica untuk menggambar grafik ini.THX :)
xyz
Apakah Anda tahu ada referensi yang mengumpulkan dan / atau mendiskusikan trik serupa untuk menulis ulang ekspresi matematika dengan cara yang setara secara matematis yang mengurangi hilangnya makna? Saya membaca buku oleh Higham, tetapi pembahasannya bersifat umum dan semua bab selanjutnya adalah tentang aljabar linier (yang bukan topik saya saat ini).
becko
@becko Cukup ad hoc dalam pengalaman saya. Ini jauh lebih mudah dilakukan jika Anda memiliki cara untuk menguji formula Anda dengan jawaban yang benar (bahkan jika Anda hanya menghasilkannya dengan aritmatika ekstra presisi), sehingga Anda tidak mencari ketidakstabilan numerik tanpa terlebih dahulu memiliki kasus pengujian yang gagal. Dan jika itu bekerja untuk semua input yang dikenal, tidak ada masalah nyata apakah ketidakstabilan numerik hadir di mana saja atau tidak.
Kirill