파이썬 함수에서 치명적인 취소를 피하는 방법은 무엇입니까?


13

함수를 숫자로 구현하는 데 문제가 있습니다. 큰 입력 값에서 결과는 매우 많은 수의 매우 작은 수라는 사실로 인해 어려움을 겪습니다. 치명적인 취소가 올바른 용어인지 확실하지 않으므로 수정하십시오. 무언가 잘못되었다는 증거 :

여기에 이미지 설명을 입력하십시오

6의 더 큰 입력에 대해 진동과 0.0의 어설 션을 어떻게 피할 수 있습니까?

내 기능은 다음과 같습니다.

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−티21+1−티2

여기에 이미지 설명을 입력하십시오


환상적인! 이 책들 중 하나를 추천 할 수 있습니까?
— Dipole

2
@ 잭 "숫자 알고리즘의 정확성과 안정성"은 훌륭한 상위 수준의 책입니다. 입문 교과서에서도 이에 대해 논의 할 것입니다.
— Kirill

Wolfram Mathematica 를 사용하여이 그래프를 그리 는지 알고 싶습니다. THX :)
— xyz

유의미한 손실을 줄이는 수학적으로 동등한 방법으로 수학 표현을 다시 작성하기 위해 유사한 속임수를 수집 및 / 또는 논의하는 참조 자료를 알고 있습니까? 나는 Higham의 책을 읽었지만 토론은 일반적이며 이후의 모든 장은 선형 대수에 관한 것입니다 (현재 나의 주제는 아닙니다).
— becko

@becko 내 경험에있어서 그것은 아주 특별하다. 정확한 답으로 공식을 테스트하는 방법이 있다면 (정밀 산술로 ​​수식을 생성하더라도), 테스트 사례를 먼저 실패하지 않고 수치 적 불안정성을 찾지 않을 수 있습니다. 그리고 알려진 모든 입력에 대해 작동한다면 수치 불안정성이 어디에 있든 없든 실제 문제는 없습니다.
— Kirill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.