답변:
그것은 당신이 찾고있는 것에 정확히 달려 있습니다 . 다음은 간단한 세부 정보 및 참조입니다.
근사에 대한 많은 문헌은 함수
위한 . 제공 한 함수는 위 함수의 간단한 차이로 분해 될 수 있기 때문입니다 (상수에 의해 조정될 수 있음). 이 함수는 "정규 분포의 상단 꼬리", "올바른 정규 적분"및 "가우시안 Q 함수"를 포함하여 많은 이름으로 지칭됩니다 . 또한 근사치로 확인할 밀스 비율 이며, R ( X ) = Q ( X를 ) 여기서,φ(X)=을(2π)-1/2전자-X2/2가우시안 PDF 파일이다.
여기에 여러분이 관심을 가질만한 다양한 목적을위한 참고 문헌이 있습니다.
계산
함수 또는 관련 보완 오류 함수 를 계산하기위한 사실상의 표준은 다음과 같습니다.
WJ Cody, 오류 함수에 대한 Rational Chebyshev 근사치 , 수학. Comp. 1969, 631--637 쪽.
모든 (자기 존중) 구현은이 백서를 사용합니다. (MATLAB, R 등)
"간단한"근사치
Abramowitz와 Stegun 은 입력 변환의 다항식 확장을 기반으로합니다. 어떤 사람들은 이것을 "정밀"근사치로 사용합니다. 나는 그것이 제로 주위에서 나쁘게 행동하기 때문에 그 목적을 좋아하지 않습니다. 예를 들어, 그 근사 않는 하지 수득 Q ( 0 ) = 1 / 2 I 더 큰 노 생각하지 않는다. 때때로 이로 인해 나쁜 일 이 발생합니다.
Borjesson과 Sundberg는 간단한 근사값을 제공합니다.이 근사값은 소수 자릿수 만 필요한 대부분의 응용 프로그램에서 잘 작동합니다. 절대 상대 오차는 결코 더 단순함을 고려 꽤 좋은 1 %보다 없습니다. 기본 근사치는 Q ( X ) = 1 와 상수의 바람직한 선택은a=0.339및b=5.51입니다. 그 참조는
PO Borjesson 및 CE Sundberg. 통신 애플리케이션에 대한 에러 함수 Q (x)의 간단한 근사치 . IEEE Trans. 코뮌. , COM-27 (3) : 639-643, 1979 년 3 월.
다음은 절대 상대 오차의 도표입니다.
전기 공학 문헌은 다양한 근사치로 가득 차 있으며 지나치게 관심이있는 것으로 보입니다. 그러나 그들 중 다수는 가난하거나 매우 이상하고 복잡한 표현으로 확장됩니다.
당신은 또한 볼 수 있습니다
브라이. 올바른 정규 적분에 대한 균일 한 근사치 . 응용 수학과 계산 , 127 (2-3) : 365–374, 2002 년 4 월.
라플라스의 연속 분수
Laplace는 의 모든 값에 대해 연속 된 상한 및 하한을 산출하는 아름다운 연속 비율을 갖습니다 . 그것은 Mills '비율로
내가 사용한 표기법은 연속 분수 , 즉 대해 상당히 표준입니다 . 이 식은 작은 x에 대해 매우 빠르게 수렴되지 않으며 x = 0 에서 분기됩니다 .
이 연속 분율은 실제로 1900 년대 중반에서 후반까지 "재발견 된" 에 대한 많은 "간단한"경계를 산출 합니다. "표준"형태의 연속 분수 (즉, 양의 정수 계수로 구성됨)에 대해 홀수 (짝수) 항에서 분수를 자르면 상한 (하한)이 생성됨을 쉽게 알 수 있습니다.
따라서 Laplace는 둘 중반 1900 년대에 "재발견"한 경계입니다. Q 함수의관점에서 이것은 x 와 같습니다.
CI. C. 리. Laplace에서 정규 적분에 대한 분수가 계속되었습니다 . 앤 Inst. 통계 학자. 수학. , 44 (1) : 107-120, 1992 년 3 월.
잘만되면 이것이 당신을 시작할 것입니다. 좀 더 구체적으로 관심이 있으시면 어딘가에 가리킬 수 있습니다.
나는 영웅이 너무 늦었다 고 생각하지만 추기경의 게시물에 댓글을 달고 싶었고이 댓글은 의도 된 상자에 비해 너무 커졌습니다.
Chebyshev 근사값을 사용하는 것 외에 (보완 적) 오류 함수를 계산하는 대체 방법이 있습니다. Chebyshev 근사법을 사용하려면 몇 가지 계수를 저장해야하므로 컴퓨팅 환경에서 배열 구조가 약간 비싸면 이러한 방법이 우위에있을 수 있습니다 (계수를 인라인 할 수는 있지만 결과 코드는 바로크처럼 보일 수 있습니다. 음식물).
Lentz , Thompson 및 Barnett 는 연속 분수를 무한 곱으로 수치 적으로 평가하는 알고리즘을 도출했습니다. 이는 연속 분수 "뒤로"를 계산하는 일반적인 방법보다 효율적입니다. 일반적인 알고리즘을 표시하는 대신 Mills 's ratio 계산에 전문화되는 방법을 보여 드리겠습니다.
CF는 앞에서 언급 한 시리즈가 느리게 수렴하기 시작하는 경우에 유용합니다. 컴퓨팅 환경에서 시리즈를 CF로 전환하기 위해 적절한 "브레이크 포인트"를 결정하는 실험을해야합니다. Laplacian CF 대신 Asymptotic 시리즈를 사용하는 대안이 있지만 필자의 경험에 따르면 Laplacian CF는 대부분의 응용 프로그램에 충분합니다.
마지막으로, (상보적인) 오류 함수를 매우 정확하게 계산할 필요가없는 경우 (즉, 소수의 유효 숫자 만) Serge Winitzki로 인해 간결한 근사 가 있습니다 . 다음 중 하나입니다.
(이 답변은 원래 유사한 질문에 대한 응답으로 나타 났으며, 이후 복제본으로 마감되었습니다. OP는 반드시 "최첨단 기술"이 아닌 가우시안 적분의 "구현"만 원했습니다. 짧은 구현이 선호됩니다.)
MatLab 버전 (적절한 속성이있는)은 http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m 에서 구할 수 있습니다 . 원본 포트란 코드의 완전히 문서화되지 않은 버전이 "코더 코드 검색" (sic) 사이트에 나타납니다 .
몇 년 전에 나는 이것을 AWK로 옮겼다. 이 버전은 Fortran이 아닌 C와 유사한 구문과 개발 및 테스트시 삽입 한 추가 주석으로 인해 최신 개발자가 포팅하는 데 더 적합 할 수 있습니다. 정확도를 향상시켜야했기 때문입니다. 아래에 나타납니다.
과학 / 수학 / 통계 코드를 이식 한 경험이없는 사람들을위한 몇 가지 조언 : 한 번의 인쇄상의 실수로 쉽게 감지 할 수없는 심각한 오류가 발생할 수 있습니다. (내가 이것을 신뢰하고, 나는 그것들을 많이 만들었다.) 항상, 항상 신중하고 철저한 테스트를 만든다. 일반적인 적분 / 가우시안 적분 / 오류 기능은 수많은 테이블과 소프트웨어에서 사용할 수 있기 때문에 포팅 된 기능의 많은 수의 값을 체계적으로 비교하고 체계적으로 비교할 수 있습니다 (예 : 눈으로 보지 않고 컴퓨터로). 값을 정정하기위한 값. 내 코드의 시작 부분에서 이러한 테스트를 볼 수 있습니다. 시스템 검사를 위해 다른 프로그램에 (STDOUT을 통해) 파이프 될 수있는 -8.5 : 8.5 (0.1)의 값 테이블을 생성합니다.
예상 수치를 추정하는 방법을 알기에 충분한 수치 분석 배경을 가진 사람들을위한 또 다른 테스트 방법은 수치를 수치 적으로 구분하여 PDF와 쉽게 비교하는 것입니다 (쉽게 계산 됨).
alnorm
alnorm
alnorm
alnorm[-6.0]
UPPER_TAIL_IS_ZERO
15.
16.
#----------------------------------------------------------------------#
# ALNORM.AWK
# Compute values of the cumulative normal probability function.
# From G. Dallal's STAT-SAK (Fortran code).
# Additional precision using asymptotic expression added 7/8/92.
#----------------------------------------------------------------------#
BEGIN {
for (i=-85; i<=85; i++) {
x = i/10
p = alnorm(x, 0)
printf("%3.1f %12.10f\n", x, p)
}
exit
}
function alnorm(z,up, y,aln,w) {
#
# ALGORITHM AS 66 APPL. STATIST. (1973) VOL.22, NO.3:
# Hill, I.D. (1973). Algorithm AS 66. The normal integral.
# Appl. Statist.,22,424-427.
#
# Evaluates the tail area of the standard normal curve from
# z to infinity if up, or from -infinity to z if not up.
#
# LOWER_TAIL_IS_ONE, UPPER_TAIL_IS_ZERO, and EXP_MIN_ARG
# must be set to suit this computer and compiler.
LOWER_TAIL_IS_ONE = 8.5 # I.e., alnorm(8.5,0) = .999999999999+
UPPER_TAIL_IS_ZERO = 16.0 # Changes to power series expression
FORMULA_BREAK = 1.28 # Changes cont. fraction coefficients
EXP_MIN_ARG = -708 # I.e., exp(-708) is essentially true 0
if (z < 0.0) {
up = !up
z = -z
}
if ((z <= LOWER_TAIL_IS_ONE) || (up && z <= UPPER_TAIL_IS_ZERO)) {
y = 0.5 * z * z
if (z > FORMULA_BREAK) {
if (-y > EXP_MIN_ARG) {
aln = .398942280385 * exp(-y) / \
(z - 3.8052E-8 + 1.00000615302 / \
(z + 3.98064794E-4 + 1.98615381364 / \
(z - 0.151679116635 + 5.29330324926 / \
(z + 4.8385912808 - 15.1508972451 / \
(z + 0.742380924027 + 30.789933034 / \
(z + 3.99019417011))))))
} else {
aln = 0.0
}
} else {
aln = 0.5 - z * (0.398942280444 - 0.399903438504 * y / \
(y + 5.75885480458 - 29.8213557808 / \
(y + 2.62433121679 + 48.6959930692 / \
(y + 5.92885724438))))
}
} else {
if (up) { # 7/8/92
# Uses asymptotic expansion for exp(-z*z/2)/alnorm(z)
# Agrees with continued fraction to 11 s.f. when z >= 15
# and coefficients through 706 are used.
y = -0.5*z*z
if (y > EXP_MIN_ARG) {
w = -0.5/y # 1/z^2
aln = 0.3989422804014327*exp(y)/ \
(z*(1 + w*(1 + w*(-2 + w*(10 + w*(-74 + w*706))))))
# Next coefficients would be -8162, 110410
} else {
aln = 0.0
}
} else {
aln = 0.0
}
}
return up ? aln : 1.0 - aln
}
### end of file ###