Inscription / Connexion Nouveau Sujet
Niveau terminale
Partager :

formule de l'arc cosinus

Posté par
charly
14-08-07 à 01:32

bonsoir

Pour situer un peu le problème : je suis en train de programmer un casse brique (en JAVA) dans un environnement très light où il n'existe pas de fonction "acos". J'ai donc besoin de la coder à la main. Or je n'arrive pas à obtenir de bons résultats. Est ce que vous voyez une erreur ?

la formule trouvé sur http://serge.mehl.free.fr/anx/Arcsincos.html :
-\frac{1}{\sqrt{1-x^2}}

Pour un acos de 0.5403023 on devrait avoir un angle de 1 radian (ou 57.29 en degré), mais à la place j'ai :
radian -1.1883951004567959
degré  -68.0900236501999

A la base si j'utilise cette formule c'est pour avoir l'angle entre deux vecteurs. Le but c'est de faire rebondir la balle sur une brique, et donc de chercher à calculer le vecteur réfléchi à partir du vecteur de la balle. Il se trouve que le produit scalaire nous donne le cos x entre deux vecteurs. Mais ce n'est que la première étape maintenant j'ai besoin de trouver un angle pour faire la rotation du vecteur.

merci d'avance

Charly


mon code :

cosx = 0.5403023;
acosx = -1/Math.sqrt(1-cosx*cosx);
System.out.println("0.5403023 acosx in radian"+acosx);
System.out.println("0.5403023 acosx in degree"+Math.toDegrees(acosx));

Posté par
Nicolas_75 Correcteur
re : formule de l'arc cosinus 14-08-07 à 02:39

Bonjour,

La page http://serge.mehl.free.fr/anx/Arcsincos.html ne dit pas que \arccos x=-\frac{1}{\sqrt{1-x^2}}, mais que sa dérivée est égale à cette expression. "En gros", la dérivée est la fonction qui, à x, associe le coefficient directeur de la tangente à la représentation graphique au point d'abscisse x.

Citation :
je suis en train de programmer un casse brique (en JAVA) dans un environnement très light


Dans ce cas, le plus efficace n'est-il pas d'utiliser un grand tableau de valeurs donnant, pour 1000 valeurs de x entre -1 et +1, leur arccos ? Ce tableau serait lu dans un fichier à l'ouverture du logiciel. Ce n'est qu'une idée.

Cordialement,

Nicolas

Posté par
jamo Moderateur
re : formule de l'arc cosinus 14-08-07 à 08:33

Bonjour,

ou alors, tu résouds numériquement l'équation cos(x)=a, puisque tu connais a et que tu cherches x.

Par exemple la méthode de Newton ...

Posté par
J-P Posteur d'énigmes
re : formule de l'arc cosinus 14-08-07 à 08:52

Ou tu utilises un développement limité.

arccos(x) = Pi/2 - x - (1/6)*x^3  - (3/40)*x^5  - (15/336)*x^7

Cela devrait ne pas être mauvais si les angles ne sont pas trop grands.

Posté par
charly
re : formule de l'arc cosinus 14-08-07 à 16:42

Yeah je m'attendais pas à autant de réponse en si peu de tps

Nicolas_75 ta méthode est vraiment la plus efficace Mais comme je sais que l'espace mémoire est critique sur un mobile je vais éviter d'embarquer des fichiers de ressources (pour le principe).

merci jamo pour la suggestion de la méthode de Newton. J'aurais appris des choses

Enfin J-P j'ai vraiment aimé ta solution, c'est rapide à mettre en place, ne demande pas trop de dépense d'énergie par le CPU, pas du tout d'espace mémoire. Bon ce n'est qu'une approximation mais ça devrait suffire. MErci ^^

thx to all

Charly

Posté par
Nicolas_75 Correcteur
re : formule de l'arc cosinus 14-08-07 à 17:16

charly,

Je suis programmeur Java moi aussi, mais pas sur mobile.

Je précise un peu ma pensée. J'avais carrément en tête quelque chose d'aussi brutal et codé en dur que (en SE) :

