Quelquun pourrait-il expliquer comment écrire une fonction sinc sans lutiliser dans MATLAB?


Meilleure réponse

Vous voulez dire une fonction qui évalue \ frac {\ sin x} {x} pour x \ ne 0 et 1 pour x = 0?

De toute évidence, il serait facile de simplement programmer quelque chose avec une instruction comme

function result = mySinc(x)

\% My implementation of the sinc function.

if x == 0

result = 1;

else

result = sin(x)/x;

end

end

Mais cela pourrait en fait être moins quidéal. Bien sûr, cela évite la singularité et a la bonne structure mathématique, mais il faut bien sûr se rappeler que les valeurs dans x ne sont pas des nombres: ce sont des modèles de bits représentés par des commutateurs dans le matériel et seulement nombres approximatifs . Ils fonctionnent assez bien la plupart du temps, mais il y a des circonstances où les choses ne fonctionnent pas correctement. Par exemple, lors de l’évaluation de a + log(1+x) pour de petits x, ou lors de lévaluation de a-b lorsque a et b ont des valeurs très similaires. Vous peut perdre un beaucoup de précision si vous évaluez ce dernier naïvement (même si parfois vous n’avez pas le choix, hélas). La division par de petits nombres peut aussi causer des problèmes, même si heureusement, \ sin x et x sont comparables quand | x | \ ll 1. Peut-être que ce ne serait pas un problème, mais quand il sagit darithmétique en virgule flottante, il est rarement bon davoir un code comme if x == foo.

Que faire dans ce cas? Considérez la série de Taylor de \ frac {\ sin x} {x} centrée sur x = 0. Je ne lécrirai pas, mais vous savez sûrement comment le calculer.

Remplacez ensuite le test if x == 0 par if abs(x) < sqrt(eps) , où dans Matlab eps renvoie la machine epsilon (comparable à 10 ^ {- 16} sur la plupart des systèmes de nos jours), et remplace la ligne result = 1; par result = ...;, où le ... sera votre calcul de la série de Taylor tronquée après un ordre approprié (généralement environ 2 devraient faire, mais vous devriez vérifier par vous-même léchelle du terme de commande le plus élevé que vous choisissez pour x \ sim 10 ^ {- 8} et si le résultat sera aussi précis que vous le souhaitez ou non).

Le la bonne chose ici est que ce que vous perdez en vitesse en exécutant ce code, vous gagnerez probablement en précision, en particulier lors de l’évaluation du sinus-intégral \ operatorname {Si} (x) = \ int\_0 ^ xf (t) dt, où f (t ) est lextension continue de la fonction \ operatorname {sinc} à tous les réels comme son domaine.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *