Питання стосується функції додаткової помилки
erfc(x)=2π−−√∫∞xexp(−t2)dt
для "великих" значень ( в первісному запитанні) - тобто від 100 до 700 000 або близько того. (На практиці будь-яке значення, що перевищує приблизно 6, слід вважати "великим", як ми побачимо.) Зауважте, що оскільки це буде використовуватися для обчислення p-значень, мало значення для отримання більше трьох значущих (десяткових) цифр .= n / √x=n/2–√
Для початку розглянемо наближення, запропоноване @Iterator,
f(x)=1−1−exp(−x2(4+ax2π+ax2))−−−−−−−−−−−−−−−−−−−−−−√,
де
a=8(π−3)3(4−π)≈0.439862.
Хоча це чудове наближення до самої функції помилок, це жахливе наближення до . Однак є спосіб систематично це виправити.erfc
Для p-значень, пов'язаних з такими великими значеннями , нас цікавить відносна похибка : ми сподіваємось, що її абсолютне значення буде менше 0,001 для трьох значущих цифри точності. На жаль, цей вираз важко вивчити для великого через підтоки в обчисленні подвійної точності. Ось одна спроба, яка побудує відносну помилку проти для :f (x x x 0 ≤ x ≤ 5.8f(x)/erfc(x)−1xx0≤x≤5.8
Обчислення стає нестабільним, коли перевищує 5,3 або більше і не може надати одну значну цифру за минулу 5.8. Це не дивно: розсуває межі арифметики подвійної точності. Оскільки немає доказів того, що відносна похибка буде значно меншою для більшого , нам потрібно зробити краще.exp ( - 5,8 2 ) ≈ 10 - 14,6 xxexp(−5.82)≈10−14.6x
Виконання обчислення в розширеній арифметиці (за допомогою Mathematica ) покращує нашу картину того, що відбувається:
Помилка швидко зростає з і не показує ознак вирівнювання. Минуле або більше, це наближення не дає навіть однієї надійної цифри інформації!x = 10xx=10
Однак сюжет починає виглядати лінійно. Ми можемо здогадатися, що відносна похибка прямо пропорційна . (Це має сенс на теоретичних підставах: явно є непарною функцією, а явно парним, тому їх співвідношення повинно бути непарною функцією. Таким чином, ми очікуємо, що відносна помилка, якщо вона зросте, поводитиметься як непарна сила .) Це призводить нас до вивчення відносної помилки, поділеної на . Еквівалентно, я вирішу розглянути , тому що, надія, це має мати постійне обмежувальне значення. Ось його графік:erfc f xxerfcfx x ⋅ erfc ( x ) / f ( x )xx⋅erfc(x)/f(x)
Наше припущення, здається, підтверджується: цей коефіцієнт, схоже, наближається до межі приблизно 8. На запит, Mathematica надасть:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
Значення . Це дозволяє нам покращити оцінку: ми беремоa1=2π√e3(−4+π)28(−3+π)≈7.94325
f1(x)=f(x)a1x
як перше уточнення наближення. Коли дійсно великий - більший за кілька тисяч - це наближення просто чудово. Оскільки це все ще не буде досить добре для цікавого діапазону аргументів між і або близько того, давайте повторимо процедуру. Цього разу обернена відносна помилка - зокрема, вираз повинна поводитись як для великого (в силу попередніх міркувань паритету) . Відповідно, множимо на і знаходимо наступну межу:5.3 2000 1 - erfc ( x ) / f 1 ( xx5.320001−erfc(x)/f1(x)1/x2xx2
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
Значення є
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
Цей процес може тривати скільки завгодно. Я зробив це ще один крок, знайшовши
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
зі значенням приблизно 1623,67. (Повний вираз передбачає раціональну функцію восьмому ступені і занадто довгий, щоб бути корисним тут.)π
Розмотування цих операцій дає остаточне наближення
f3(x)=f(x)(a1−a2/x2+a3/x4)/x.
Похибка пропорційна . Імпорт - це константа пропорційності, тому ми побудуємо : x 6 ( 1 -x−6x6(1−erfc(x)/f3(x))
Він швидко наближається до граничного значення близько 2660,59. Використовуючи наближення , ми отримуємо оцінки , відносна точність яких краща за для всіх . Після того як перевищує 20 або більше, ми маємо три значні цифри (або набагато більше, оскільки збільшується). Як перевірка, ось таблиця, яка порівнює правильні значення з наближенням для між і :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
Насправді, це наближення дає щонайменше дві значущі показники точності для на, тобто якраз там, де проглядаються пішохідні розрахунки (наприклад, функція Excel ).x=8NormSDist
Нарешті, можна потурбуватися про нашу здатність обчислити початкове наближення . Однак це не важко: коли досить великий, щоб викликати підтоки в експоненціалі, квадратний корінь добре наближається до половини експоненціалу,fx
f(x)≈12exp(−x2(4+ax2π+ax2)).
Обчислити логарифм цього (у базі 10) нескладно і легко дати бажаний результат. Наприклад, нехай . Загальний логарифм цього наближення єx=1000
log10(f(x))≈(−10002(4+a⋅10002π+a⋅10002)−log(2))/log(10)∼−434295.63047.
Експоненцію врожайності
f(1000)≈2.34169⋅10−434296.
Застосування корекції (у ) дає результатf3
erfc(1000)≈1.86003 70486 32328⋅10−434298.
Зауважте, що виправлення зменшує вихідне наближення понад 99% (і справді .) (Це наближення відрізняється від правильного значення лише в останній цифрі. Інше добре відоме наближення, , дорівнює , помиляючись у шостій знаковій цифрі. Я впевнений, що ми могли б також покращити цю, якщо ми хотіли, використовуючи ті самі методи.)a1/x≈1%1,8860038⋅10 - 434298exp(−x2)/(xπ−−√)1.860038⋅10−434298