Citation :
public class Test {

public static final double[] ARCCOS = new double[] {
1.570796327,
1.56079616, 1.550794993, 1.540791825, 1.530785652, 1.52077547, 1.510760268, 1.500739034, 1.490710747, 1.480674382, 1.470628906,
1.460573277, 1.450506444, 1.440427347, 1.430334912, 1.420228054, 1.410105674, 1.399966658, 1.389809876, 1.37963418, 1.369438406,
1.359221367, 1.348981856, 1.338718644, 1.328430476, 1.318116072, 1.307774124, 1.297403295, 1.287002218, 1.276569489, 1.266103673,
1.255603294, 1.24506684, 1.234492752, 1.223879429, 1.213225223, 1.202528433, 1.191787306, 1.18100003, 1.170164734, 1.159279481,
1.148342265, 1.137351007, 1.12630355, 1.115197653, 1.104030988, 1.092801128, 1.081505549, 1.070141614, 1.058706574, 1.047197551,
1.035611537, 1.023945376, 1.012195761, 1.000359217, 0.988432089, 0.976410527, 0.964290472, 0.952067636, 0.939737486, 0.927295218,
0.914735736, 0.902053624, 0.889243115, 0.876298061, 0.86321189, 0.849977566, 0.836587539, 0.823033692, 0.809307274, 0.79539883,
0.781298117, 0.766994008, 0.752474376, 0.737725968, 0.722734248, 0.707483212, 0.691955175, 0.67613051, 0.659987329, 0.643501109,
0.626644212, 0.609385308, 0.591688642, 0.573513104, 0.554811033, 0.535526654, 0.515594006, 0.494934126, 0.473451157, 0.451026812,
0.427512265, 0.402715842, 0.376383482, 0.348166021, 0.317560429, 0.283794109, 0.245565518, 0.200334842, 0.141539473, 0
};


public static double arccos(double value) {
// vérifier que bien compris entre -1 et +1
if (value<0) return Math.PI-arccos(-value);
if (value==1) return 0;
int i1 = (int) Math.floor(100*value);
int i2 = i1+1;
return ARCCOS[i1]+(100*value-i1)/(i2-i1)*(ARCCOS[i2]-ARCCOS[i1]);
}


public static void demo(double value) {
System.out.println("Pour arcos("+value+"), cette méthode donne "
+arccos(value)+" alors que la valeur \"exacte\" est "+Math.acos(value));
}

public static void main(String[] args){
demo(-1);
demo(-0.345);
demo(0);
demo(0.567);
demo(1);
}
}


qui donne :

Citation :
Pour arcos(-1.0), cette méthode donne 3.141592653589793 alors que la valeur "exacte" est 3.141592653589793
Pour arcos(-0.345), cette méthode donne 1.9230403275897932 alors que la valeur "exacte" est 1.9230351118919613
Pour arcos(0.0), cette méthode donne 1.570796327 alors que la valeur "exacte" est 1.5707963267948966
Pour arcos(0.567), cette méthode donne 0.9679264885 alors que la valeur "exacte" est 0.9679370804057764
Pour arcos(1.0), cette méthode donne 0.0 alors que la valeur "exacte" est 0.0


La précision est très bonne. Donc on peut se contenter d'un tableau plus petit.

Mais ce genre de solutions ne convient peut-être pas pour un mobile.

Bon développement,

Nicolas

Posté par
charly
re : formule de l'arc cosinus 14-08-07 à 21:33

Une interpolation linéaire j'y ai pas pensé ! merci
Une remarque peut être : la division de l'expression 100*val-1 par i2-i1 est inutile.

Citation :
Mais ce genre de solutions ne convient peut-être pas pour un mobile.

> c'est pas 100 valeurs qui vont remplir tte la mémoire lol. 1000 ça paraissait un peu lourd surtout si c'est hardcodé, mais l'idée de l'approximation linéaire c'est carrément génial ^^

bon développement à toi aussi

Charly

Posté par
Nicolas_75 Correcteur
re : formule de l'arc cosinus 15-08-07 à 01:49

Pour ma part, je t'en prie.

Posté par
J-P Posteur d'énigmes
re : formule de l'arc cosinus 15-08-07 à 08:51

Dans ma réponse, remplacer :

Citation :
Cela devrait ne pas être mauvais si les angles ne sont pas trop grands.


par

Citation :
Cela devrait ne pas être mauvais si les angles ne sont pas trop petits.


Posté par
J-P Posteur d'énigmes
re : formule de l'arc cosinus 15-08-07 à 09:29

Remarque:
Le jeu (casse brique) ne devrait pas exiger une grande précision sur la valeur de l'angle.

Si on veut traiter aussi les angles petits, on peut faire ceci:

si |x| < 0,85, alors arcos(x) = Pi/2 - x - (1/6)*x^3 - (3/40)*x^5 - (15/336)*x^7
                               sinon si x > 0, alors arcos(x) = racine carrée de (1-x²)
                         .                                        sinon arcos(x) = Pi - racine carrée de (1-x²)

Le résultat est alors celui-ci:
en mauve arccos(x) et en bleu le résultat de la proposition ci-dessus.
(quand on ne voit que du mauve, c'est parce que les courbes se recouvrent à mieux qu'à l'épaisseur du trait.

formule de l\'arc cosinus

En fonction de la précision nécessaire sur la valeur du arccos, on peut évidemment envisager de virer le terme en x^7 de l'expression.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !