Як уникнути катастрофічного скасування функції пітона?


13

У мене виникають проблеми з числовою функцією. Він страждає від того, що при великих вхідних значеннях результат є дуже великим числом разів і дуже малим числом. Я не впевнений, що катастрофічне скасування - це правильний термін, тому, будь ласка, виправте мене, якщо воно є. Докази того, що щось відбувається не так:

введіть тут опис зображення

Як я можу уникнути коливань та призначення 0,0 для більших входів 6?

Ось моя функція:

import numpy as np

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

Відповіді:


31

т1+1-т2.
1-1-т21+1-т2 . Ось порівняння:

введіть тут опис зображення


Фантастичний! Чи можете ви порекомендувати одну із таких книг, чи були описані ці методи?
Діполь

2
@Jack "Точність та стабільність числових алгоритмів" - це хороша книга вищого рівня. Будь-який вступний підручник також обговорить це.
Кирило

Мені хотілося б знати, чи використовували ви Вольфрам Математику, щоб намалювати цей графік.THX :)
xyz

Чи знаєте ви про будь-які посилання, що збирають та / або обговорюють подібні хитрощі, щоб переписати математичні вирази математично еквівалентними способами, які зменшують втрату значущості? Я читав книгу Хіггема, але дискусія загальна, і всі пізніші розділи стосуються лінійної алгебри (що наразі не є моєю темою).
becko

@becko На моєму досвіді це досить спеціально. Це набагато простіше зробити, якщо у вас є спосіб перевірити свою формулу з правильними відповідями (навіть якщо ви просто генеруєте їх з арифметикою надточної точності), так що ви не будете шукати числову нестабільність, не маючи попереднього провалу тестових випадків. І якщо він працює для всіх відомих входів, немає реальної проблеми, чи існує ніде числова нестабільність чи ні.
Кирило
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.