Soru tamamlayıcı hata fonksiyonu ile ilgilidir
erfc(x)=2π−−√∫∞xexp(−t2)dt
"büyük" değerleri için ( orijinal sorudaki ) - 100 ile 700.000 arasında. (Pratikte, göreceğimiz gibi yaklaşık 6'dan büyük herhangi bir değer "büyük" olarak değerlendirilmelidir.) Bu, p değerlerini hesaplamak için kullanılacağından, üçten fazla anlamlı (ondalık) basamak elde etmede çok az değer olduğunu unutmayın. .x=n/2–√
Başlamak için @Iterator tarafından önerilen yaklaşımı düşünün,
f(x)=1−1−exp(−x2(4+ax2π+ax2))−−−−−−−−−−−−−−−−−−−−−−√,
nerede
a=8(π−3)3(4−π)≈0.439862.
Bu, hata işlevinin kendisine mükemmel bir yaklaşım olsa da, için korkunç bir yaklaşımdır . Ancak, bunu sistematik olarak düzeltmenin bir yolu vardır.erfc
Bu kadar büyük değerleri ile ilişkili p değerleri için, göreceli hatasıyla ilgileniyoruz : umarım üç önemli değer için mutlak değerinin 0.001'den az olacağını umuyoruz hassasiyet basamakları. Ne yazık ki bu ifadenin çift kesinlikli hesaplamadaki düşük akışlar nedeniyle büyük için incelenmesi zordur . için karşı göreceli hatayı çizen bir deneme :x f(x)/erfc(x)−1xx0≤x≤5.8
5.3 değerini aştığında hesaplama kararsız hale gelir ve 5.8'i geçen önemli bir rakamı veremez. Bu hiç de şaşırtıcı değil: çift kesinlikli aritmetiğin sınırlarını zorluyor. Göreceli hatanın daha büyük için kabul edilebilir derecede küçük olacağına dair bir kanıt olmadığından, daha iyisini yapmamız gerekiyor.xexp(−5.82)≈10−14.6x
Hesaplamayı genişletilmiş aritmetik ( Mathematica ile ) yapmak, neler olduğuna dair resmimizi geliştirir:
Hata ile hızla artar ve hiçbir tesviye işareti göstermez. Geçmiş kadar, bu yaklaşım güvenilir bir bilgi basamağı bile sağlamaz!xx=10
Ancak, grafik doğrusal görünmeye başlıyor. Göreceli hatanın ile doğru orantılı olduğunu tahmin edebiliriz . (Bu teorik temelde mantıklıdır: açıkça garip bir işlevdir ve açıkça eşittir, bu nedenle oranları garip bir işlev olmalıdır. Bu nedenle, göreceli hatanın, eğer artarsa, garip güç ). Bu potansiyel müşteriler bize incelemek için bölü göreceli hatayı . yi incelemeyi tercih ediyorum , çünkü bunun sabit bir sınır değeri olması gerekir. İşte grafiği:xerfcfx xx⋅erfc(x)/f(x)
Tahminimiz ortaya çıkmış gibi görünüyor: bu oran 8 civarında bir sınıra yaklaşıyor gibi görünüyor. Sorulduğunda, Mathematica bunu sağlayacaktır:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
Değer . Bu tahmin geliştirmemizi sağlamaktadır: Aldığımıza1=2π√e3(−4+π)28(−3+π)≈7.94325
f1(x)=f(x)a1x
yaklaşık ilk ayrıntılandırma olarak. Ne zaman gerçekten büyüktür - daha büyük birkaç bin - Bu yaklaşım ve gayet iyi. ve kadar ilginç bir argüman yelpazesi için hala iyi olmayacağından , prosedürü tekrarlayalım. Bu kez, ters bağıl hata - özellikle, ifadesi - büyük için gibi davranmalıdır (önceki parite hususları nedeniyle) . Buna göre, ile çarpıyoruz ve bir sonraki limiti buluyoruz:x5.320001−erfc(x)/f1(x)1/x2xx2
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
Değer
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
Bu süreç istediğimiz sürece devam edebilir. Bir adım daha attım,
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
değeri yaklaşık 1623.67. (Tam ifade derecesinin rasyonel işlevini içerir ve burada yararlı olmak için çok uzun.)π
Bu operasyonların çözülmesi nihai yaklaşımımızı verir
f3(x)=f(x)(a1−a2/x2+a3/x4)/x.
Hata, ile orantılıdır . İçe aktarma orantılılık sabiti, bu nedenle :x−6x6(1−erfc(x)/f3(x))
Hızla 2660.59 civarında sınırlayıcı bir değere yaklaşır. yaklaşımını kullanarak, göreceli doğruluğu tüm için daha iyi olan tahminlerini elde ederiz . Bir kez 20 ya da öylesine aşıyor (aynı veya çok daha, bizim üç önemli basamak var büyüdükçe). Bir kontrol olarak, burada doğru değerleri için ile arasındaki yaklaşık karşılaştırmayla karşılaştıran bir tablo bulunmaktadır :f3erfc(x)2661/x6x>0xxx1020
x Erfc Approximation
10 2.088*10^-45 2.094*10^-45
11 1.441*10^-54 1.443*10^-54
12 1.356*10^-64 1.357*10^-64
13 1.740*10^-75 1.741*10^-75
14 3.037*10^-87 3.038*10^-87
15 7.213*10^-100 7.215*10^-100
16 2.328*10^-113 2.329*10^-113
17 1.021*10^-127 1.021*10^-127
18 6.082*10^-143 6.083*10^-143
19 4.918*10^-159 4.918*10^-159
20 5.396*10^-176 5.396*10^-176
Aslında, bu yaklaşım, açıklığı için en az iki önemli hassasiyet rakamı sağlar; bu, yaya hesaplamalarının (Excel'in işlevi gibi) nerede ortaya çıktığıdır.x=8NormSDist
Son olarak, ilk yaklaşım hesaplama yeteneğimizden endişe edilebilir . Ancak, bu zor değil: üstelde alt akışlara neden olacak kadar büyük olduğunda, kare kök üstelin yarısı kadar iyi yaklaşır,fx
f(x)≈12exp(−x2(4+ax2π+ax2)).
Bunun logaritmasını hesaplamak (taban 10'da) basittir ve kolayca istenen sonucu verir. Örneğin, . Bu yaklaşımın ortak logaritması:x=1000
log10(f(x))≈(−10002(4+a⋅10002π+a⋅10002)−log(2))/log(10)∼−434295.63047.
Üstel verim
f(1000)≈2.34169⋅10−434296.
Düzeltmeyi uygulamak ( ) üretirf3
erfc(1000)≈1.86003 70486 32328⋅10−434298.
Düzeltme% 99'dan fazla orijinal tahminini azaltır (ve aslında, bu Not ,.) (Sadece son basamak doğru değerden Bu yaklaşım farklıdır. İyi bilinen bir başka yaklaşım , eşittir , altıncı anlamlı basamakta . Eminim bunu da geliştirebiliriz, eğer biz aynı teknikleri kullanarak istedim.)a1/x≈1%exp(−x2)/(xπ−−√)1.860038⋅10−434298