Как избежать катастрофической отмены в функции Python?

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

T1+1-T2,
1-1-T21+1-T2

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

Кирилл
источник
Фантастический! Можете ли вы порекомендовать одну из таких книг, где изложены эти методы?
Диполь
2
@Джек "Точность и стабильность численных алгоритмов" - хорошая книга верхнего уровня. Любой вводный учебник будет обсуждать это также.
Кирилл
Я хотел бы знать, использовали ли вы Wolfram Mathematica для рисования этого графика. THX :)
xyz
Знаете ли вы о каких-либо ссылках, собирающих и / или обсуждающих подобные трюки для переписывания математических выражений математически эквивалентными способами, которые уменьшают потерю значимости? Я прочитал книгу Хайама, но обсуждение носит общий характер, и все последующие главы посвящены линейной алгебре (которая сейчас не является моей темой).
Бекко
@becko По моему опыту, это довольно специально. Это гораздо проще сделать, если у вас есть способ проверить формулу с правильными ответами (даже если вы просто сгенерируете их с арифметикой сверхточности), чтобы вы не искали числовую нестабильность, не проверив сначала неудачные тестовые примеры. И если он работает для всех известных входных данных, нет реальной проблемы, присутствует ли числовая нестабильность где-либо или нет.
Кирилл