L'approximation de fonctions trigonométriques
- Je mettre en place asin, acos et atan dans l'environnement où j'ai seulement à la suite d'math tools:
- sine
- cosinus
- élémentaires point fixe de l'arithmétique (nombres à virgule flottante ne sont pas disponibles)
J'ai aussi déjà avoir raisonnablement bonne fonction racine carrée.
Puis-je utiliser celles à mettre en œuvre raisonnablement efficace des fonctions trigonométriques inverses?
Je n'ai pas besoin de trop grand de précision (les nombres en virgule flottante ont très peu de précision, de toute façon), de base rapprochement va faire.
Je suis déjà à moitié décidé d'aller avec la lecture de la table, mais je voudrais savoir s'il est plus propre de l'option (qui n'a pas besoin de plusieurs centaines de lignes de code pour mettre en œuvre les mathématiques de base).
EDIT:
Pour éclaircir les choses: j'ai besoin d'exécuter la fonction centaines de fois par trame à 35 images par seconde.
Le projet en double est plus sur la façon dont les fonctions trigonométriques de travail (comme c'est le titre). C'est sur les fonctions trigonométriques.
OriginalL'auteur Matěj Zábský | 2011-09-11
Vous devez vous connecter pour publier un commentaire.
Avez-vous besoin d'une grande précision pour
arcsin(x)
fonction? Si non, vous pouvez calculerarcsin
à N nœuds, et de garder les valeurs en mémoire. Je suggère d'utiliser la ligne de aproximation. six = A*x_(N) + (1-A)*x_(N+1)
puisx = A*arcsin(x_(N)) + (1-A)*arcsin(x_(N+1))
oùarcsin(x_(N))
est connu.OriginalL'auteur Eugeny89
En un point fixe de l'environnement (S15.16) j'ai utilisé avec succès l'algorithme CORDIC (voir Wikipedia pour une description générale) pour calculer atan2(y,x), dérivée asin() et acos() de l'utilisation bien connue fonctionnelle des identités qui impliquent la racine carrée:
Il s'avère que le fait de trouver une description utile du CORDIC itération pour atan2() sur le double est plus difficile que je pensais. Le site web suivant semble contenir une description suffisamment détaillée, et traite également de deux autres approches, approximation polynomiale et de tables de recherche:
http://ch.mathworks.com/examples/matlab-fixed-point-designer/615-calculate-fixed-point-arctangent
La raison pour laquelle je suggère à la recherche dans CORDIC est parce qu'il n'exige point fixe de l'arithmétique. L'utilisation la plus courante de CORDIC est probablement pour la mise en œuvre de sin / cos, qui est de savoir comment j'ai appris à ce sujet (en 1987). Mais un certain nombre d'autres fonctions peuvent être calculées avec CORDIC, comme atan2. Depuis je n'ai pas de code qui traînent pour le calcul de la atan2 avec CORDIC j'ai essayé de trouver un site avec suffisamment de détails pour que quelqu'un pourrait la base d'une mise en œuvre sur elle. Le lien que j'ai posté ci-dessus a été le meilleur de la page que j'ai pu trouver via un moteur de recherche dans l'espace de quelques minutes.
OriginalL'auteur njuffa
vous pouvez utiliser l'approximation: utiliser un série infinie jusqu'à ce que la solution est assez proche pour vous.
par exemple:
arcsin(z) = Sigma((2n!)/((2^2n)*(n!)^2)*((z^(2n+1))/(2n+1)))
où n dans [0,infinity)OriginalL'auteur amit
Peut-être une sorte de intelligent de la force brute comme newton rapson.
Donc, pour résoudre asin() vous y allez avec la plus raide descente sur le péché()
OriginalL'auteur aero
http://en.wikipedia.org/wiki/Inverse_trigonometric_functions#Expression_as_definite_integrals
Vous pourriez faire de l'intégration numérique avec votre fonction racine carrée, le rapprochement avec une série infinie:
Je viens de copier les images de wikipédia.
OriginalL'auteur nulvinge
Il devrait être facile à addapt le code suivant à point fixe. Il emploie un approximation rationnelle pour calculer l'arctangente normalisée à l' [0 1) intervalle (vous pouvez multiplier par Pi/2 pour obtenir le réel de l'arctangente). Ensuite, vous pouvez utiliser bien connu des identités pour obtenir le arcsin/arccos de l'arctangente.
L'erreur maximale est 0.1620 º
Dans le cas où vous avez besoin de plus de précision, il y a un 3ème ordre fonction rationnelle:
qui a un maximum de l'erreur d'approximation de 0.00811 º
OriginalL'auteur rcor
Soumettre ici ma réponse à partir de ce autre question similaire.
nVidia a quelques grandes ressources que j'ai utilisé pour mon propre usage, quelques exemples: acos asin atan2 etc etc...
Ces algorithmes produisent assez précise des résultats. Voici un tout droit jusqu'exemple Python avec leur code à copier coller:
Et voici les résultats pour la comparaison:
C'est à peu près! Multiplier par 57.29577951 pour obtenir des résultats en degrés, ce qui est également de leur "degrés" de la formule.
OriginalL'auteur Fnord
Utiliser une approximation polynomiale. La méthode des moindres carrés en forme est plus facile (Microsoft Excel) et de l'approximation de Chebyshev est plus précis.
Cette question a été abordée avant: Comment puis-fonctions Trigonométriques travail?
OriginalL'auteur Jason S
Seulement continue, les fonctions sont approximable par des polynômes. Et arcsin(x) est discontinu au point x=1.même arccos(x).Mais une réduction de l'intervalle 1,sqrt(1/2), dans ce cas, d'éviter cette situation. Nous avons arcsin(x)=pi/2 - arccos(x),arccos(x)=pi/2-arcsin(x).vous pouvez utiliser matlab pour minimax approximation.Approximatif seulement dans l'intervalle [0,sqrt(1/2)](si l'angle pour que arcsin est demande est plus grande que sqrt(1/2) trouver cos(x).la fonction arctangente que pour x<1.arctan(x)=pi/2-arctan(1/x).
OriginalL'auteur florin