La question concerne la fonction d'erreur complémentaire
erfc(x)=2π−−√∫∞xexp(−t2)dt
pour les "grandes" valeurs de x ( =n/2–√ dans la question initiale) - c'est-à-dire entre 100 et 700 000 environ. (Dans la pratique, toute valeur supérieure à environ 6 doit être considérée comme "grande", comme nous le verrons.) Notez que parce que cela sera utilisé pour calculer les valeurs de p, il y a peu de valeur à obtenir plus de trois chiffres significatifs (décimaux) .
Pour commencer, considérez l'approximation suggérée par @Iterator,
f(x)=1−1−exp(−x2(4+ax2π+ax2))−−−−−−−−−−−−−−−−−−−−−−√,
où
a=8(π−3)3(4−π)≈0.439862.
Bien que ce soit une excellente approximation de la fonction d'erreur elle-même, c'est une terrible approximation de erfc . Cependant, il existe un moyen de corriger systématiquement cela.
Pour les valeurs de p associées à de si grandes valeurs de x , nous nous intéressons à l' erreur relative f(x)/erfc(x)−1 : nous espérons que sa valeur absolue serait inférieure à 0,001 pour trois chiffres significatifs de précision. Malheureusement, cette expression est difficile à étudier pour les grands x raison de sous-écoulements dans le calcul en double précision. Voici une tentative, qui trace l'erreur relative par rapport à x pour 0≤x≤5.8 :
Le calcul devient instable une fois que dépasse 5,3 environ et ne peut pas délivrer un chiffre significatif au-delà de 5,8. Ce n'est pas une surprise: exp ( - 5,8 2 ) ≈ 10 - 14,6 repousse les limites de l'arithmétique double précision. Parce qu'il n'y a aucune preuve que l'erreur relative va être suffisamment petite pour un x plus grand , nous devons faire mieux.xexp(−5.82)≈10−14.6x
L'exécution du calcul en arithmétique étendue (avec Mathematica ) améliore notre image de ce qui se passe:
L'erreur augmente rapidement avec et ne montre aucun signe de stabilisation. Au-delà de x = 10 environ, cette approximation ne fournit même pas un chiffre fiable d'informations!xx=10
Cependant, l'intrigue commence à sembler linéaire. On pourrait deviner que l'erreur relative est directement proportionnelle à . (Cela a du sens sur le plan théorique: erfc est manifestement une fonction impaire et f est manifestement pair, donc leur rapport devrait être une fonction impaire. Ainsi, nous nous attendrions à ce que l'erreur relative, si elle augmente, se comporte comme une puissance impaire de x .) Cela nous amène à étudier l'erreur relative divisée par x . De manière équivalente, je choisis d'examiner x ⋅ erfc ( x ) / f ( x )xerfcfx xx⋅erfc(x)/f(x), car l'espoir est que cela devrait avoir une valeur limite constante. Voici son graphique:
Notre supposition semble être confirmée: ce ratio semble approcher d'une limite autour de 8 environ. Lorsque demandé, Mathematica le fournira:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
La valeur est . Cela nous permet d'améliorer l'estimation:nous prenonsa1=2π√e3(−4+π)28(−3+π)≈7.94325
f1(x)=f(x)a1x
comme le premier raffinement de l'approximation. Lorsque est vraiment grand - supérieur à quelques milliers - cette approximation est très bien. Parce que cela ne sera toujours pas assez bon pour une gamme intéressante d'arguments entre 5.3 et 2000 , itérons la procédure. Cette fois, l'erreur relative inverse - en particulier, l'expression 1 - erfc ( x ) / f 1 ( x ) - devrait se comporter comme 1 / x 2 pour les grands x (en vertu des considérations de parité précédentes). En conséquence, nous multiplions par x 2x5.320001−erfc(x)/f1(x)1/x2xx2 et trouvez la prochaine limite:
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
La valeur est
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
Ce processus peut se poursuivre aussi longtemps que nous le souhaitons. Je l'ai sorti encore une fois, trouvant
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
avec une valeur d'environ 1623,67. (L'expression complète implique une fonction rationnelle de degré huit de et est trop longue pour être utile ici.)π
Le déroulement de ces opérations donne notre approximation finale
f3(x)=f(x)(a1−a2/x2+a3/x4)/x.
L'erreur est proportionnelle à . D'importation est la constante de proportionnalité, nous traçons donc x 6 ( 1 - erfc ( x ) / f 3 ( x ) ) :x−6x6(1−erfc(x)/f3(x))
Il s'approche rapidement d'une valeur limite autour de 2660,59. En utilisant l'approximation , nous obtenons des estimations de erfc ( x ) dont la précision relative est meilleure que 2661 / x 6 pour tout x > 0 . Une fois que x dépasse 20 ou plus, nous avons nos trois chiffres significatifs (ou bien plus, car x devient plus grand). À titre de vérification, voici un tableau comparant les valeurs correctes à l'approximation de x entre 10 et 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
En fait, cette approximation fournit au moins deux chiffres de précision significatifs pour , ce qui est à peu près là où les calculs des piétons (tels que la fonction d'Excel ) s'épuisent.x=8NormSDist
Enfin, on pourrait s'inquiéter de notre capacité à calculer l'approximation initiale . Cependant, ce n'est pas difficile: lorsque x est suffisamment grand pour provoquer des débordements dans l'exponentielle, la racine carrée est bien approximée de la moitié de l'exponentielle,fx
f(x)≈12exp(−x2(4+ax2π+ax2)).
Le calcul du logarithme de celui-ci (en base 10) est simple et donne facilement le résultat souhaité. Par exemple, soit . Le logarithme commun de cette approximation estx=1000
log10(f(x))≈(−10002(4+a⋅10002π+a⋅10002)−log(2))/log(10)∼−434295.63047.
Exposer les rendements
f(1000)≈2.34169⋅10−434296.
L'application de la correction (en ) produitf3
erfc(1000)≈1.86003 70486 32328⋅10−434298.
Notez que la correction réduit l'approximation d'origine de plus de 99% (et en effet, .) (Cette approximation ne diffère de la valeur correcte que dans le dernier chiffre. Une autre approximation bien connue, exp ( - x 2 ) / ( x √a1/x≈1%, égal à1,860038⋅10 - 434298 , errant dans le sixième chiffre significatif. Je suis sûr que nous pourrions aussi améliorer celui-ci, si nous le voulions, en utilisant les mêmes techniques.)exp(−x2)/(xπ−−√)1.860038⋅10−434298