Accueil > Technique > Informatique > HP35S > Conversions polaires rectangulaires sans complexes.
Conversions polaires rectangulaires sans complexes.
dimanche 4 mai 2014, par
Programme libre de droits. Aucune garantie n’est apportée par l’auteur
sur la correction des résultats, ni sur quoique ce soit.
Ces programmes proposent des conversions polaire-rectangulaire et l’inverse, sans utiliser les nombres complexes. Ce qui facilitent certaines utilisations.
Pourquoi ces programmes ?
La HP35S propose un système de conversion rectangulaire - polaire (et sa réciproque) basée sur les nombres complexes ou
, leur représentation polaire ou rectangulaire dépendant uniquement d’un choix d’affichage. En soit, c’est efficace, mais ça complique certaines utilisations, car il n’est pas possible :
d’adresser individuellement une des 2 parties du nombre complexe ; elles sont dans des parties différentes des registres dynamiques de la pile, mais la calculatrice ne permet que d’adresser le registre dans son entier.
de les construire à partir des registres statiques (comme c’est le cas pourtant pour les vecteurs
).
Maintenant, j’avoue ne pas être très familiarisé avec les nombres complexes, mais ça ne fait pas mon affaire ;)
L’alternative
Elle consiste à gérer soi-même les conversions par les programmes ci-dessous et à utiliser, à la fois, les parties de vecteur entrées et sauvées individuellement dans des registres statiques, et les vecteurs eux-même, construits à partir de leurs parties et à leur tour sauvé dans des registres statiques. En clair, ça va donner :
pour le rectangulaire :
.
pour le polaire :
Formule
On ne va pas réinventer la roue et utiliser les formules données sur Wikipedia :
- Pour les coordonnées rectangulaires :
-
- Pour les coordonnées polaires :
-
Pour A, il y aura cependant problème de division par 0 si . En effet,
, et
.
Mais on pourra traiter ce cas simplement :
Programmes - Version 1
Lancement des programmes
Cette version prend ses entrées et écrit ses sorties dans les registres statiques D, A, X, Y, R, P. Attention, la calculatrice DOIT être en mode degré !
Polaire | Rectangulaire | ||||
---|---|---|---|---|---|
Distance | Angle | [D,A] | Coord. X | Coord. Y | [X,Y] |
D | A | P | X | Y | R |
Conversion polaire > Rectangulaire
D STO D : Distance
A STO A : Angle (en degrés)
XEQ R ENTER
Affichage :
RegX : [D,A]
RegY : [X,Y]
Résultat :
D STO D : Distance
A STO A : Angle (en degrés)
[D,A] STO P : le vecteur des coordonnées polaires est mis à jour
[X,Y] STO R : vecteur des coordonnées rectangulaires
Conversion rectangulaire > Polaire
X STO X : coordonnée X
Y STO Y : coordonnée Y
XEQ P ENTER
Affichage :
RegY : [X,Y]
RegX : [D,A]
Résultat :
D STO D : Distance
A STO A : angle (en degrés)
[X,Y] STO R : le vecteur des coordonnées rectangulaires est mis à jour
[D,A] STO P : vecteur des coordonnées polaires
Ces programmes modifient les registres de mémoire A, D, P, R, X, Y et l’état de F1 qui sera mis à false en finale.
Programme conversion polaire > Rectangulaire
CK | 3058 | LN=58 |
R001 | LBL R | Conversion polaire > rectangulaire |
R002 | RCL A | A pour angle |
R003 | COS | X = DxCOS(A) |
R004 | RCL D | D pour distance |
R005 | x | - |
R006 | STO X | On sauve X dans X |
R007 | RCL A | A pour angle |
R008 | SIN | X = DxSIN(A) |
R009 | RCL D | D pour distance |
R010 | x | - |
R011 | STO Y | On sauve Y dans Y |
R012 | [D,A] | On crée un vecteur [Distance, Angle] (et on met à jour les registres de LBL P) |
R013 | STO P | P pour polaire |
R014 | [X,Y] | On crée le vecteur [X, Y] |
R015 | STO R | R pour rectangulaire |
R016 | RTN | - |
Programme conversion rectangulaire > Polaire
CK | BCE1 | LN=125 |
P001 | LBL P | Conversion rectangulaire > polaire |
P002 | RCL Y | D=SQRT(X^2+Y^2) |
P003 | RCL X | - |
P004 | XEQ Z001 | Retourne SF 1 si X<=0 ET Y=0, sinon CF 1 |
P005 | FS 1 ? | - |
P006 | GTO P026 | X<=0 et Y=0. On saute les formules pour éviter une div par 0 |
P007 | x^2 | On poursuit la formule |
P008 | x<>y | - |
P009 | x^2 | - |
P010 | + | - |
P011 | SQRT(X) | - |
P012 | STO D | D pour distance. D=SQRT(X^2+Y^2) |
P013 | RCL X | A=2xATAN(Y/(X+D)) |
P014 | + | - |
P015 | RCL Y | - |
P016 | x<>y | - |
P017 | / | - |
P018 | ATAN | - |
P019 | 2 | - |
P020 | x | - |
P021 | x>=0 ? | - |
P022 | GTO P031 | Si A >= 0, on va vers son stockage dans A |
P023 | 360 | Si A est négatif, on ajoute 360 pour avoir un angle positif C’est plus joli ;) |
P024 | + | - |
P025 | GTO P031 | Une fois A >= 0, on va vers son stockage dans A |
P026 | CF 1 | On remet F1 à sa valeur par défaut |
P027 | RXL X | On traite le cas ou X<=0 et Y=0, pour éviter une div par 0 |
P028 | STO D | Si Y=0, D=X |
P029 | x<0 ? | SI Y=0 ET X=0, A=0 (qui est maintenant dans RegX) |
P030 | 180 | Si Y=0 ET X < 0, A= (toujours) 180 |
P031 | STO A | A=2xATAN(Y/(X+D)) |
P032 | [X,Y] | On crée un vecteur [X,Y] (et on met à jour les registres de LBL R) |
P033 | STO R | R pour rectangulaire |
P034 | [D,A] | On crée le vecteur [Distance, Angle] |
P035 | STO P | P pour polaire |
P036 | RTN | - |
Voir aussi : Sous-routine LBL Z
Programmes - Version 2
Lancement des programmes
Cette version prend ses entrées et écrit ses sorties dans les registres Y et X.
Attention, la calculatrice DOIT être en mode degré !
Polaire | Rectangulaire | ||||
---|---|---|---|---|---|
F2= 1 | F2 = 0 | F2= 1 | F2 = 0 | ||
Reg. X | Reg. X | Reg. Y | Reg. X | Reg. X | Reg. Y |
[Dist., Angle] | Angle | Distance | [X,Y] | Reg. X | Reg. Y |
Conversion polaire > rEctangulaire
RegY : Distance
RegX : Angle (en degrés)
XEQ E ENTER
Résultat :
RegY : Y
RegX : X
Si, F2 = true, RegX : [X,Y]. L’affichage est préparé pour les opérations avec un appel immédiatement précédent qui se trouvera alors dans RegY.
Conversion rectangulaire > pOlaire
RegY : Y
RegX : X
XEQ O ENTER
Résultat :
RegY : Distance
RegX : Angle (en degrés)
Si, F2 = true, RegX : [Distance, Angle]. L’affichage est préparé pour les opérations avec un appel immédiatement précédent qui se trouvera alors dans RegY.
Ces programmes modifient les registres de mémoire T, V, W, Z et l’état de F1 qui sera mis à false en finale. Suivant les choix, ce peut être pareil pour F2.
Programme conversion polaire > rEctangulaire
CK | 913C | LN=65 |
E001 | LBL E | Conversion polaire > rectangulaire |
E002 | STO W | - |
E003 | SIN | Y = DxSIN(A) |
E004 | x<>y | - |
E005 | STO V | D pour distance |
E006 | X | - |
E007 | STO Z | On sauve Y dans Z |
E008 | RCL W | A pour angle |
E009 | COS | X = DxCOS(A) |
E010 | RCL V | D pour distance |
E011 | X | - |
E012 | STO T | On sauve X dans T |
E013 | FS 2 ? | Si SF 2, on renvoie le vecteur [X,Y], plutôt que RegX, RegY |
E014 | GTO E016 | - |
E015 | RTN | - |
E016 | CF 2 | On remet F2 à 0 |
E017 | [T,Z] | On crée le vecteur [X, Y] |
E018 | R^ | On prépare l’affichage pour placer en Y le résultat d’un appel |
E019 | x<>y | immédiatement précédent đe LBL E (qui est resté dans le Reg T) |
E020 | RTN | - |
Programme conversion rectangulaire > pOlaire
CK | CC50 | LN=135 |
O001 | LBL O | Conversion rectangulaire > polaire version 2 |
O002 | STO V | - |
O003 | x<>y | - |
O004 | STO W | - |
O005 | x<>y | - |
O006 | XEQ Z001 | Retourne SF 1 si X<=0 ET Y=0, sinon CF 1 |
O007 | FS 1 ? | - |
O008 | GTO O029 | X<=0 et Y=0. On saute les formules pour éviter une div par 0 |
O009 | x^2 | On poursuit la formule |
O010 | x<>y | - |
O011 | x^2 | - |
O012 | + | - |
O013 | SQRT(X) | (D pour distance). D=SQRT(X^2+Y^2) |
O014 | ENTER | - |
O015 | STO T | - |
O016 | RCL V | - |
O017 | + | - |
O018 | RCL W | - |
O019 | x<>y | - |
O020 | / | - |
O021 | ATAN | - |
O022 | 2 | - |
O023 | x | A=2xATAN(Y/(X+D)) |
O024 | x>=0 ? | - |
O025 | GTO O033 | Si A >= 0, on va vers son stockage dans Z |
O026 | 360 | Si A est négatif, on ajoute 360 pour avoir un angle positif C’est plus joli ;) |
O027 | + | - |
O028 | GTO O033 | Une fois A >= 0, on va vers son stockage dans Z |
O029 | CF 1 | On remet F1 à sa valeur par défaut |
O030 | RCL V | On traite le cas ou X<=0 et Y=0, pour éviter une div par 0 |
O031 | x<0 ? | Si Y=0, D=X |
O032 | 180 | SI Y=0 ET X=0, A=0 (qui est maintenant dans RegX) |
O033 | STO Z | Si Y=0 ET X < 0, A= (toujours) 180 |
O034 | FS 2 ? | Si SF 2, on renvoie le vecteur [D,A], plutôt que RegX, RegY |
O035 | GTO O037 | - |
O036 | RTN | - |
O037 | [T,Z] | On crée le vecteur [Distance, Angle] |
O038 | R^ | On prépare l’affichage pour placer en Y le résultat d’un appel |
O039 | x<>y | immédiatement précédent đe LBL O (qui est resté dans le Reg T) |
O040 | CF 2 | On remet F2 à 0 |
O041 | RTN | - |
Voir aussi : Sous-routine LBL Z ci-dessous.
Sous-routine LBL Z
LBL Z est une sous-routine commune aux 2 versions et qui compare les registres de la pile pour les valeurs et met F1 à true si vrai, à false si faux.
CK | 76B7 | LN=27 |
Z001 | LBL Z | Compare si RegX <= 0 ET RegY = 0. Si vrai SF1, si faux CF1 |
Z002 | CF 1 | - |
Z003 | x<=0 ? | - |
Z004 | SF 1 | On met F1 à true provisoirement |
Z005 | x<>y | - |
Z006 | x !=0 ? | - |
Z007 | CF 1 | On remet F1 à false |
Z008 | x<>y | - |
Z009 | RTN | - |