Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

MS-엑셀의 NORMSINV 구현..

138 views
Skip to first unread message

최형규

unread,
Nov 23, 1999, 3:00:00 AM11/23/99
to
안녕하세요.

표준누적정규분포함수의 역함수를 구하고자 합니다.
처음에는 표준확율밀도함수를 적분해서 다시 inverse를 구하면 될꺼라고
생각했었는데 integral {e^((-1/2)*t^2) dt} 가 단순하게는 불가능하다고
하더군요. 엑셀에 보면 NORMSINV()가 구현되어 있는데 이것을 C로 구현하고자
합니다.

제가 하고자 하는것은 uniform한 0~1까지의 random sample을 만들어 normal
distribution을 이루도록 변환하는 것인데 NORMSINV()에서 막혔답니다. -.-;;

어떤 도움이라도 환영합니다.
그럼, 즐거운 하루 되세요...

-hk


Kim Byung Gu

unread,
Nov 23, 1999, 3:00:00 AM11/23/99
to
하시고자 하는게 평균이 0이고 표준편차가 1인 정규분포를 이루는 난수를

만글고자 하는걸로 이해가 되는데요.

Numerical Recipes를 보시면 있습니다. 저는 포트란 버전을 봤는데 함수명

이 ran0, ran1, ran2 <=== 0 ~ 1의 난수발생

gasdev <=== [0,1]의 정규분포로 바꾸는거

였습니다. Numerical Recipes in C를 보셔도 나와있을듯..

최형규 <hkc...@kds.co.kr>이(가) 아래 메시지를
news:81cu5h$eev$1...@news2.kornet.net에 게시하였습니다.

Kim,Young-Jae

unread,
Nov 24, 1999, 3:00:00 AM11/24/99
to
> 였습니다. Numerical Recipes in C를 보셔도 나와있을듯..

다 아시겠지만 :) , Numerical Recipes 의 C와 Fortran버전은 인터넷에서
다운로드 받아 쓸 수 있습니다.
http://www.nr.com 으로 가시면 다른 곳에 배포, 복사, 제본하지 않는 조건하에서
사용자 1인이
책의 전문을 다운로드받을 수 있습니다.
저의 경우를 예로 들면 PDF포맷을 다운 받아서 PDF Viewer에서 Copy, Paste해서
썼습니다.
물론, 필요한 부분은 출력해서 공부했죠....^^

Seok Gyun Kim

unread,
Dec 6, 1999, 3:00:00 AM12/6/99
to

Kim Byung Gu <gr...@sidae.uos.ac.kr>이(가) 아래 메시지를
news:81doqd$9c7$1...@news.kren.nm.kr에 게시하였습니다.
: 하시고자 하는게 평균이 0이고 표준편차가 1인 정규분포를 이루는 난수를

: 만글고자 하는걸로 이해가 되는데요.
: Numerical Recipes를 보시면 있습니다. 저는 포트란 버전을 봤는데 함수명
: 이 ran0, ran1, ran2 <=== 0 ~ 1의 난수발생
: gasdev <=== [0,1]의 정규분포로 바꾸는거
: 였습니다. Numerical Recipes in C를 보셔도 나와있을듯..

: 최형규 <hkc...@kds.co.kr>이(가) 아래 메시지를


: news:81cu5h$eev$1...@news2.kornet.net에 게시하였습니다.
: > 안녕하세요.
: >
: > 표준누적정규분포함수의 역함수를 구하고자 합니다.
: > 처음에는 표준확율밀도함수를 적분해서 다시 inverse를 구하면 될꺼라고
: > 생각했었는데 integral {e^((-1/2)*t^2) dt} 가 단순하게는 불가능하다고
: > 하더군요. 엑셀에 보면 NORMSINV()가 구현되어 있는데 이것을 C로 구현하고자
: > 합니다.
: >
: > 제가 하고자 하는것은 uniform한 0~1까지의 random sample을 만들어 normal
: > distribution을 이루도록 변환하는 것인데 NORMSINV()에서 막혔답니다. -.-;;
: >
: > 어떤 도움이라도 환영합니다.

(1) Excel에서의 정규분포함수의 적분함수 즉 에러함수는 일반 통계학이나
수학에서 다루는 것처럼 보이지만
조금 헷갈리게 만들어져 있습니다.
즉, 일반적으로는
erf (z) =(1/2π)^0.5 * Integral(-∝~z)[exp(-t^2/2)dt ]로 사용하는데
엑셀에서는 동일 기호를 가지고
erf (x) =2/(π^0.5) * Integral (0~x) [exp(-t^2) ]dt 로 표현하고 있으므로
주의를 해야합니다.
왜 그렇게 헷갈리게 했는지 이유를 모르겠습니다.
따라서 엑셀에서는 erf(0) =0 , erf(1) =0.84270069 이 되는데 정규분표함수의
적분값으로 계산할 때는
다음과 같이해야 값을 얻을 수 있습니다. 즉
erf(1) =NORMDIST(√2, 0,1,true) - NORMDIST(-√2, 0,1,true) = 0.84270069

다시 말하면 z값에 √2를 곱한 값의 함수값을 갖게 하는 것과 적분치를 -x~x 까지
적분한 것이므로
따라서 일반적으로 사용하는 에러함수에서 Complemental Error Function값을 빼준
값을 엑셀에서는
에러함수값으로 취합니다. 계산값이 흔히들 틀리기 쉬우므로 조심해야하고
적분그림 표시를 사용해 두어야 착오가 없습니다.

(2) Integral(0~∝) exp(-x^2)dx의 값은 우함수인 성질을 이용해서 적분값의
제곱을 x= r cosθ, y = r sinθ로 치환하여 계산되지만 특정 변수값까지만
적분하기는 쉬운것이 아닌 것 같습니다. 물론 이값은 (π)^0.5/2 가됨.

따라서 굳이 자동계산하여 값을 놓도록 하자면 적분구간을 정하고 미분구간으로
쪼개서 루프를 돌면서 미분면적을 구해 더해가면 쉽게 계산할 수는 있겠지요.
계산할때 약간 시간이 걸리겠으나 요즘 컴퓨터가 좋아서 자주하는 계산이 아니면
지장이 없을 것 같습니다. 즉 미분 구간수를 정해Δx 값을 구하고
exp(-(0+iΔx))*Δx 값을 미분 구간수 만큼 순환하도록.. 그리 좋은 방법일 것
같지 않지만 수치적으로 풀기 어려운 것을 푸는데 쓰고 있더군요. 구간 적분이
구해지면 바로 위에서 설명한 것과같이 전체 면적을 알고있으니까 Complemental
Density Function값의 적분값이나 역함수들을 구할 있을 것 같습니다.

괜히 복잡하게만 하는 것 같습니다. ~SGK//991206


0 new messages