2016-08-17 3 views
1

J'ai des problèmes avec la précision des fonctions erf/erfc de Matlab.problèmes avec la fonction erf/erfc dans matlab

Comme nous le savons, erf(x) est seulement égal à 1 si x est l'infini.

Cependant, dans Matlab, je suis surpris que erf(6) soit déjà égal à 1 et 6 n'est même pas très grand!

erfc(x) est un peu mieux en ce que erfc(27) est non nul, alors que erfc(28) est zéro.

Existe-t-il un moyen d'améliorer les performances numériques de cette fonction? Par exemple, augmenter la plage de valeurs pour erf(x) pour obtenir une valeur qui n'est pas exactement 1? (et également 0 pour erfc?)

+1

combien de chiffres de précision avez-vous besoin? erf fournit 15 chiffres, erfc descend à 'e-300'. Si vous avez besoin de plus de précision, vous utilisez probablement la fonction de manière incorrecte. – Trogdor

+0

Avez-vous une raison d'exiger une telle précision pour les grandes valeurs de l'argument? –

Répondre

1

Votre traitant avec double precision floating point. erfc s'exécute différemment car les valeurs sont plus proches de 0 que 1. Vous devez représenter vos valeurs avec un système numérique différent si vous avez vraiment besoin de plus de précision (je ne comprends pas pourquoi vous le feriez). Essayez d'utiliser variable precision arithmetic si vous avez la boîte à outils Symbolic Math. Essayez

erf(vpa(6)) 

qui renvoie la valeur symbolique 0.99999999999999997848026328750109. Vous devrez utiliser digits lorsque l'argument s'agrandit. Et bien sûr, si vous convertissez les résultats en virgule flottante avec double vous perdrez toute la précision supplémentaire.

+0

Malheureusement, j'ai besoin d'utiliser la sortie de erf/erfc pour l'optimisation. Je dois effectivement prendre le journal de erfc. Si la valeur de erfc est 0 alors l'algorithme d'optimisation ne fonctionnera pas. – user1237300

+2

@ user1237300 Dans ce cas, vous pouvez consulter la fonction d'erreur complémentaire à échelle exponentielle 'erfcx'. – njuffa

+0

@njuffa A raison. Essayez 'x = 30;' 'log (erfcx (x)) - x.^2' pour implémenter' log (erfc (x)) '. Vous pouvez vérifier le résultat avec 'double (log (erfc (vpa (30))))'. – horchler