2016-08-17 3 views
1

Matlab의 erf/erfc 함수의 정확성에 문제가 있습니다.matlab에서 erf/erfc 함수의 문제점

우리가 알고 있듯이, x이 무한대이면 erf(x)은 1과 같습니다.

그러나 Matlab에서 나는 erf(6)이 이미 1과 같고 6도 상당하지 않다는 사실에 놀랐습니다!

erfc(x)은 이 0이 아닌 반면에 erfc(28)은 0입니다.

이 함수의 수치 적 성능을 향상시킬 방법이 있습니까? 즉, 정확히 1이 아닌 값을 얻으려면 erf(x)의 값 범위를 늘리십시오. (erfc의 경우 0)

+1

몇 자릿수의 정밀도가 필요합니까? erf가 15 자리를 제공하면 erfc는 'e-300'으로 내려갑니다. 그보다 정밀도가 필요한 경우 아마도이 함수를 잘못 사용했을 것입니다. – Trogdor

+0

인수의 큰 값에 대해 이러한 정확도를 요구하는 이유가 있습니까? –

답변

1

귀하의 거래가 double precision floating point 인 경우. erfc은 값이 0보다 1에 가까워지기 때문에 다르게 수행됩니다. 실제로 더 정밀도가 필요하면 다른 숫자 시스템으로 값을 나타내야합니다 (그 이유는 분명하지 않습니다). Symbolic Math 도구 상자가있는 경우 variable precision arithmetic을 사용해보십시오. 시도하십시오

erf(vpa(6)) 

이 기호 값 0.99999999999999997848026328750109을 반환합니다. 인수가 커질수록 digits을 사용해야합니다. 물론 결과를 double으로 부동 소수점으로 다시 변환하면 모든 추가 정밀도를 잃게됩니다.

+0

불행히도 최적화를 위해 erf/erfc의 출력을 사용해야합니다. 사실 erfc의 로그를 가져와야합니다. erfc 값이 0이면 최적화 알고리즘이 실행되지 않습니다. – user1237300

+2

@ user1237300이 경우 지수 적으로 스케일 된 상보 오류 함수'erfcx'를 볼 수 있습니다. – njuffa

+0

@njuffa 맞습니다. 'log (erfc (x))'를 구현하려면'x = 30;''log (erfcx (x)) - x.^2'을 시도하십시오. 'double (log (erfc (vpa (30))))'로 결과를 검증 할 수있다. – horchler