J'ai des ressources très limitées car je travaille avec un microcontrôleur. Existe-t-il une extension de la série Taylor, une table de recherche commune ou une approche récursive?
Je préfère faire quelque chose sans utiliser sqrt () de math.h
algorithms
c
numerical-algorithms
tarabyte
la source
la source
Réponses:
si vous voulez une expansion de la série de puissance optimisée bon marché et sale (les coefficients de la série Taylor convergent lentement) pour
sqrt()
et un tas d'autres trancendentals, j'ai du code d'il y a longtemps. J'avais l'habitude de vendre ce code, mais personne ne me l'a payé pendant près d'une décennie. donc je pense que je vais le publier pour la consommation publique. ce fichier particulier était destiné à une application dans laquelle le processeur avait une virgule flottante (simple précision IEEE-754) et ils avaient un compilateur C et un système de développement, mais ils n'en avaient pasavoir (ou ils ne voulaient pas lier) le stdlib qui aurait eu les fonctions mathématiques standard. ils n'avaient pas besoin d'une précision parfaite, mais ils voulaient que les choses soient rapides. vous pouvez assez facilement désosser le code pour voir quels sont les coefficients de la série de puissance et écrire votre propre code. ce code suppose IEEE-754 et masque les bits pour la mantisse et l'exposant.il semble que le "balisage de code" de SE ne soit pas convivial avec les caractères angulaires (vous savez ">" ou "<"), vous devrez donc probablement appuyer sur "modifier" pour tout voir.
la source
stdlib
.Si vous ne l'avez pas vu, la "racine carrée de Quake" est tout simplement mystificatrice. Il utilise une magie au niveau du bit pour vous donner une très bonne première approximation, puis utilise une ou deux approximations de Newton pour réviser. Cela pourrait vous aider si vous travaillez avec des ressources limitées.
https://en.wikipedia.org/wiki/Fast_inverse_square_root
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
la source
Vous pouvez également approximer la fonction racine carrée en utilisant la méthode de Newton . La méthode de Newton est un moyen d'estimer où se trouvent les racines d'une fonction. C'est aussi une méthode itérative où le résultat de l'itération précédente est utilisé dans l'itération suivante jusqu'à la convergence. L'équation de la méthode de Newton pour deviner où se trouve la racine d'une fonction étant donné une supposition initiale x 0 est définie comme suit:F( x ) X0
est la première estimation de l'emplacement de la racine. Nous continuons de recycler l'équation et d'utiliser les résultats des itérations précédentes jusqu'à ce que la réponse ne change pas. En général, pour déterminer la supposition de la racine à l'itération ( n + 1 ) , étant donné que la supposition à l'itération n est définie comme:X1 ( n + 1 ) n
Pour utiliser la méthode de Newton pour approximer la racine carrée, supposons que l'on nous donne un nombre . En tant que tel, pour calculer la racine carrée, nous devons calculer √une En tant que tel, nous cherchons à trouver une réponse telle quex= √une--√ . Mettre les deux côtés au carré et déplacerade l'autre côté de l'équation donnex2-a=0. En tant que tel, la réponse à cette équation est √x = a--√ une X2- a = 0 et est donc laracinede la fonction. En tant que tel, soitf(x)=x2-al'équation dont nous voulons trouver la racine. En substituant ceci dans la méthode de Newton,f′(x)=2x, et donc:une--√ F( x ) = x2- un F′( x ) = 2 x
xn+1=1
Par conséquent, pour calculer la racine carrée de , nous devons simplement calculer la méthode de Newton jusqu'à ce que nous convergions. Cependant, comme l'a noté @ robertbristow-johnson, la division est une opération très coûteuse - en particulier pour les microcontrôleurs / DSP avec des ressources limitées. De plus, il peut y avoir un cas où une estimation peut être 0, ce qui entraînerait une erreur de division par 0 en raison de l'opération de division. En tant que tel, ce que nous pouvons faire est d'utiliser la méthode de Newton et de résoudre la fonction réciproque à la place, c'est-à-dire 1une . Cela évite également toute division, comme nous le verrons plus loin. Équerrage des deux côtés et déplacement √1X= a--√ vers la gauche donne donc 1une--√ . Par conséquent, la solution à ce problème serait11X2- a = 0 . En multipliant para, nous obtiendrions le résultat souhaité. Encore une fois, en utilisant la méthode de Newton, nous avons donc:1une√ une
xn+1=xn-1
Cependant, il y a un avertissement que nous devons considérer lors de l'examen de l'équation ci-dessus. Pour les racines carrées, la solution doit être positive et donc pour que les itérations (et le résultat) soient positifs, la condition suivante doit être remplie:
Par conséquent:
Comme votre balise recherche un algorithme
C
, écrivons-en un très rapidement:Il s'agit d'une implémentation assez basique de la méthode de Newton. Notez que je continue de diminuer de moitié la supposition initiale jusqu'à ce que la condition dont nous avons parlé plus tôt soit satisfaite. J'essaie également de trouver la racine carrée de 5. Nous savons que cela est à peu près égal à 2,236 environ. L'utilisation du code ci-dessus donne la sortie suivante:
Comme vous pouvez le voir, la seule chose qui est différente est le nombre d'itérations nécessaires pour calculer la racine carrée. Plus le nombre de ce que vous voulez calculer est élevé, plus il faudra d'itérations.
Je sais que cette méthode a déjà été suggérée dans un article précédent, mais je me suis dit que je dériverais la méthode et fournirais du code!
la source
oui, une série de puissances peut rapidement et efficacement se rapprocher de la fonction racine carrée, et uniquement sur un domaine limité. plus le domaine est large, plus vous aurez besoin de termes dans votre série de puissance pour maintenir l'erreur suffisamment faible.
où
s'il s'agit d'une virgule flottante, vous devez séparer l'exposant et la mantisse comme mon code C le fait dans l'autre réponse.
la source
En fait, cela se fait en résolvant une équation quadratique en utilisant la méthode de Newton:
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Pour les nombres supérieurs à un, vous pouvez utiliser l'extension Taylor suivante:
http://planetmath.org/taylorexpansionofsqrt1x
la source
Une expansion de racine carrée qui m'a intrigué dans le passé est celle de l'ampleur complexe (ou diagonale dans un rectangle); sia > b , puis:
Dans une précision de 4%, si je me souviens bien. Il a été utilisé par les ingénieurs, avant les règles logarithmiques et les calculatrices. Je l'ai appris dans Notes et formules de l'ingénieur, De Laharpe , 1923
la source