Overview
1°) Addition & Subtraction
2°) Multiplication
3°) Reciprocal
4°) Rectangular-Polar Conversion
5°) Polar-Rectangular Conversion
6°) Exponential
7°) Logarithm
8°) Raising a Quaternion to a Power
a) Real Exponent
b) Quaternion Exponent
9°) Hyperbolic Functions
a) Sinh q
b) Cosh q
c) Tanh q
10°) Inverse Hyperbolic Functions
a) ArcSinh q
b) ArcCosh q
c) ArcTanh q
11°) Trigonometric Functions
a) Sin q
b) Cos q
c) Tan q
12°) Inverse Trigonometric Functions
a) ArcSin q
b) ArcCos q
c) ArcTan q
13°) Quaternion Polynomials
14°) Quaternion Equations
a) Program#1 f(q) =
q
b) Program#2 f(q) =
0
15°) Quaternions & Rotations
-A quaternion ( or hypercomplex number ) is an expression of the form
q = x + y i + z j + t k
where x , y , z , t are 4 real numbers and i , j
, k are 3 imaginary units without any linear relation between them.
-More precisely, a quaternion can be regarded as an element ( x , y
, z , t ) of H = R4
and 1 , i , j , k as the standard basis ( 1 , 0 , 0 , 0 ) (
0 , 1 , 0 , 0 ) ( 0 , 0 , 1 , 0 ) ( 0 , 0 , 0 , 1 )
-Addition and subtraction are defined like ordinary vectors, but the
multiplication is defined by the rules:
i.j = -j.i = k
j.k = -k.j = i and
i2 = j2 = k2 = -1
Therefore, the product of 2 quaternions is not commutative. But
it has the associative and distributive properties.
k.i = -i.k = j
-So, ( H , + , * ) is a non-commutative field.
>>>> Some of the following programs use Micro-code routines listed
in "A few M-Code Routines for the HP-41"
but alternative
"focal" programs are also given.
1°) Addition and Subtraction
Data Registers: R00: unused
• R01 = a •
R05 = a'
• R02 = b •
R06 = b' with q
= a + b.i + c.j + d.k
R01 thru R08 are to be initialized
• R03 = c •
R07 = c' and
q' = a' + b'.i + c'.j + d'.k
• R04 = d •
R08 = d'
Flag: F01 CF 01 = addition
SF 01 = subtraction
Subroutines: /
01 LBL "Q+Q"
02 RCL 04 03 RCL 08 04 FS? 01 05 CHS |
06 +
07 RCL 03 08 RCL 07 09 FS? 01 10 CHS |
11 +
12 RCL 02 13 RCL 06 14 FS? 01 15 CHS |
16 +
17 RCL 01 18 X<> 05 19 FS? 01 20 CHS |
21 ST+ 05
22 FS? 01 23 CHS 24 X<> 05 25 END |
( 41 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | / | t |
Z | / | z |
Y | / | y |
X | / | x |
with q + q' =
x + y.i + z.j + t.k ( if CF 01 )
or q - q'
= x + y.i + z.j + t.k ( if SF 01 )
Example: q = 2 - 3i + 4j - 7k and q' = 1 - 4i + 2j + 5k calculate q + q' and q - q'
2 STO 01 1 STO 05
CF 01 XEQ "Q+Q" yields 3
and SF 01 XEQ
"Q+Q" ( or R/S ) produces 1
-3 STO 02 -4 STO 06
RDN -7
RDN 1
4 STO 03 2 STO 07
RDN 6
RDN 2
-7 STO 04 5 STO 08
RDN -2
RDN -12
Thus q + q' = 3 -7i + 6j - 2k
and q - q' = 1 + i + 2j - 12k
2°) Multiplication of 2 Quaternions
Data Registers: R00: unused
• R01 = a •
R05 = a'
• R02 = b •
R06 = b' with q
= a + b.i + c.j + d.k
R01 thru R08 are to be initialized
• R03 = c •
R07 = c' and
q' = a' + b'.i + c'.j + d'.k
• R04 = d •
R08 = d'
Flags: /
Subroutines: /
-Synthetic registers M and N may of course be replaced by any other
unused registers,
but avoid registers usage conflict between "Q*Q" and other programs
when "Q*Q" is used as a subroutine.
01 LBL "Q*Q"
02 RCL 01 03 RCL 05 04 * 05 RCL 02 06 RCL 06 07 * 08 - 09 RCL 03 10 RCL 07 11 * 12 - 13 RCL 04 14 RCL 08 |
15 *
16 - 17 STO M 18 RCL 01 19 RCL 06 20 * 21 RCL 02 22 RCL 05 23 * 24 + 25 RCL 03 26 RCL 08 27 * 28 + |
29 RCL 04
30 RCL 07 31 * 32 - 33 STO N 34 RCL 01 35 RCL 08 36 * 37 RCL 04 38 RCL 05 39 * 40 + 41 RCL 02 42 RCL 07 |
43 *
44 + 45 RCL 03 46 RCL 06 47 * 48 - 49 RCL 01 50 RCL 07 51 * 52 RCL 03 53 RCL 05 54 * 55 + 56 RCL 02 |
57 RCL 08
58 * 59 - 60 RCL 04 61 RCL 06 62 * 63 + 64 0 65 X<> N 66 0 67 X<> M 68 END |
( 80 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | / | t |
Z | / | z |
Y | / | y |
X | / | x |
with q.q' = x + y.i + z.j + t.k
Example1: q = 2 - 3i + 4j - 7k and q' = 1 - 4i + 2j + 5k calculate q.q'
2 STO 01 1 STO 05
XEQ "Q*Q" yields 17
-3 STO 02 -4 STO 06
RDN 23
4 STO 03 2 STO 07
RDN 51
-7 STO 04 5 STO 08
RDN 13
Thus q.q' = 17 + 23i + 51j + 13k ( remark: q'.q = 17 - 45i -35j - 7k )
Example2:
A theorem states that if q = b.i + c.j + d.k
and q' = b'.i + c'.j +d'.k are 2 purely imaginary quaternions,
then the real part of q.q' is -U.U'
where U.U' is the dot product of the 3D-vectors
U(b;c;d) and U'(b';c';d')
and the components of the imaginary part of q.q'
are the 3 components of the cross product UxU'
-For instance, calculate the dot product and the cross product of the 2 vectors: U(2;-4;9) U'(3;8;-6)
0 STO 01
0 STO 05 XEQ "Q*Q"
gives 80
2 STO 02
3 STO 06
RDN -48
therefore U.U' = - 80
-4 STO 03
8 STO 07
RDN 39
and UxU' = ( -48 ; 39 ;
28 )
9 STO 04
-6 STO 08
RDN 28
-You can save several bytes if your HP-41 has the M-code routines
ST<>A CROSS Z*Z
01 LBL "Q*Q"
02 RCL 08 03 RCL 07 04 RCL 06 05 ST<>A 06 RCL 04 07 RCL 03 08 RCL 02 09 CROSS 10 ST<>A |
11 RCL 06
12 RCL 05 13 RCL 02 14 RCL 01 15 Z*Z 16 X<>Y 17 ST+ M 18 CLX 19 RCL 03 20 RCL 07 |
21 *
22 - 23 RCL 04 24 RCL 08 25 * 26 - 27 RCL 01 28 RCL 07 29 * 30 RCL 03 |
31 RCL 05
32 * 33 + 34 ST+ N 35 CLX 36 RCL 01 37 RCL 08 38 * 39 RCL 04 40 RCL 05 |
41 *
42 + 43 ST+ O 44 CLX 45 ENTER^ 46 ENTER^ 47 ST<>A 48 R^ 49 END |
( 65 bytes / SIZE 009 )
3°) Reciprocal of a Quaternion
Data Registers: /
Flags: /
Subroutines: /
01 LBL "1/Q"
02 R^ 03 X^2 04 STO M 05 X<> L 06 CHS 07 R^ 08 X^2 09 ST+ M 10 X<> L 11 CHS 12 R^ 13 X^2 14 ST+ M 15 X<> L 16 CHS 17 R^ 18 X^2 19 ST+ M 20 CLX 21 X<> M 22 ST/ L 23 ST/ Y 24 ST/ Z 25 ST/ T 26 X<> L 27 END |
( 48 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | d | t |
Z | c | z |
Y | b | y |
X | a | x |
L | / | µ2 |
with q = a + b.i + c.j + d.k
; 1/q = x + y.i + z.j + t.k and
µ = ( a2 + b2 + c2 + d2
)1/2 = the modulus of the quaternion q
Example: q = 2 - 3i + 4j - 7k evaluate 1/q
-7 ENTER^
4 ENTER^
-3 ENTER^
2 XEQ "1/Q" yields
0.0256
RDN 0.0385
RDN -0.0513
RDN 0.0897
thus 1/q = 0.0256 + 0.0385 i -0.0513
j + 0.0897 k ( rounded to 4D )
( L = µ2 = 78 )
Note: Here is a shorter program
to compute 1/q via rectangular-polar conversions:
01 LBL "1/Q"
02 XEQ "POL" 03 1/X 04 X<>Y 05 CHS 06 X<>Y 07 XEQ "REC" 08 END |
( 24 bytes / SIZE 000 )
-The results may be, however, slightly less accurate
4°) Rectangular-Polar conversion
-A quaternion q = x + y.i + z.j + t.k can also be defined by its modulus µ = ( x2 + y2 + z2 + t2 )1/2 and 3 angles A , B , C such that:
x = µ cos A
A = the amplitude of the quaternion
y = µ sin A cos B
B = the co-latitude of the quaternion
z = µ sin A sin B cos C
C = the longitude of the quaternion
t = µ sin A sin B sin C
-The 2 following programs perform these conversions and work in all
angular mode.
Data Registers: /
Flags: /
Subroutines: /
01 LBL "POL"
02 R^ 03 R^ 04 R-P 05 R^ 06 R-P 07 R^ 08 R-P 09 END |
( 17 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | t | C |
Z | z | B |
Y | y | A |
X | x | µ |
L | / | x |
Example: q = 2 - 3i + 4j - 7k ( in DEG mode )
-7 ENTER^
4 ENTER^
-3 ENTER^
2 XEQ "POL" gives
8.8318 = µ ( actually
781/2 )
RDN 76.9115 = A
RDN 110.4104 = B
RDN -60.2551 = C
5°) Polar-Rectangular conversion
Data Registers: /
Flags: /
Subroutines: /
01 LBL "REC"
02 P-R 03 RDN 04 P-R 05 RDN 06 P-R 07 R^ 08 R^ 09 END |
( 17 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | C | t |
Z | B | z |
Y | A | y |
X | µ | x |
Example: Find the rectangular form of the
quaternion q defined by: µ =
7 ; A = 41° ; B = 37° ; C = -168°
XEQ "DEG"
-168 ENTER^
37 ENTER^
41 ENTER^
7 XEQ "REC"
yields 5.2830
RDN 3.6677
RDN -2.7034
RDN -0.5746
thus q = 5.2830 + 3.6677 i
-2.7034 j -0.5746 k ( rounded to
4D )
6°) Natural Exponential of a Quaternion
-The exponential of a quaternion q is defined by the series exp
( q ) = 1 + q + q2/2! + q3/3! + ....... + qn/n!
+ ........
but the polar form provides a much faster way to compute eq
Data Registers: /
Flags: /
Subroutine: "REC"
01 LBL "E^Q"
02 DEG 03 R^ 04 R^ 05 R-P 06 R^ 07 R-P 08 R-D 09 R^ 10 E^X 11 XEQ "REC" 12 END |
( 24 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | d | t |
Z | c | z |
Y | b | y |
X | a | x |
with q = a + b.i + c.j + d.k ; eq = x + y.i + z.j + t.k
Example: q = 2 - 3i + 4j - 7k evaluate eq
-7 ENTER^
4 ENTER^
-3 ENTER^
2 XEQ "E^Q" produces
-5.0277
RDN -1.8884
RDN 2.5178
RDN -4.4062
and eq = -5.0277
-1.8884 i + 2.5178 j - 4.4062 k ( rounded
to 4D )
N.B:
ln ( eq ) is not always equal to q
( like ordinary complex numbers )
eq.eq' is not always
equal to eq+q'
-We can also use the following formula to compute exp(q)
exp( x + y i + z j + t k ) = ex [ cos m + ( sin m ).( y i + z j + t k )/m ] where m = ( y2 + z2 + t2 )1/2
-Lines 06 to 19 may be replaced by RDN
NORM LASTX X<>Y
where NORM is listed in "A few M-code
routines for the HP-41"
01 LBL "E^Q"
02 RAD 03 E^X 04 STO M 05 STO N 06 X<> T 07 ENTER^ |
08 X^2
09 STO O 10 X<> T 11 ENTER^ 12 X^2 13 ST+ O 14 X<> T |
15 ENTER^
16 X^2 17 ST+ O 18 X<> O 19 SQRT 20 COS 21 ST* N |
22 X<> L
23 X#0? 24 ST/ M 25 SIN 26 ST* M 27 X<> M 28 ST* T |
29 ST* Z
30 * 31 RCL N 32 CLA 33 DEG 34 END |
( 59 bytes / SIZE 000 )
-The results may be more accurate than those given by the first version.
7°) Natural Logarithm of a Quaternion
Data Registers: /
Flags: /
Subroutine: "POL"
01 LBL "LNQ"
02 DEG 03 XEQ "POL" 04 LN 05 RDN 06 D-R 07 P-R 08 RDN 09 P-R 10 R^ 11 R^ 12 END |
( 24 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | d | t |
Z | c | z |
Y | b | y |
X | a | x |
with q = a + b.i + c.j + d.k ; ln q = x + y.i + z.j + t.k
Example: q = 2 - 3i + 4j - 7k evaluate ln q
-7 ENTER^
4 ENTER^
-3 ENTER^
2 XEQ "LNQ" yields
2.1784
RDN -0.4681
RDN 0.6242
RDN -1.0923
ln q = 2.1784 -0.4681 i + 0.6242 j -1.0923
k ( once again rounded
to 4D )
The variant hereunder uses the formula:
Ln( x + y i + z j + t k ) = Ln ( x2 + y2 + z2 + t2 )1/2 + Atan2(m,x).( y i + z j + t k )/m where m = ( y2 + z2 + t2 )1/2
If m = 0 , ( y i + z j + t k )/m is replaced by i
-Lines 05 to 07 may be replaced by X^2
RCL Y X^2 + R^ X^2
+ SQRT STO O RCL M
01 LBL "LNQ"
02 STO M 03 RDN 04 STO N 05 NORM 06 STO O 07 R^ |
08 ST* M
09 RAD 10 R-P 11 DEG 12 CLX 13 RCL O 14 X#0? |
15 GTO 00
16 SIGN 17 STO N 18 LBL 00 19 / 20 RCL N 21 X<>Y |
22 ST* T
23 ST* Z 24 * 25 RCL O 26 X^2 27 ST+ M 28 X<> M |
29 SQRT
30 LN 31 CLA 32 END |
( 54 bytes / SIZE 000 )
8°) Raising a Quaternion to a power
a) Real
exponent
Data Register: • R00 =
r is to be initialized before executing Q^R
Flags: /
Subroutines: "POL" "REC"
01 LBL "Q^R"
02 XEQ "POL" 03 X<>Y 04 X<> 00 05 ST* 00 06 Y^X 07 LASTX 08 X<> 00 09 X<>Y 10 XEQ "REC" 11 END |
( 30 bytes / SIZE 001 )
STACK | INPUTS | OUTPUTS |
T | d | t |
Z | c | z |
Y | b | y |
X | a | x |
with q = a + b.i + c.j + d.k
; qr = x + y.i + z.j + t.k
Example1: q = 2 - 3i + 4j - 7k evaluate q3.14
3.14 STO 00
-7 ENTER^
4 ENTER^
-3 ENTER^
2 XEQ "Q^R"
yields -445.8830
RDN 286.4187
RDN -381.8916
RDN 668.3104
therefore q3.14 = - 445.8830
+ 286.4187 i - 381.8916 j + 668.3104 k
( to 4D )
Example2: q = 2 - 3i + 4j - 7k calculate one cube root of q i-e q1/3
3 1/X STO 00
-7 ENTER^
4 ENTER^
-3 ENTER^
2 XEQ "Q^R"
yields 1.8635
RDN -0.3119
RDN 0.4159
RDN -0.7278 thus
q1/3 = 1.8635 - 0.3119 i + 0.4159
j - 0.7278 k ( 4D )
Notes:
-A non-zero quaternion has in general n n-th roots.
-However, -1 has
an infinity of square roots! Namely,
if b2 + c2 + d2 = 1 then
( b.i + c.j + d.k )2 = -1
-This program gives ( -1 )1/2 = i
b) Quaternion
exponent
-This program calculates qq' with the definition qq' = eq'.lnq
Data Registers: R00: unused
• R01 = a •
R05 = a'
• R02 = b •
R06 = b' with q
= a + b.i + c.j + d.k
R01 thru R08 are to be initialized
• R03 = c •
R07 = c' and
q' = a' + b'.i + c'.j + d'.k
• R04 = d •
R08 = d'
Flags: /
Subroutines: "LNQ" "E^Q" "Q*Q"
-When this program stops, registers R01 thru R04 contain q' and
registers R05 thru R08 contain ln q
01 LBL "Q^Q"
02 RCL 04 03 RCL 03 04 RCL 02 05 RCL 01 06 XEQ "LNQ" 07 X<> 05 08 STO 01 09 RDN 10 X<> 06 11 STO 02 12 RDN 13 X<> 07 14 STO 03 15 RDN 16 X<> 08 17 STO 04 18 XEQ "Q*Q" 19 XEQ "E^Q" 20 END |
( 44 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | / | t |
Z | / | z |
Y | / | y |
X | / | x |
with qq' = x + y.i + z.j + t.k
Example: q = 2 - 3i + 4j - 7k and q' = 1 - 4i + 2j + 5k calculate qq'
2 STO 01 1 STO 05
XEQ "Q^Q" yields
-45.8455
-3 STO 02 -4 STO 06
RDN 68.7134
4 STO 03 2 STO 07
RDN 8.2012
-7 STO 04 5 STO 08
RDN -39.0781
-Thus qq' = - 45.8455 + 68.7134 i + 8.2012 j - 39.0781 k ( rounded to 4D )
Note:
-One can also employ the definition qq' =
e(lnq).q' which is used by the routine hereafter.
01 LBL "Q^Q"
02 RCL 04 03 RCL 03 04 RCL 02 05 RCL 01 06 XEQ "LNQ" 07 STO 01 08 RDN 09 STO 02 10 RDN 11 STO 03 12 X<>Y 13 STO 04 14 XEQ "Q*Q" 15 XEQ "E^Q" 16 END |
( 36 bytes / SIZE 009 )
-With the same example: q = 2 - 3i + 4j - 7k and q' = 1 - 4i + 2j + 5k
2 STO 01 1 STO 05
XEQ "Q^Q" yields
-45.8455
-3 STO 02 -4 STO 06
RDN 18.3841
4 STO 03 2 STO 07
RDN -55.4506
-7 STO 04 5 STO 08
RDN -53.8808
-Thus qq' = - 45.8455 + 18.3841
i - 55.4506 j - 53.8808 k ( rounded to
4D )
9°) Hyperbolic Functions
a) Sinh
q
Formula: Sinh
( x + y i + z j + t k ) = Sinh x Cos m + ( Cosh x Sin
m )( y i + z j + t k )/m where m =
( y2 + z2 + t2 )1/2
Data Registers: /
Flags: /
Subroutines: /
-Lines 03 to 11 may be replaced by
E^X-1 X<>
L ST- M 2
ST/ N X^2
ENTER^ X<> T
ST+ O
STO M CHS
ST+ N ST+ N X<>
T STO O
X^2
ENTER^ X<> O
STO N E^X-1
CLX ST/ M
ENTER^ X<> T ST+
O X^2
SQRT
01 LBL "SHQ"
02 DEG 03 SINH 04 STO M 05 X<> L 06 COSH |
07 STO N
08 RDN 09 NORM 10 LASTX 11 X<>Y 12 X#0? |
13 ST/ N
14 R-D 15 COS 16 ST* M 17 X<> L 18 SIN |
19 ST* N
20 X<> N 21 ST* T 22 ST* Z 23 * 24 RCL M |
25 CLA
26 END |
( 48 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With Sinh ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
5 ENTER^
4 ENTER^
3 ENTER^
2 XEQ "SHQ" >>>> 2.5582
--- In 3 seconds ---
RDN 1.1315
RDN 1.5086
RDN 1.8858
Sinh ( 2 + 3 i + 4 j + 5 k ) = 2.5582 + 1.1315
i + 1.5086 j + 1.8858 k ( rounded to 4D
)
b) Cosh
q
Formula:
Cosh ( x + y i + z j + t k ) = Cosh x Cos m + ( Sinh x
Sin m )( y i + z j + t k )/m where
m = ( y2 + z2 + t2 )1/2
Data Registers: /
Flags: /
Subroutines: /
-Lines 03 to 11 may be replaced by
E^X-1 X<>
L ST+ M 2
ST/ N X^2
ENTER^ X<> T
ST+ O
STO M CHS
ST- N ST+ M
X<> T STO O
X^2
ENTER^ X<> O
STO N E^X-1
CLX ST/ M
ENTER^ X<> T ST+
O X^2
SQRT
01 LBL "CHQ"
02 DEG 03 COSH 04 STO M 05 X<> L 06 SINH |
07 STO N
08 RDN 09 NORM 10 LASTX 11 X<>Y 12 X#0? |
13 ST/ N
14 R-D 15 COS 16 ST* M 17 X<> L 18 SIN |
19 ST* N
20 X<> N 21 ST* T 22 ST* Z 23 * 24 RCL M |
25 CLA
26 END |
( 48 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With Cosh ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
5 ENTER^
4 ENTER^
3 ENTER^
2 XEQ "CHQ" >>>> 2.6537
--- In 3 seconds ---
RDN 1.0908
RDN 1.4543
RDN 1.8179
Cosh ( 2 + 3 i + 4 j + 5 k ) = 2.6537 + 1.0908
i + 1.4543 j + 1.8179 k ( rounded to 4D
)
c) Tanh
q
Tanh q is defined by Tanh q = ( Sinh q ) ( Cosh q
) -1
Data Registers: R00 unused R01 to R08:
temp
Flags: /
Subroutines: "SHQ" "CHQ" "1/Q"
"Q*Q"
01 LBL "THQ"
02 STO 01 03 R^ 04 STO 04 05 R^ 06 STO 03 |
07 R^
08 STO 02 09 R^ 10 XEQ "SHQ" 11 X<> 01 12 R^ |
13 X<> 04
14 R^ 15 X<> 03 16 R^ 17 X<> 02 18 R^ |
19 XEQ "CHQ"
20 XEQ "1/Q" 21 STO 05 22 RDN 23 STO 06 24 RDN |
25 STO 07
26 X<>Y 27 STO 08 28 XEQ "Q*Q" 29 END |
( 57 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With Tanh ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
4 ENTER^
3 ENTER^
2 ENTER^
1 XEQ "THQ" >>>> 1.0249
--- In 10 seconds ---
RDN -0.1023
RDN -0.1534
RDN -0.2046
Tanh ( 1 + 2 i + 3 j + 4 k ) = 1.0249 - 0.1023
i - 0.1534 j - 0.2046 k ( rounded to 4D
)
-The variant hereafter is faster ( 7 seconds instead of 10 ). It uses
the formula Tanh q = ( e2q - 1 ) ( e2q + 1
) -1
Data Registers: R00 unused R01 to R08:
temp
Flags: /
Subroutines: "E^Q" "1/Q" "Q*Q"
01 LBL "THQ"
02 ST+ X 03 R^ 04 ST+ X 05 R^ 06 ST+ X 07 R^ |
08 ST+ X
09 R^ 10 XEQ "E^Q" 11 STO 01 12 R^ 13 STO 04 14 R^ |
15 STO 03
16 R^ 17 STO 02 18 R^ 19 SIGN 20 ST* X 21 ST- 01 |
22 ST+ L
23 X<> L 24 XEQ "1/Q" 25 STO 05 26 RDN 27 STO 06 28 RDN |
29 STO 07
30 X<>Y 31 STO 08 32 XEQ "Q*Q" 33 END |
( 61 bytes / SIZE 009 )
10°) Inverse Hyperbolic Functions
a) ArcSinh
q
Formula:
ArcSinh q = Ln [ q + ( q2 + 1 )1/2 ]
Data Registers: R00 = 2 and then 1/2
Flags: /
Subroutines: "Q^R" "LNQ"
-Lines 15-16 may be replaced by X<> 00
SIGN ST+ 00 X<> L
01 LBL "ASHQ"
02 STO 00 03 CLX 04 2 05 X<> 00 06 STO M 07 R^ |
08 STO P
09 R^ 10 STO O 11 R^ 12 STO N 13 R^ 14 XEQ "Q^R" |
15 X+1
16 X<> 00 17 1/X 18 X<> 00 19 XEQ "Q^R" 20 ST+ M 21 X<> T |
22 RCL P
23 + 24 R^ 25 RCL O 26 + 27 R^ 28 RCL N |
29 +
30 RCL M 31 XEQ "LNQ" 32 CLA 33 END |
( 68 bytes / SIZE 001 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With ArcSinh ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
5 ENTER^
4 ENTER^
3 ENTER^
2 XEQ "ASHQ" >>>> 2.6837
--- In 14 seconds ---
RDN 0.5484
RDN 0.7313
RDN 0.9141
ArcSinh ( 2 + 3 i + 4 j + 5 k ) = 2.6837 + 0.5484
i + 0.7313 j + 0.9141 k ( rounded to 4D
)
b) ArcCosh
q
Formula:
ArcCosh q = Ln [ q + ( q + 1 )1/2 ( q - 1 )1/2 ]
Data Registers: R00 to R12: temp
Flags: /
Subroutines: "Q^R" "Q*Q" "LNQ"
01 LBL "ACHQ"
02 STO 00 03 STO 05 04 STO 09 05 CLX 06 SIGN 07 ST+ 00 08 ST- 05 09 ST+ X 10 1/X 11 X<> 00 |
12 R^
13 STO 08 14 STO 12 15 R^ 16 STO 07 17 STO 11 18 R^ 19 STO 06 20 STO 10 21 R^ 22 XEQ "Q^R" |
23 STO 01
24 R^ 25 STO 04 26 R^ 27 STO 03 28 R^ 29 STO 02 30 RCL 08 31 RCL 07 32 RCL 06 33 RCL 05 |
34 XEQ "Q^R"
35 STO 05 36 R^ 37 STO 08 38 R^ 39 STO 07 40 R^ 41 STO 06 42 XEQ "Q*Q" 43 ST+ 09 44 X<> T |
45 RCL 12
46 + 47 R^ 48 RCL 11 49 + 50 R^ 51 RCL 10 52 + 53 RCL 09 54 XEQ "LNQ" 55 END |
( 86 bytes / SIZE 013 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With ArcCosh ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
5 ENTER^
4 ENTER^
3 ENTER^
2 XEQ "ACHQ" >>>> 2.6916
--- In 16 seconds ---
RDN 0.5505
RDN 0.7340
RDN 0.9175
ArcCosh ( 2 + 3 i + 4 j + 5 k ) = 2.6916 + 0.5505 i + 0.7340 j + 0.9175 k ( rounded to 4D )
Note:
-This program returns the principal value of arccosh, but other definitions
are possible, for instance: arccosh q = Ln [ q + ( q2
- 1 )1/2 ]
-The following routine uses this formula.
-It's shorter and uses 1 data register instead of 13
-Lines 01 & 15 are the unique differences with "ASHQ"
-Lines 15-16 may be replaced by X<> 00
SIGN ST- 00 X<> L
01 LBL "ACHQ2"
02 STO 00 03 CLX 04 2 05 X<> 00 06 STO M 07 R^ |
08 STO P
09 R^ 10 STO O 11 R^ 12 STO N 13 R^ 14 XEQ "Q^R" |
15 X-1
16 X<> 00 17 1/X 18 X<> 00 19 XEQ "Q^R" 20 ST+ M 21 X<> T |
22 RCL P
23 + 24 R^ 25 RCL O 26 + 27 R^ 28 RCL N |
29 +
30 RCL M 31 XEQ "LNQ" 32 CLA 33 END |
( 69 bytes / SIZE 001 )
-The sign of the results will be different sometimes.
c) ArcTanh
q
Formula:
ArcTanh q = (1/2) [ Ln ( 1 + q ) - Ln ( 1 - q ) ]
Data Registers: /
Flags: /
Subroutines: "LNQ" ( first version
)
-Lines 20 to 23 may be replaced by R^ X<>
P R^ X<> O R^ X<>
N R^ X<> M
01 LBL "ATHQ"
02 R^ 03 STO P 04 CHS 05 R^ 06 STO O 07 CHS 08 R^ 09 STO N |
10 CHS
11 R^ 12 STO M 13 CHS 14 SIGN 15 ST*X 16 ST+ L 17 ST+ M 18 X<> L |
19 XEQ "LNQ"
20 ST<>A 21 R^ 22 X<> P 23 RDN 24 XEQ "LNQ" 25 ST- M 26 X<> T 27 RCL P |
28 -
29 R^ 30 RCL O 31 - 32 R^ 33 RCL N 34 - 35 2 36 ST/ T |
37 ST/ Z
38 ST/ M 39 / 40 RCL M 41 CHS 42 CLA 43 END |
( 79 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With ArcTanh ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
4 ENTER^
3 ENTER^
2 ENTER^
1 XEQ "ATHQ" >>>> 0.0323
--- In 7 seconds ---
RDN 0.5173
RDN 0.7760
RDN 1.0347
ArcTanh ( 1 + 2 i + 3 j + 4 k ) = 0.0323 + 0.5173
i + 0.7760 j + 1.0347 k ( rounded to 4D
)
11°) Trigonometric Functions
a) Sin q
Formula: Sin
( x + y i + z j + t k ) = Sin x Cosh m + ( Cos x Sinh
m )( y i + z j + t k )/m where m =
( y2 + z2 + t2 )1/2
Data Registers: /
Flags: /
Subroutines: /
-Lines 09 to 12 may be replaced by
X<> T
STO O X^2
ENTER^ X<> O
ENTER^ X<> T
ST+ O X^2
SQRT
X^2
ENTER^ X<> T ST+ O
-Lines 15 to 18 may be replaced by
E^X-1
CHS CLX
ST/ O X<>
P
STO O
E^X-1 SIGN
ST/ P
STO P
ST+ O ST+ X
X<> O
X<> L
ST- P ST+ O
ST* M
01 LBL "SINQ"
02 DEG 03 R-D 04 SIN 05 STO M 06 X<> L |
07 COS
08 STO N 09 RDN 10 NORM 11 LASTX 12 X<>Y |
13 X#0?
14 ST/ N 15 COSH 16 ST* M 17 X<> L 18 SINH |
19 ST* N
20 X<> N 21 ST* T 22 ST* Z 23 * 24 RCL M |
25 CLA
26 END |
( 49 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With Sin ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
1.2 ENTER^
1 ENTER^
0.8 ENTER^
0.6 XEQ "SINQ" >>>>
1.6816
--- Execution time = 3 seconds ---
RDN 1.0554
RDN 1.3192
RDN 1.5831
Sin ( 0.6 + 0.8 i + j + 1.2 k ) =
1.6816 + 1.0554 i + 1.3192 j + 1.5831 k
( rounded to 4D )
b) Cos q
Formula:
Cos ( x + y i + z j + t k ) = Cos x Cosh m - ( Sin x
Sinh m )( y i + z j + t k )/m where
m = ( y2 + z2 + t2 )1/2
Data Registers: /
Flags: /
Subroutines: /
-Lines 10 to 13 may be replaced by
X<> T
STO O X^2
ENTER^ X<> O
ENTER^ X<> T
ST+ O X^2
SQRT
X^2
ENTER^ X<> T ST+ O
-Lines 16 to 19 may be replaced by
E^X-1
CHS CLX
ST/ O X<>
P
STO O
E^X-1 SIGN
ST/ P
STO P
ST+ O ST+ X
X<> O
X<> L
ST- P ST+ O
ST* M
01 LBL "COSQ"
02 DEG 03 R-D 04 COS 05 STO M 06 X<> L |
07 SIN
08 CHS 09 STO N 10 RDN 11 NORM 12 LASTX |
13 X<>Y
14 X#0? 15 ST/ N 16 COSH 17 ST* M 18 X<> L |
19 SINH
20 ST* N 21 X<> N 22 ST* T 23 ST* Z 24 * |
25 RCL M
26 CLA 27 END |
( 50 bytes / SIZE 000 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With Cos ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
1.2 ENTER^
1 ENTER^
0.8 ENTER^
0.6 XEQ "COSQ" >>>>
2.4580
--- Execution time = 3 seconds ---
RDN -0.7220
RDN -0.9025
RDN -1.0831
Cos ( 0.6 + 0.8 i + j + 1.2 k ) =
2.4580 - 0.7220 i - 0.9025 j - 1.0831 k
( rounded to 4D )
c) Tan q
Formula:
Tan q = ( Sin q ) ( Cos q ) -1
Data Registers: /
Flags: /
Subroutines: "SINQ" "COSQ" "1/Q"
"Q*Q"
01 LBL "TANQ"
02 STO 01 03 R^ 04 STO 04 05 R^ 06 STO 03 |
07 R^
08 STO 02 09 R^ 10 XEQ "SINQ" 11 X<> 01 12 R^ |
13 X<> 04
14 R^ 15 X<> 03 16 R^ 17 X<> 02 18 R^ |
19 XEQ "COSQ"
20 XEQ "1/Q" 21 STO 05 22 RDN 23 STO 06 24 RDN |
25 STO 07
26 X<>Y 27 STO 08 28 XEQ "Q*Q" 29 END |
( 60 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With Tan ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
1 ENTER^
2 ENTER^
3 ENTER^
4 XEQ "TANQ" >>>
0.001113
--- Execution time = 10 seconds ---
RDN 0.8019
RDN 0.5346
RDN 0.2673
Tan ( 4 + 3 i + 2 j + k ) = 0.001113 + 0.8019
i + 0.5346 j + 0.2673 k
12°) Inverse Trigonometric Functions
a) ArcSin
q
Formula:
if q = x + y i + z j + t k
ArcSin q = - [ ( y i + z j + t k ) / m ] ArcSinh [ q ( y i + z j
+ t k ) / m ] where
m = ( y2 + z2 + t2 )1/2
Data Registers: R00 to R08: temp
Flags: /
Subroutines: "Q*Q" "ASHQ"
-Lines 09 to 12 may be replaced by R-P R^
STO 02 STO 06 R-P
01 LBL "ASINQ"
02 STO 01 03 R^ 04 STO 04 05 STO 08 06 R^ 07 STO 03 08 STO 07 |
09 R^
10 STO 02 11 STO 06 12 NORM 13 X#0? 14 GTO 00 15 SIGN 16 STO 06 |
17 LBL 00
18 ST/ 06 19 ST/ 07 20 ST/ 08 21 CLX 22 STO 05 23 XEQ "Q*Q" 24 XEQ "ASHQ" |
25 X<> 05
26 STO 01 27 RDN 28 X<> 06 29 CHS 30 STO 02 31 RDN 32 X<> 07 |
33 CHS
34 STO 03 35 X<>Y 36 X<> 08 37 CHS 38 STO 04 39 XEQ "Q*Q" 40 END |
( 72 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With ArcSin ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
5 ENTER^
4 ENTER^
3 ENTER^
2 XEQ "ASINQ" >>>> 0.2732
--- In 19 seconds ---
RDN 1.1419
RDN 1.5226
RDN 1.9032
ArcSin ( 2 + 3 i + 4 j + 5 k ) = 0.2732 + 1.1419
i + 1.5226 j + 1.9032 k ( rounded to 4D
)
b) ArcCos
q
Formula:
ArcCos q = PI/2 - ArcSin q
Data Registers: R00 to R08: temp
Flags: /
Subroutine: "ASINQ"
-Line 06 is an M-code function ( not X^2 )
-Lines 05-06 may be replaced by RAD SIGN
ASIN DEG
01 LBL "ACOSQ"
02 XEQ "ASINQ" 03 STO 00 04 CLX 05 PI 06 X/2 07 ST- 00 08 R^ 09 CHS 10 R^ 11 CHS 12 R^ 13 CHS 14 RCL 00 15 CHS 16 END |
( 34 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With ArcCos ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
5 ENTER^
4 ENTER^
3 ENTER^
2 XEQ "ACOSQ" >>>> 1.2976
--- In 19 seconds ---
RDN -1.1419
RDN -1.5226
RDN -1.9032
ArcCos ( 2 + 3 i + 4 j + 5 k ) = 1.2976 - 1.1419
i - 1.5226 j - 1.9032 k ( rounded to 4D
)
c) ArcTan
q
Formula:
if q = x + y i + z j + t k
ArcTan q = - [ ( y i + z j + t k ) / m ] ArcTanh [ q ( y i + z j
+ t k ) / m ] where
m = ( y2 + z2 + t2 )1/2
Data Registers: R00 to R08: temp
Flags: /
Subroutines: "Q*Q" "ATHQ"
-Lines 09 to 12 may be replaced by R-P R^
STO 02 STO 06 R-P
01 LBL "ATANQ"
02 STO 01 03 R^ 04 STO 04 05 STO 08 06 R^ 07 STO 03 08 STO 07 |
09 R^
10 STO 02 11 STO 06 12 NORM 13 X#0? 14 GTO 00 15 SIGN 16 STO 06 |
17 LBL 00
18 ST/ 06 19 ST/ 07 20 ST/ 08 21 CLX 22 STO 05 23 XEQ "Q*Q" 24 XEQ "ATHQ" |
25 X<> 05
26 STO 01 27 RDN 28 X<> 06 29 CHS 30 STO 02 31 RDN 32 X<> 07 |
33 CHS
34 STO 03 35 X<>Y 36 X<> 08 37 CHS 38 STO 04 39 XEQ "Q*Q" 40 END |
( 72 bytes / SIZE 009 )
STACK | INPUTS | OUTPUTS |
T | t | t' |
Z | z | z' |
Y | y | y' |
X | x | x' |
With ArcTan ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example:
5 ENTER^
4 ENTER^
3 ENTER^
2 XEQ "ATANQ" >>>> 1.5331
--- In 14 seconds ---
RDN 0.0558
RDN 0.0744
RDN 0.0930
ArcTan ( 2 + 3 i + 4 j + 5 k ) = 1.5331 + 0.0558
i + 0.0744 j + 0.0930 k ( rounded to 4D
)
13°) Quaternion Polynomials
-The routine hereunder evaluates: P(q) = An qn + An-1 qn-1 + ......... + A1 q + A0
where Ak = ak +
bk i + ck j + dk t and
q = x + y i + z j + t k are quaternions.
Data Registers: R00 thru R09: temp ( Registers Rbb thru Ree & Rbb' thru Ree' are to be initialized before executing "PLQ" )
• Rbb = an
• Rb+4 = an-1
.................................. • Re-3
= a0
• Rb+1 = bn •
Rb+5 = bn-1 ..................................
• Re-2 = b0
• Rb+2 = cn •
Rb+6 = cn-1 .................................
• Re-1 = c0
• Rb+3 = dn •
Rb+7 = dn-1 .................................
• Ree = d0
bb and bb' > 09
• Rbb' = x • Rbb'+1 = y • Rbb'+2 = z • Ree' = t ( ee' = bb' + 3 )
>>>> When the program stops, P(q) is in registers R01 R02 R03 R04 and q is also in registers R05 R06 R07 R08
Flags: /
Subroutine: "Q*Q"
-Lines 02 to 06 may be replaced by X<>Y STO
00 X<>Y STO 09 5 XEQ
"LCO" ( cf "Miscellaneous Short Routines" )
01 LBL "PLQ"
02 STO 09 03 5 04 LCO 05 X<>Y 06 STO 00 07 CLX 08 STO 01 |
09 STO 02
10 STO 03 11 STO 04 12 LBL 01 13 XEQ "Q*Q" 14 STO 01 15 CLX 16 RCL IND 00 |
17 ST+ 01
18 ISG 00 19 CLX 20 RCL IND 00 21 + 22 STO 02 23 ISG 00 24 CLX |
25 RCL IND 00
26 + 27 STO 03 28 ISG 00 29 CLX 30 RCL IND 00 31 + 32 STO 04 |
33 ISG 00
34 GTO 01 35 RCL 03 36 RCL 02 37 RCL 01 38 END |
( 61 bytes )
STACK | INPUTS | OUTPUTS |
T | / | t' |
Z | / | z' |
Y | bbb.eee | y' |
X | bbb'.eee' | x' |
Where bbb.eee = control number of the polynomial
P
All bbb's > 009 ( or bbb' = 005 )
bbb'.eee' = control number of the quaternion q = x + y i + z j +
t k
and P ( x + y i + z j + t k ) = x' + y' i + z' j + t' k
Example: P(q) = ( 2 + 3 i + 4 j + 5 k ) q3 + ( -1 + 2 i - 3 j + 4 k ) q2 + ( i + j + k ) q + 4 - 3 i - 5 j - 7 k Evaluate P( 6 - i - 2 j - 3 k )
If we store [ 2 3 4 5 -1 .....................
4 -3 -5 -7 ] into [ R10 R11 R12
.................. R25 ]
and
[ 6 -1 -2 -3 ] into [ R31 R32 R33
R34 ]
10.025 ENTER^
31.034 XEQ "PLQ" >>>> 2456
--- Execution time = 10s ---
RDN -222
RDN -159
RDN -894
-Thus, P( 6 - i - 2 j - 3 k ) = 2456 - 222 i -159 j -894 k
Note:
-The program may be simplified if you always use registers R05-R06-R07-R08
to store q
-In this case, delete lines 02 to 05 and place bbb.eee in X-register.
14°) Quaternion equation
a) Program#1
f(q) = q
-The following program uses an iterative method:
-The equation must be rewritten in the form: f (
q ) = q
and if f satisfies a Lipschitz condition
| f(q) - f(q') | < h | q - q' | with h <
1 , provided q and q' are close to the solution,
then the sequence qn+1 = f ( qn
) converges to a root.
Data Registers: • R00 = function name ( Registers R00 thru R04 are to be initialized before executing "SOLVE" )
• R01 = a
R09 to R12 also contain a ; b ; c ; d when
the subroutine is executed.
• R02 = b
R13 = function name too.
• R03 = c
• R04 = d
with q0 = a + b.i + c.j + d.k
= guess
Flags: /
Subroutine: the function f ( assuming
q = x + y.i + z.j + t.k is in registers R01 thru R04 , R09 thru R12
and in X- Y- Z- T-registers upon entry )
>>> f(q) = X + Y.i + Z.j + T.k must end up in the stack registers X , Y , Z , T
-Registers R00 thru R08 and R14 or greater can be used ( and altered
) to compute f(q)
-Registers R09 thru R13 can't be modified but can be used too.
-Line 05 , the real parts of the successive approximations are
displayed.
-To avoid a possible infinite loop, replace line 37 by the 2 instructions:
E-8
( or another "small" number )
X<Y?
-Or you can add RND after line 36
and the accuracy will be controlled by the display setting.
01 LBL "SOLVE"
02 RCL 00 03 STO 13 04 LBL 01 05 VIEW 01 06 RCL 04 07 STO 12 08 RCL 03 09 STO 11 |
10 RCL 02
11 STO 10 12 RCL 01 13 STO 09 14 XEQ IND 13 15 STO 01 16 ST- 09 17 RDN 18 STO 02 |
19 ST- 10
20 RDN 21 STO 03 22 ST- 11 23 X<>Y 24 STO 04 25 ST- 12 26 RCL 09 27 ABS |
28 RCL 10
29 ABS 30 RCL 11 31 ABS 32 RCL 12 33 ABS 34 + 35 + 36 + |
37 X#0?
38 GTO 01 39 RCL 13 40 STO 00 41 RCL 04 42 RCL 03 43 RCL 02 44 RCL 01 45 END |
( 62 bytes / SIZE 014 )
STACK | INPUTS | OUTPUTS |
T | / | t |
Z | / | z |
Y | / | y |
X | / | x |
with q = x + y.i + z.j + t.k = one solution ( x , y , z , t are also in registers R01 to R04 )
Example: Find a root of: q3 + ( 1 + 2.i + 3.j + 4.k ) q + ( 2 - 3.i + 4.j - 7.k ) = 0
-This equation can be put in the form q = f ( q ) in many ways
but, unfortunately, f doesn't necessarily satisfy the required Lipschitz
condition !
-Let's try: q = ( -1-2.i -3.j -4.k )-1
( q3 + 2 - 3.i + 4.j - 7.k ) = f(q)
we load the subroutine:
LBL "T"
STO 00
CLX
3
X<> 00
XEQ "Q^R"
STO 05
RDN
STO 06
RDN
STO 07
X<>Y
STO 08
2
ST+ 05
3
ST- 06
4
ST+ 07
7
ST- 08
4
CHS
3
CHS
2
CHS
1
CHS
XEQ "1/Q"
STO 01
RDN
STO 02
RDN
STO 03
X<>Y
STO 04
XEQ "Q*Q"
RTN
Then,
T ASTO 00
CLX STO 01 STO 02 STO 03
STO 04 ( if we choose q = 0 as initial value
)
XEQ "SOLVE"
The successive approximations are displayed:
0.000000000
0.666666666
0.873580246
.....................
.....................
and eventually:
0.808540975
---Execution time = 3mn34s---
RDN -1.290564600
RDN -0.290931374
RDN 0.490521464
whence q = 0.808540975 - 1.290564600 i
- 0.290931374 j + 0.490521464 k is a root of this polynomial.
Notes:
-Convergence may be slow.
-If f doesn't satisfy the required Lipschitz condition or if
we choose a bad initial guess, the algorithm may be divergent.
-The equation g(q) = 0 may be rewritten f(q) = q with f(q)
= q - µ g(q) where µ is constant. This may sometimes
lead to convergence.
-The last decimals may vary according to the first guess and/or the
method for computing f(q).
Exercise: Find a root of the equation:
k.ln q + q2 + i + j + k = 0
answer: A solution
is q = 0.791739122
- 0.754317889 i - 0.231635888 j - 0.844420665 k
b) Program#2
f(q) = 0
-The program listed hereunder uses the secant method to solve directly
f(q) = 0
-I'm not sure it's really sound theoretically...
-It requires 2 initial guesses q = a + b i + c j + d k and
q' = a' + b' i + c' j + d' k which are to be stored in registers
R01 thru R08
Data Registers: • R00 = function name ( Registers R00 thru R08 are to be initialized before executing "SOLVE2" )
•
R01 = a • R05
= a'
•
R02 = b • R06
= b'
q is also stored in R14 to R17
•
R03 = c • R07
= c'
q' is also stored in R18 to R21
R13 to R25: temp
•
R04 = d • R08
= d'
Flags: /
Subroutine:
-The function f must return f(q) = x' + y' i + z' j + t'
k in the stack registers X , Y , Z , T
assuming q = x + y i + z j + t k is registers X
, Y , Z , T and R01 thru R04 upon entry.
-Registers R00 thru R12 and R26 or greater can be used ( and altered ) to compute f(q) but without changing registers R13 to R25
-Lines 02-03 may be replaced by .008 ENTER^
13 XEQ "LCO" ( cf "Miscellaneous Short Routines" )
-Lines 92-93 may be replaced by 14.017 ENTER^
18 XEQ "LCO"
-Line 114 is a three-byte GTO 01
-Lines 116 to 128 are only useful to return | f(q) | in L-register
01 LBL "SOLVE2"
02 .013009 03 REGMOVE 04 RCL 08 05 STO 04 06 RCL 07 07 STO 03 08 RCL 06 09 STO 02 10 RCL 05 11 STO 01 12 XEQ IND 00 13 STO 22 14 RDN 15 STO 23 16 RDN 17 STO 24 18 X<>Y 19 STO 25 20 LBL 01 21 RCL 17 22 STO 04 23 RCL 16 24 STO 03 25 RCL 15 26 STO 02 27 RCL 14 28 STO 01 |
29 VIEW 01
30 XEQ IND 13 31 STO 09 32 RDN 33 STO 10 34 RDN 35 STO 11 36 X<>Y 37 STO 12 38 RCL 18 39 RCL 14 40 - 41 STO 01 42 RCL 19 43 RCL 15 44 - 45 STO 02 46 RCL 20 47 RCL 16 48 - 49 STO 03 50 RCL 21 51 RCL 17 52 - 53 STO 04 54 E-16 55 RCL 09 56 RCL 22 |
57 -
58 STO 05 59 X^2 60 RCL 23 61 RCL 10 62 - 63 STO 06 64 X^2 65 + 66 RCL 24 67 RCL 11 68 - 69 STO 07 70 X^2 71 + 72 RCL 25 73 RCL 12 74 - 75 STO 08 76 X^2 77 + 78 X<Y? 79 GTO 02 80 ST/ 05 81 ST/ 06 82 ST/ 07 83 ST/ 08 84 XEQ "Q*Q" |
85 STO 01
86 RDN 87 STO 02 88 RDN 89 STO 03 90 X<>Y 91 STO 04 92 14.018004 93 REGMOVE 94 RCL 09 95 STO 05 96 STO 22 97 RCL 10 98 STO 06 99 STO 23 100 RCL 11 101 STO 07 102 STO 24 103 RCL 12 104 STO 08 105 STO 25 106 XEQ "Q*Q" 107 ST+ 14 108 RDN 109 ST+ 15 110 RDN 111 ST+ 16 112 X<>Y |
113 ST+ 17
114 GTO 01 115 LBL 02 116 RCL 09 117 X^2 118 RCL 10 119 X^2 120 RCL 11 121 X^2 122 RCL 12 123 X^2 124 + 125 + 126 + 127 SQRT 128 SIGN 129 RCL 13 130 STO 00 131 RCL 17 132 STO 04 133 RCL 16 134 STO 03 135 RCL 15 136 STO 02 137 RCL 14 138 STO 01 139 END |
( 213 bytes / SIZE 026 )
STACK | INPUTS | OUTPUTS |
T | / | t |
Z | / | z |
Y | / | y |
X | / | x |
L | / | | f(q) | |
With q = x + y i + z j + t k is a solution of f(q) = 0 provided | f(q) | in L-register is "small"
Example: find a solution to q3 + ( 1 + 2 i + 3 j + 4 k ) q + ( 2 - 3 i + 4 j - 7 k ) = 0
-Load the following subroutine:
LBL "T" XEQ "Q^R"
STO 11 RCL
02 STO 08
3
ST+ 09 CLX
ST+ 09
RCL 10
STO 00 STO 09
X<>Y
STO 06 1
STO 03
RDN
7
RCL 12 3
CLX
RDN
STO 12 RCL
03 STO 01
4
ST+ 10 -
RCL 11
-
3
STO 10
RCL 01 STO
07 2
STO 04
RDN
ST+12 4
RCL 09
X<> 00 RDN
STO 05 RCL
04 STO 02
XEQ"Q*Q" ST+ 11
2
+
RTN
"T" ASTO 00
0 STO 01 STO 02
STO 03 STO 04
if you choose 0
0.1 STO 05 STO 06
STO 07 STO 08
and 0.1 + 0.1 i
+ 0.1 j + 0.1 k as initial guesses.
XEQ "SOLVE2" >>>> yields after ( too ) many iterations: ---Execution time = 25mn10s---
0.808540975 RDN -1.290564601 RDN -0.290931376 RDN 0.490521463 LASTX gives | f(q) | = 0.000000005
-So, a solution is q = 0.808540975 - 1.290564601 i - 0.290931376 j + 0.490521463 k
Note:
-In fact, when the subroutine is called, q is also in registers R14-R15-R16-R17
except at line 12.
-Add 14.018004 REGSWAP after line 19 and after
line 03 ( this is not absolutely necessary! )
-As you can see, the convergence is very slow and irregular.
-If you know a better method...
15°) Rotations and Quaternions
-Quaternions can describe the spin of elementary particles, and they are useful in geometry too:
-A vectorial rotation ( in space ) can be defined by an angle µ
and a 3D-vector
u(a;b;c)
-This rotation transforms a 3D-vector V(x;y;z) into
V'(x';y';z')
Formula: x'.i + y'.j + z'.k = q-1 ( x.i + y.j + z.k ) q where q = cos(µ/2) - sin(µ/2) ( a.i + b.j + c.k ) / ( a2 + b2 + c2 )1/2
-The following program deals with a rotation r defined by an angle µ , a point A(xA,yA,zA) and a vector u(a,b,c)
-It takes a point M(x,y,z) and returns M'(x',y',z') where
M' = r(M)
Data Registers: • R00 = µ ( Registers R00 thru R06 are to be initialized before executing "ROT" )
• R01 = xA • R02 = yA
• R03 = zA
• R04 = a • R05 = b
• R06 = c
R07 to R15 are used for temporary data storage
Flags: /
Subroutine: "Q*Q"
01 LBL "ROT"
02 1.009006 03 STO 15 04 REGMOVE 05 CLX 06 RCL 01 07 - 08 STO 06 09 CLX 10 RCL 02 11 - 12 STO 07 13 CLX 14 RCL 03 |
15 -
16 STO 08 17 CLX 18 STO 05 19 RCL 00 20 2 21 / 22 1 23 P-R 24 STO 01 25 CLX 26 RCL 12 27 STO 02 28 X^2 |
29 RCL 13
30 STO 03 31 X^2 32 RCL 14 33 STO 04 34 X^2 35 + 36 + 37 SQRT 38 / 39 ST* 02 40 ST* 03 41 ST* 04 42 XEQ "Q*Q" |
43 X<> 01
44 STO 05 45 RDN 46 X<> 02 47 CHS 48 STO 06 49 RDN 50 X<> 03 51 CHS 52 STO 07 53 X<>Y 54 X<> 04 55 CHS 56 STO 08 |
57 XEQ "Q*Q"
58 CLX 59 RCL 15 60 REGSWAP 61 CLX 62 RCL 03 63 ST+ T 64 CLX 65 RCL 02 66 ST+ Z 67 CLX 68 RCL 01 69 + 70 END |
( 104 bytes / SIZE 016 )
STACK | INPUTS | OUTPUTS |
Z | z | z' |
Y | y | y' |
X | x | x' |
Example: µ = 24°
A(2,3,7) U(4,6,9) Find
M' = r(M) if M(1,4,8)
24 STO 00
2 STO 01
4 STO 04
3 STO 02
6 STO 05
7 STO 03
9 STO 06
-Set the HP-41 in DEG mode
8 ENTER^
4 ENTER^
1 XEQ "ROT" >>>> 1.009250425
RDN 3.497956694 RDN 8.330584238
---Execution time = 6s ---
-Whence M'( 1.009250425 , 3.497956694
, 8.330584238 )
Note:
-The sign of the rotation-angle µ is determined by the right-hand
rule.