eigenmath/62.c
2005-11-29 12:19:21 -07:00

344 lines
9.9 KiB
C

/* Compute $R_2$ the easy way, by eliminating $E^1$ and
$B^1$ with simple rotations. ($E^2$ also gets eliminated
because that is the easiest way to eliminate $B^1$.)
So what if there is some arbitrary rotation about the $x^1$ axis?
It will not affect $\beta$. Sample output:
$$ F = \left [ \matrix {
0 & 6 & -5 & 1 \cr
-6 & 0 & 4 & 2 \cr
5 & -4 & 0 & 3 \cr
1 & 2 & 3 & 0 \cr
} \right ] $$
$$ R_2 = \left [ \matrix {
0.408248 & -0.816497 & 0.408248 & 0 \cr
0.872872 & 0.218218 & -0.436436 & 0 \cr
0.267261 & 0.534522 & 0.801784 & 0 \cr
0 & 0 & 0 & 1 \cr
} \right ] $$
$$ R_2 F R_2^{-1} = \left [ \matrix {
0 & 8.55236 & -1.96396 & 0 \cr
-8.55236 & 0 & 0 & 0 \cr
1.96396 & 0 & 0 & 3.74166 \cr
0 & 0 & 3.74166 & 0 \cr
} \right ] $$ */
#include <stdio.h>
#include <math.h>
double E1 = 1.0;
double E2 = 1.0;
double E3 = 1.0;
double B1 = 0.0;
double B2 = 0.0;
double B3 = 0.0;
double F11, F12, F13, F14;
double F21, F22, F23, F24;
double F31, F32, F33, F34;
double F41, F42, F43, F44;
double R2_11, R2_12, R2_13, R2_14;
double R2_21, R2_22, R2_23, R2_24;
double R2_31, R2_32, R2_33, R2_34;
double R2_41, R2_42, R2_43, R2_44;
main()
{
F11 = 0.0; F12 = B3; F13 = -B2; F14 = E1;
F21 = -B3; F22 = 0.0; F23 = B1; F24 = E2;
F31 = B2; F32 = -B1; F33 = 0.0; F34 = E3;
F41 = E1; F42 = E2; F43 = E3; F44 = 0.0;
DeriveR2FromF();
check();
}
check()
{
double a11, a12, a13, a14;
double a21, a22, a23, a24;
double a31, a32, a33, a34;
double a41, a42, a43, a44;
double b11, b12, b13, b14;
double b21, b22, b23, b24;
double b31, b32, b33, b34;
double b41, b42, b43, b44;
/* R F */
a11 = R2_11 * F11 + R2_12 * F21 + R2_13 * F31 + R2_14 * F41;
a12 = R2_11 * F12 + R2_12 * F22 + R2_13 * F32 + R2_14 * F42;
a13 = R2_11 * F13 + R2_12 * F23 + R2_13 * F33 + R2_14 * F43;
a14 = R2_11 * F14 + R2_12 * F24 + R2_13 * F34 + R2_14 * F44;
a21 = R2_21 * F11 + R2_22 * F21 + R2_23 * F31 + R2_24 * F41;
a22 = R2_21 * F12 + R2_22 * F22 + R2_23 * F32 + R2_24 * F42;
a23 = R2_21 * F13 + R2_22 * F23 + R2_23 * F33 + R2_24 * F43;
a24 = R2_21 * F14 + R2_22 * F24 + R2_23 * F34 + R2_24 * F44;
a31 = R2_31 * F11 + R2_32 * F21 + R2_33 * F31 + R2_34 * F41;
a32 = R2_31 * F12 + R2_32 * F22 + R2_33 * F32 + R2_34 * F42;
a33 = R2_31 * F13 + R2_32 * F23 + R2_33 * F33 + R2_34 * F43;
a34 = R2_31 * F14 + R2_32 * F24 + R2_33 * F34 + R2_34 * F44;
a41 = R2_41 * F11 + R2_42 * F21 + R2_43 * F31 + R2_44 * F41;
a42 = R2_41 * F12 + R2_42 * F22 + R2_43 * F32 + R2_44 * F42;
a43 = R2_41 * F13 + R2_42 * F23 + R2_43 * F33 + R2_44 * F43;
a44 = R2_41 * F14 + R2_42 * F24 + R2_43 * F34 + R2_44 * F44;
/* R F R^-1 */
b11 = a11 * R2_11 + a12 * R2_12 + a13 * R2_13 - a14 * R2_14;
b12 = a11 * R2_21 + a12 * R2_22 + a13 * R2_23 - a14 * R2_24;
b13 = a11 * R2_31 + a12 * R2_32 + a13 * R2_33 - a14 * R2_34;
b14 = -a11 * R2_41 - a12 * R2_42 - a13 * R2_43 + a14 * R2_44;
b21 = a21 * R2_11 + a22 * R2_12 + a23 * R2_13 - a24 * R2_14;
b22 = a21 * R2_21 + a22 * R2_22 + a23 * R2_23 - a24 * R2_24;
b23 = a21 * R2_31 + a22 * R2_32 + a23 * R2_33 - a24 * R2_34;
b24 = -a21 * R2_41 - a22 * R2_42 - a23 * R2_43 + a24 * R2_44;
b31 = a31 * R2_11 + a32 * R2_12 + a33 * R2_13 - a34 * R2_14;
b32 = a31 * R2_21 + a32 * R2_22 + a33 * R2_23 - a34 * R2_24;
b33 = a31 * R2_31 + a32 * R2_32 + a33 * R2_33 - a34 * R2_34;
b34 = -a31 * R2_41 - a32 * R2_42 - a33 * R2_43 + a34 * R2_44;
b41 = a41 * R2_11 + a42 * R2_12 + a43 * R2_13 - a44 * R2_14;
b42 = a41 * R2_21 + a42 * R2_22 + a43 * R2_23 - a44 * R2_24;
b43 = a41 * R2_31 + a42 * R2_32 + a43 * R2_33 - a44 * R2_34;
b44 = -a41 * R2_41 - a42 * R2_42 - a43 * R2_43 + a44 * R2_44;
if (fabs(b11) < 1e-6) b11 = 0.0;
if (fabs(b12) < 1e-6) b12 = 0.0;
if (fabs(b13) < 1e-6) b13 = 0.0;
if (fabs(b14) < 1e-6) b14 = 0.0;
if (fabs(b21) < 1e-6) b21 = 0.0;
if (fabs(b22) < 1e-6) b22 = 0.0;
if (fabs(b23) < 1e-6) b23 = 0.0;
if (fabs(b24) < 1e-6) b24 = 0.0;
if (fabs(b31) < 1e-6) b31 = 0.0;
if (fabs(b32) < 1e-6) b32 = 0.0;
if (fabs(b33) < 1e-6) b33 = 0.0;
if (fabs(b34) < 1e-6) b34 = 0.0;
if (fabs(b41) < 1e-6) b41 = 0.0;
if (fabs(b42) < 1e-6) b42 = 0.0;
if (fabs(b43) < 1e-6) b43 = 0.0;
if (fabs(b44) < 1e-6) b44 = 0.0;
printf(" $$ F = \\left [ \\matrix { \n");
printf(" %15g & %15g & %15g & %15g \\cr \n", F11, F12, F13, F14);
printf(" %15g & %15g & %15g & %15g \\cr \n", F21, F22, F23, F24);
printf(" %15g & %15g & %15g & %15g \\cr \n", F31, F32, F33, F34);
printf(" %15g & %15g & %15g & %15g \\cr \n", F41, F42, F43, F44);
printf(" } \\right ] $$ \n");
printf(" $$ R_2 = \\left [ \\matrix { \n");
printf(" %15g & %15g & %15g & %15g \\cr \n", R2_11, R2_12, R2_13, R2_14);
printf(" %15g & %15g & %15g & %15g \\cr \n", R2_21, R2_22, R2_23, R2_24);
printf(" %15g & %15g & %15g & %15g \\cr \n", R2_31, R2_32, R2_33, R2_34);
printf(" %15g & %15g & %15g & %15g \\cr \n", R2_41, R2_42, R2_43, R2_44);
printf(" } \\right ] $$ \n");
printf(" $$ R_2 F R_2^{-1} = \\left [ \\matrix { \n");
printf(" %15g & %15g & %15g & %15g \\cr \n", b11, b12, b13, b14);
printf(" %15g & %15g & %15g & %15g \\cr \n", b21, b22, b23, b24);
printf(" %15g & %15g & %15g & %15g \\cr \n", b31, b32, b33, b34);
printf(" %15g & %15g & %15g & %15g \\cr \n", b41, b42, b43, b44);
printf(" } \\right ] $$ \n");
}
DeriveR2FromF()
{
double e1, e2, e3;
double b1, b2, b3;
double t1, t2, t3;
double cos, sin;
double a11, a12, a13;
double a21, a22, a23;
double a31, a32, a33;
double r11, r12, r13;
double r21, r22, r23;
double r31, r32, r33;
double t11, t12, t13;
double t21, t22, t23;
double t31, t32, t33;
e1 = F41; e2 = F42; e3 = F43;
b1 = F23; b2 = F31; b3 = F12;
a11 = 1.0; a12 = 0.0; a13 = 0.0;
a21 = 0.0; a22 = 1.0; a23 = 0.0;
a31 = 0.0; a32 = 0.0; a33 = 1.0;
if (e1 == 0.0 && e2 == 0.0)
;
else {
/* r operator */
cos = e2 / sqrt(e1 * e1 + e2 * e2);
sin = e1 / sqrt(e1 * e1 + e2 * e2);
r11 = cos; r12 = -sin; r13 = 0.0;
r21 = sin; r22 = cos; r23 = 0.0;
r31 = 0.0; r32 = 0.0; r33 = 1.0;
/* a = r a */
t11 = r11 * a11 + r12 * a21 + r13 * a31;
t12 = r11 * a12 + r12 * a22 + r13 * a32;
t13 = r11 * a13 + r12 * a23 + r13 * a33;
t21 = r21 * a11 + r22 * a21 + r23 * a31;
t22 = r21 * a12 + r22 * a22 + r23 * a32;
t23 = r21 * a13 + r22 * a23 + r23 * a33;
t31 = r31 * a11 + r32 * a21 + r33 * a31;
t32 = r31 * a12 + r32 * a22 + r33 * a32;
t33 = r31 * a13 + r32 * a23 + r33 * a33;
a11 = t11; a12 = t12; a13 = t13;
a21 = t21; a22 = t22; a23 = t23;
a31 = t31; a32 = t32; a33 = t33;
/* e = r e */
t1 = r11 * e1 + r12 * e2 + r13 * e3;
t2 = r21 * e1 + r22 * e2 + r23 * e3;
t3 = r31 * e1 + r32 * e2 + r33 * e3;
e1 = t1; e2 = t2; e3 = t3;
/* b = r b */
t1 = r11 * b1 + r12 * b2 + r13 * b3;
t2 = r21 * b1 + r22 * b2 + r23 * b3;
t3 = r31 * b1 + r32 * b2 + r33 * b3;
b1 = t1; b2 = t2; b3 = t3;
}
if (e2 == 0.0 && e3 == 0.0)
;
else {
/* r operator */
cos = e3 / sqrt(e2 * e2 + e3 * e3);
sin = e2 / sqrt(e2 * e2 + e3 * e3);
r11 = 1.0; r12 = 0.0; r23 = 0.0;
r21 = 0.0; r22 = cos; r23 = -sin;
r31 = 0.0; r32 = sin; r33 = cos;
/* a = r a */
t11 = r11 * a11 + r12 * a21 + r13 * a31;
t12 = r11 * a12 + r12 * a22 + r13 * a32;
t13 = r11 * a13 + r12 * a23 + r13 * a33;
t21 = r21 * a11 + r22 * a21 + r23 * a31;
t22 = r21 * a12 + r22 * a22 + r23 * a32;
t23 = r21 * a13 + r22 * a23 + r23 * a33;
t31 = r31 * a11 + r32 * a21 + r33 * a31;
t32 = r31 * a12 + r32 * a22 + r33 * a32;
t33 = r31 * a13 + r32 * a23 + r33 * a33;
a11 = t11; a12 = t12; a13 = t13;
a21 = t21; a22 = t22; a23 = t23;
a31 = t31; a32 = t32; a33 = t33;
/* e = r e */
t1 = r11 * e1 + r12 * e2 + r13 * e3;
t2 = r21 * e1 + r22 * e2 + r23 * e3;
t3 = r31 * e1 + r32 * e2 + r33 * e3;
e1 = t1; e2 = t2; e3 = t3;
/* b = r b */
t1 = r11 * b1 + r12 * b2 + r13 * b3;
t2 = r21 * b1 + r22 * b2 + r23 * b3;
t3 = r31 * b1 + r32 * b2 + r33 * b3;
b1 = t1; b2 = t2; b3 = t3;
}
if (b1 == 0.0 && b2 == 0.0)
;
else {
/* r operator */
cos = b2 / sqrt(b1 * b1 + b2 * b2);
sin = b1 / sqrt(b1 * b1 + b2 * b2);
r11 = cos; r12 = -sin; r23 = 0.0;
r21 = sin; r22 = cos; r23 = 0.0;
r31 = 0.0; r32 = 0.0; r33 = 1.0;
/* a = r a */
t11 = r11 * a11 + r12 * a21 + r13 * a31;
t12 = r11 * a12 + r12 * a22 + r13 * a32;
t13 = r11 * a13 + r12 * a23 + r13 * a33;
t21 = r21 * a11 + r22 * a21 + r23 * a31;
t22 = r21 * a12 + r22 * a22 + r23 * a32;
t23 = r21 * a13 + r22 * a23 + r23 * a33;
t31 = r31 * a11 + r32 * a21 + r33 * a31;
t32 = r31 * a12 + r32 * a22 + r33 * a32;
t33 = r31 * a13 + r32 * a23 + r33 * a33;
a11 = t11; a12 = t12; a13 = t13;
a21 = t21; a22 = t22; a23 = t23;
a31 = t31; a32 = t32; a33 = t33;
/* e = r e */
t1 = r11 * e1 + r12 * e2 + r13 * e3;
t2 = r21 * e1 + r22 * e2 + r23 * e3;
t3 = r31 * e1 + r32 * e2 + r33 * e3;
e1 = t1; e2 = t2; e3 = t3;
/* b = r b */
t1 = r11 * b1 + r12 * b2 + r13 * b3;
t2 = r21 * b1 + r22 * b2 + r23 * b3;
t3 = r31 * b1 + r32 * b2 + r33 * b3;
b1 = t1; b2 = t2; b3 = t3;
}
if (fabs(a11) < 1e-6) a11 = 0.0;
if (fabs(a12) < 1e-6) a12 = 0.0;
if (fabs(a13) < 1e-6) a13 = 0.0;
if (fabs(a21) < 1e-6) a21 = 0.0;
if (fabs(a22) < 1e-6) a22 = 0.0;
if (fabs(a23) < 1e-6) a23 = 0.0;
if (fabs(a31) < 1e-6) a31 = 0.0;
if (fabs(a32) < 1e-6) a32 = 0.0;
if (fabs(a33) < 1e-6) a33 = 0.0;
R2_11 = a11; R2_12 = a12; R2_13 = a13; R2_14 = 0.0;
R2_21 = a21; R2_22 = a22; R2_23 = a23; R2_24 = 0.0;
R2_31 = a31; R2_32 = a32; R2_33 = a33; R2_34 = 0.0;
R2_41 = 0.0; R2_42 = 0.0; R2_43 = 0.0; R2_44 = 1.0;
}