Blog de Robert Sebille


Vers mon curriculum vitae - Conception

Accueil > Technique > Informatique > HP35S > Conversions polaires rectangulaires sans complexes.

Conversions polaires rectangulaires sans complexes.

dimanche 4 mai 2014, par Robert

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 x \iota y ou r \theta a, 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 \left[(RCL) X, (RCL) Y \right]).

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 :
MEM X=X, MEM Y=Y, MEM R(ectangulaire)=\left[X,Y\right].
- pour le polaire :
MEM D=D(istance), MEM A=A(ngle), MEM P(olaire)=\left[D,A\right]

Formule

On ne va pas réinventer la roue et utiliser les formules données sur Wikipedia :

  • Pour les coordonnées rectangulaires :
    • X=D \times cos(A)
    • Y=D \times sin(A)
  • Pour les coordonnées polaires :
    • D=\sqrt{X^2 + Y^2}
    • A=2 \times \arctan \left( Y \over {X+ \sqrt{X^2 + Y^2}} \right) = 2 \times \arctan \left( Y \over {X+ D} \right)

Pour A, il y aura cependant problème de division par 0 si Y=0\ ET\ X \le 0. En effet, Y=0, X=0 \Rightarrow 0+ \sqrt{0^2 + 0^2} = 0, et Y=0, X=-1 \Rightarrow -1+ \sqrt{-1^2 + 0^2} = -1 + 1 = 0.
Mais on pourra traiter ce cas simplement :
- Y=0\Rightarrow D=X
- Y=0, X=0\Rightarrow A=0
- Y=0, X \le 0 \Rightarrow A=180

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.
Reg.\ Y=coord.\ Y ou\ Distance.
Reg.\ X=coord.\ X ou\ Angle
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 Y=0\ ET\ X \le 0 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 -
Conversions polaires rectangulaires sans complexes - Version 1
Programme au format .ods
Conversions polaires rectangulaires sans complexes - Version 2
Programme au format .ods

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.