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


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+1t2.
1121+12

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


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

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

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

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

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