Как избежать катастрофической отмены в функции 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 По моему опыту, это довольно специально. Это гораздо проще сделать, если у вас есть способ проверить формулу с правильными ответами (даже если вы просто сгенерируете их с арифметикой сверхточности), чтобы вы не искали числовую нестабильность, не проверив сначала неудачные тестовые примеры. И если он работает для всех известных входных данных, нет реальной проблемы, присутствует ли числовая нестабильность где-либо или нет.
Кирилл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.