Jawaban:
Tergantung pada apa yang Anda cari . Di bawah ini adalah beberapa perincian dan referensi singkat.
Banyak literatur untuk aproksimasi berpusat di sekitar fungsi
untuk . Ini karena fungsi yang Anda berikan dapat didekomposisi sebagai perbedaan sederhana dari fungsi di atas (mungkin disesuaikan oleh konstanta). Fungsi ini disebut dengan banyak nama, termasuk "ekor atas dari distribusi normal", "integral normal kanan", dan "Gaussian -function", untuk beberapa nama. Anda juga akan melihat perkiraan rasio Mills , yaitu di manaφ(x)=(2π)-1/2e-x2/2adalah Gaussian pdf.
Di sini saya daftar beberapa referensi untuk berbagai keperluan yang Anda mungkin tertarik.
Komputasi
Standar de-facto untuk menghitung fungsi- atau fungsi kesalahan komplementer terkait adalah
WJ Cody, Perkiraan Chebyshev Rasional untuk Fungsi Kesalahan , Matematika. Comp. , 1969, hlm. 631--637.
Setiap implementasi (menghargai diri sendiri) menggunakan tulisan ini. (MATLAB, R, dll.)
Perkiraan "Sederhana"
Abramowitz dan Stegun memiliki satu didasarkan pada ekspansi polinomial dari suatu transformasi input. Beberapa orang menggunakannya sebagai perkiraan "presisi tinggi". Saya tidak suka untuk tujuan itu karena berperilaku buruk di sekitar nol. Sebagai contoh, pendekatan mereka tidak tidak menghasilkan Q ( 0 ) = 1 / 2 , yang saya pikir besar tidak-tidak. Terkadang hal buruk terjadi karena ini.
Borjesson dan Sundberg memberikan perkiraan sederhana yang bekerja cukup baik untuk sebagian besar aplikasi di mana seseorang hanya membutuhkan beberapa digit presisi. The kesalahan relatif absolut tidak pernah lebih buruk dari 1%, yang cukup baik mengingat kesederhanaan. Pendekatan dasar adalah Q ( x ) = 1 dan pilihan konstanta pilihannya adalaha=0,339danb=5,51. Referensi itu
PO Borjesson dan CE Sundberg. Perkiraan sederhana dari fungsi kesalahan Q (x) untuk aplikasi komunikasi . IEEE Trans. Komunal. , COM-27 (3): 639–643, Maret 1979.
Berikut adalah plot kesalahan relatif absolutnya.
Literatur teknik-listrik dipenuhi dengan berbagai perkiraan seperti itu dan tampaknya sangat tertarik pada mereka. Banyak dari mereka yang miskin atau berkembang menjadi ekspresi yang sangat aneh dan berbelit-belit.
Anda mungkin juga melihat
W. Bryc. Suatu pendekatan seragam ke integral normal yang tepat . Matematika dan Komputasi Terapan , 127 (2-3): 365-374, April 2002.
Fraksi lanjutan Laplace
Laplace memiliki fraksi lanjutan yang indah yang menghasilkan batas atas dan bawah berturut-turut untuk setiap nilai . Dalam hal rasio Mills,
di mana notasi yang saya gunakan cukup standar untuk fraksi lanjutan , yaitu, . Ekspresi ini tidak konvergen sangat cepat untuk x kecil , dan itu menyimpang di x = 0 .
Fraksi lanjutan ini sebenarnya menghasilkan banyak batasan "sederhana" pada yang "ditemukan kembali" pada pertengahan hingga akhir 1900-an. Sangat mudah untuk melihat bahwa untuk fraksi lanjutan dalam bentuk "standar" (yaitu, terdiri dari koefisien bilangan bulat positif), memotong fraksi pada istilah ganjil (genap) memberikan batas atas (bawah).
Karenanya, Laplace segera memberi tahu kita bahwa keduanya merupakan batas yang "ditemukan kembali" pada pertengahan 1900-an. Dalam halfungsi- Q , ini setara dengan x
Perhatikan, khususnya, bahwa ketidaksetaraan di atas segera menyiratkan bahwa . Fakta ini dapat dibangun dengan menggunakan aturan L'Hopital juga. Ini juga membantu menjelaskan pilihan bentuk fungsional perkiraan Borjesson-Sundberg. Setiap pilihan yang ∈ [ 0 , 1 ] mempertahankan kesetaraan asimtotik sebagai x → ∞ . Parameter b berfungsi sebagai "koreksi kontinuitas" mendekati nol.
Berikut adalah plot fungsi- dan dua batas Laplace.
CI. C. Lee. On Laplace melanjutkan pecahan untuk integral normal . Ann. Inst. Statist. Matematika , 44 (1): 107–120, Maret 1992.
Semoga ini akan membantu Anda memulai. Jika Anda memiliki minat yang lebih spesifik, saya mungkin bisa mengarahkan Anda ke suatu tempat.
Saya kira saya sudah terlambat pahlawan, tetapi saya ingin mengomentari posting kardinal, dan komentar ini menjadi terlalu besar untuk kotak yang dimaksud.
Sebenarnya ada cara alternatif untuk menghitung fungsi kesalahan (komplementer) selain dari menggunakan pendekatan Chebyshev. Karena penggunaan pendekatan Chebyshev memerlukan penyimpanan tidak sedikit koefisien, metode ini mungkin memiliki keunggulan jika struktur array sedikit mahal di lingkungan komputasi Anda (Anda dapat menyejajarkan koefisien, tetapi kode yang dihasilkan mungkin akan terlihat seperti barok kekacauan).
Lentz , Thompson dan Barnett memperoleh algoritma untuk mengevaluasi secara numerik fraksi lanjutan sebagai produk tanpa batas, yang lebih efisien daripada pendekatan biasa menghitung fraksi lanjutan "mundur". Alih-alih menampilkan algoritma umum, saya akan menunjukkan bagaimana itu mengkhususkan diri pada perhitungan rasio Mills:
CF berguna di mana seri yang disebutkan sebelumnya mulai bertemu perlahan; Anda harus bereksperimen dengan menentukan "break point" yang tepat untuk beralih dari seri ke CF di lingkungan komputasi Anda. Ada juga alternatif menggunakan seri asimptotik alih-alih CF Laplacian, tetapi pengalaman saya adalah bahwa CF Laplacian cukup baik untuk sebagian besar aplikasi.
Akhirnya, jika Anda tidak perlu menghitung fungsi kesalahan (komplementer) dengan sangat akurat (yaitu hanya beberapa digit signifikan), ada perkiraan ringkas karena Serge Winitzki. Ini salah satunya:
Perkiraan ini memiliki kesalahan relatif maksimum dan menjadi lebih akurat sebagai meningkat.
(Jawaban ini awalnya muncul sebagai jawaban atas pertanyaan serupa, kemudian ditutup sebagai duplikat. OP hanya menginginkan "sebuah" implementasi integral Gaussian, tidak harus "canggih". Dalam komentarnya, tampak jelas bahwa relatif sederhana , implementasi singkat akan lebih disukai.)
Seperti yang ditunjukkan oleh komentar, Anda perlu mengintegrasikan PDF . Ada banyak cara untuk melakukan integral. Dahulu kala, ketika perhitungannya lambat dan mahal, David Hill menyusun perkiraan menggunakan aritmatika sederhana (fungsi rasional dan eksponensial). Ini memiliki akurasi presisi ganda untuk argumen umum (antara dan , kurang-lebih). Pada tahun 1973 ia menerbitkan versi Fortran dalam Statistik Terapan disebut ALNORM.F. Selama bertahun-tahun saya telah porting ini ke berbagai lingkungan yang tidak memiliki integral Normal (Gaussian) atau yang memiliki yang dicurigai (seperti Excel).
Versi MatLab (dengan atribusi yang sesuai) tersedia di http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.m . Versi kode Fortran yang sepenuhnya tidak berdokumen muncul di situs "Koders Code Search" (sic).
Beberapa tahun yang lalu saya mengirim ini ke AWK. Versi ini mungkin lebih cocok untuk pengembang modern untuk port karena sintaksinya seperti C (daripada Fortran) dan beberapa komentar tambahan yang saya masukkan ketika mengembangkan dan mengujinya, karena saya perlu meningkatkan akurasinya. Itu muncul di bawah.
Bagi mereka yang tidak memiliki banyak pengalaman mengaitkan kode ilmiah / matematika / statistik, beberapa kata nasihat : satu kesalahan ketik dapat menyebabkan kesalahan serius yang mungkin tidak mudah terdeteksi. (Percayalah pada saya, saya sudah membuat banyak dari mereka.) Selalu, selalu membuat tes yang cermat dan lengkap. Karena fungsi integral / Gaussian terpisahkan / kesalahan normal tersedia dalam begitu banyak tabel dan begitu banyak perangkat lunak, mudah dan cepat untuk mentabulasikan sejumlah besar nilai fungsi porting Anda dan membandingkan secara sistematis (mis. Dengan komputer, bukan dengan mata) nilai untuk memperbaikinya. Anda dapat melihat tes seperti itu di awal kode saya: menghasilkan tabel nilai di -8.5: 8.5 (sebesar 0,1) yang dapat disalurkan (melalui STDOUT) ke program lain untuk pemeriksaan sistematis.
Pendekatan pengujian lain - bagi mereka yang memiliki latar belakang analisis numerik yang cukup untuk mengetahui bagaimana memperkirakan kesalahan yang diharapkan - akan secara numerik membedakan nilai-nilai dan membandingkannya dengan PDF (yang siap dihitung).
By the way: kode ini hanya untuk kasus dengan rata-rata dan deviasi standar satuan ("sigma"). Tapi hanya itu yang dibutuhkan: untuk diintegrasikan untuk ketika rata-rata adalah dan SD , hitung saja dan berlaku alnorm
untuk itu.
Saya menguji port alnorm
to Mathematica, yang menghitung nilai-nilai dengan presisi sewenang-wenang. Untuk membandingkan hasilnya, berikut adalah plot log natural dari rasio nilai ekor atas dengan . (Kesalahan relatif positif berarti alnorm
terlalu besar.)
Nilai selalu akurat untuk relatif terhadap probabilitas ekor yang semakin kecil . Anda dapat melihat di mana perhitungan beralih ke rumus asimptotik (di) dan terbukti bahwa formula ini menjadi sangat akurat meningkat. Plot berhenti di karena di sinilah eksponensial presisi ganda mulai kurang mengalir.
Misalnya, alnorm[-6.0]
kembali sedangkan nilai sebenarnya, sama dengan , kira-kira , pertama berbeda dalam digit desimal kedua belas.
NB Sebagai bagian dari pengeditan ini, saya mengubah UPPER_TAIL_IS_ZERO
dari 15.
ke 16.
dalam kode: itu membuat hasilnya sedikit lebih akurat antara dan . (Akhir edit.)
#----------------------------------------------------------------------#
# 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 ###