def test_derivatives_in_spherical_coordinates(self): X = (r, th, phi) = symbols('r theta phi') s3d = Ga('e_r e_theta e_phi', g=[1, r ** 2, r ** 2 * sin(th) ** 2], coords=X, norm=True) (er, eth, ephi) = s3d.mv() grad = s3d.grad f = s3d.mv('f', 'scalar', f=True) A = s3d.mv('A', 'vector', f=True) B = s3d.mv('B', 'bivector', f=True) assert str(f) == 'f' assert str(A) == 'A__r*e_r + A__theta*e_theta + A__phi*e_phi' assert str(B) == 'B__rtheta*e_r^e_theta + B__rphi*e_r^e_phi + B__thetaphi*e_theta^e_phi' assert str(grad*f) == 'D{r}f*e_r + D{theta}f*e_theta/r + D{phi}f*e_phi/(r*sin(theta))' assert str((grad|A).simplify()) == '(r*D{r}A__r + 2*A__r + A__theta/tan(theta) + D{theta}A__theta + D{phi}A__phi/sin(theta))/r' assert str(-s3d.I()*(grad^A)) == '(A__phi/tan(theta) + D{theta}A__phi - D{phi}A__theta/sin(theta))*e_r/r + (-r*D{r}A__phi - A__phi + D{phi}A__r/sin(theta))*e_theta/r + (r*D{r}A__theta + A__theta - D{theta}A__r)*e_phi/r' assert latex(grad) == r'\boldsymbol{e}_{r} \frac{\partial}{\partial r} + \boldsymbol{e}_{\theta } \frac{1}{r} \frac{\partial}{\partial \theta } + \boldsymbol{e}_{\phi } \frac{1}{r \sin{\left (\theta \right )}} \frac{\partial}{\partial \phi }' assert latex(B|(eth^ephi)) == r'- B^{\theta \phi } {\left (r,\theta ,\phi \right )}' assert str(grad^B) == '(r*D{r}B__thetaphi - B__rphi/tan(theta) + 2*B__thetaphi - D{theta}B__rphi + D{phi}B__rtheta/sin(theta))*e_r^e_theta^e_phi/r' return
def test_derivatives_in_rectangular_coordinates(self): X = (x, y, z) = symbols('x y z') o3d = Ga('e_x e_y e_z', g=[1, 1, 1], coords=X) (ex, ey, ez) = o3d.mv() grad = o3d.grad f = o3d.mv('f', 'scalar', f=True) A = o3d.mv('A', 'vector', f=True) B = o3d.mv('B', 'bivector', f=True) C = o3d.mv('C', 'mv', f=True) assert str(f) == 'f' assert str(A) == 'A__x*e_x + A__y*e_y + A__z*e_z' assert str(B) == 'B__xy*e_x^e_y + B__xz*e_x^e_z + B__yz*e_y^e_z' assert str(C) == 'C + C__x*e_x + C__y*e_y + C__z*e_z + C__xy*e_x^e_y + C__xz*e_x^e_z + C__yz*e_y^e_z + C__xyz*e_x^e_y^e_z' assert str(grad*f) == 'D{x}f*e_x + D{y}f*e_y + D{z}f*e_z' assert str(grad|A) == 'D{x}A__x + D{y}A__y + D{z}A__z' assert str(grad*A) == 'D{x}A__x + D{y}A__y + D{z}A__z + (-D{y}A__x + D{x}A__y)*e_x^e_y + (-D{z}A__x + D{x}A__z)*e_x^e_z + (-D{z}A__y + D{y}A__z)*e_y^e_z' assert str(-o3d.I()*(grad^A)) == '(-D{z}A__y + D{y}A__z)*e_x + (D{z}A__x - D{x}A__z)*e_y + (-D{y}A__x + D{x}A__y)*e_z' assert str(grad*B) == '(-D{y}B__xy - D{z}B__xz)*e_x + (D{x}B__xy - D{z}B__yz)*e_y + (D{x}B__xz + D{y}B__yz)*e_z + (D{z}B__xy - D{y}B__xz + D{x}B__yz)*e_x^e_y^e_z' assert str(grad^B) == '(D{z}B__xy - D{y}B__xz + D{x}B__yz)*e_x^e_y^e_z' assert str(grad|B) == '(-D{y}B__xy - D{z}B__xz)*e_x + (D{x}B__xy - D{z}B__yz)*e_y + (D{x}B__xz + D{y}B__yz)*e_z' assert str(grad<A) == 'D{x}A__x + D{y}A__y + D{z}A__z' assert str(grad>A) == 'D{x}A__x + D{y}A__y + D{z}A__z' assert str(grad<B) == '(-D{y}B__xy - D{z}B__xz)*e_x + (D{x}B__xy - D{z}B__yz)*e_y + (D{x}B__xz + D{y}B__yz)*e_z' assert str(grad>B) == '0' assert str(grad<C) == 'D{x}C__x + D{y}C__y + D{z}C__z + (-D{y}C__xy - D{z}C__xz)*e_x + (D{x}C__xy - D{z}C__yz)*e_y + (D{x}C__xz + D{y}C__yz)*e_z + D{z}C__xyz*e_x^e_y - D{y}C__xyz*e_x^e_z + D{x}C__xyz*e_y^e_z' assert str(grad>C) == 'D{x}C__x + D{y}C__y + D{z}C__z + D{x}C*e_x + D{y}C*e_y + D{z}C*e_z' return
def test_derivatives_in_rectangular_coordinates(self): X = (x, y, z) = symbols('x y z') o3d = Ga('e_x e_y e_z', g=[1, 1, 1], coords=X) (ex, ey, ez) = o3d.mv() grad = o3d.grad f = o3d.mv('f', 'scalar', f=True) A = o3d.mv('A', 'vector', f=True) B = o3d.mv('B', 'bivector', f=True) C = o3d.mv('C', 'mv', f=True) assert str(f) == 'f' assert str(A) == 'A__x*e_x + A__y*e_y + A__z*e_z' assert str(B) == 'B__xy*e_x^e_y + B__xz*e_x^e_z + B__yz*e_y^e_z' assert str( C ) == 'C + C__x*e_x + C__y*e_y + C__z*e_z + C__xy*e_x^e_y + C__xz*e_x^e_z + C__yz*e_y^e_z + C__xyz*e_x^e_y^e_z' assert str(grad * f) == 'D{x}f*e_x + D{y}f*e_y + D{z}f*e_z' assert str(grad | A) == 'D{x}A__x + D{y}A__y + D{z}A__z' assert str( grad * A ) == 'D{x}A__x + D{y}A__y + D{z}A__z + (-D{y}A__x + D{x}A__y)*e_x^e_y + (-D{z}A__x + D{x}A__z)*e_x^e_z + (-D{z}A__y + D{y}A__z)*e_y^e_z' assert str( -o3d.I() * (grad ^ A) ) == '(-D{z}A__y + D{y}A__z)*e_x + (D{z}A__x - D{x}A__z)*e_y + (-D{y}A__x + D{x}A__y)*e_z' assert str( grad * B ) == '(-D{y}B__xy - D{z}B__xz)*e_x + (D{x}B__xy - D{z}B__yz)*e_y + (D{x}B__xz + D{y}B__yz)*e_z + (D{z}B__xy - D{y}B__xz + D{x}B__yz)*e_x^e_y^e_z' assert str(grad ^ B) == '(D{z}B__xy - D{y}B__xz + D{x}B__yz)*e_x^e_y^e_z' assert str( grad | B ) == '(-D{y}B__xy - D{z}B__xz)*e_x + (D{x}B__xy - D{z}B__yz)*e_y + (D{x}B__xz + D{y}B__yz)*e_z' assert str(grad < A) == 'D{x}A__x + D{y}A__y + D{z}A__z' assert str(grad > A) == 'D{x}A__x + D{y}A__y + D{z}A__z' assert str( grad < B ) == '(-D{y}B__xy - D{z}B__xz)*e_x + (D{x}B__xy - D{z}B__yz)*e_y + (D{x}B__xz + D{y}B__yz)*e_z' assert str(grad > B) == ZERO_STR assert str( grad < C ) == 'D{x}C__x + D{y}C__y + D{z}C__z + (-D{y}C__xy - D{z}C__xz)*e_x + (D{x}C__xy - D{z}C__yz)*e_y + (D{x}C__xz + D{y}C__yz)*e_z + D{z}C__xyz*e_x^e_y - D{y}C__xyz*e_x^e_z + D{x}C__xyz*e_y^e_z' assert str( grad > C ) == 'D{x}C__x + D{y}C__y + D{z}C__z + D{x}C*e_x + D{y}C*e_y + D{z}C*e_z'
def test_extracting_vectors_from_conformal_2_blade(self): g = '0 -1 #,'+ \ '-1 0 #,'+ \ '# # #' e2b = Ga('P1 P2 a',g=g) (P1,P2,a) = e2b.mv() B = P1^P2 Bsq = B*B assert str(Bsq) == '1' ap = a-(a^B)*B assert str(ap) == '-(P2.a)*P1 - (P1.a)*P2' Ap = ap+ap*B Am = ap-ap*B assert str(Ap) == '-2*(P2.a)*P1' assert str(Am) == '-2*(P1.a)*P2' assert str(Ap*Ap) == '0' assert str(Am*Am) == '0' aB = a|B assert str(aB) == '-(P2.a)*P1 + (P1.a)*P2' return
def test_properties_of_geometric_objects(self): global n, nbar g = '# # # 0 0,'+ \ '# # # 0 0,'+ \ '# # # 0 0,'+ \ '0 0 0 0 2,'+ \ '0 0 0 2 0' c3d = Ga('p1 p2 p3 n nbar',g=g) (p1,p2,p3,n,nbar) = c3d.mv() P1 = F(p1) P2 = F(p2) P3 = F(p3) L = P1^P2^n delta = (L|n)|nbar assert str(delta) == '2*p1 - 2*p2' C = P1^P2^P3 delta = ((C^n)|n)|nbar assert str(delta) == '2*p1^p2 - 2*p1^p3 + 2*p2^p3' assert str((p2-p1)^(p3-p1)) == 'p1^p2 - p1^p3 + p2^p3' return
def test_conformal_representations_of_circles_lines_spheres_and_planes(self): global n,nbar g = '1 0 0 0 0,0 1 0 0 0,0 0 1 0 0,0 0 0 0 2,0 0 0 2 0' cnfml3d = Ga('e_1 e_2 e_3 n nbar',g=g) (e1,e2,e3,n,nbar) = cnfml3d.mv() e = n+nbar #conformal representation of points A = make_vector(e1,ga=cnfml3d) # point a = (1,0,0) A = F(a) B = make_vector(e2,ga=cnfml3d) # point b = (0,1,0) B = F(b) C = make_vector(-e1,ga=cnfml3d) # point c = (-1,0,0) C = F(c) D = make_vector(e3,ga=cnfml3d) # point d = (0,0,1) D = F(d) X = make_vector('x',3,ga=cnfml3d) assert str(A) == 'e_1 + n/2 - nbar/2' assert str(B) == 'e_2 + n/2 - nbar/2' assert str(C) == '-e_1 + n/2 - nbar/2' assert str(D) == 'e_3 + n/2 - nbar/2' assert str(X) == 'x1*e_1 + x2*e_2 + x3*e_3 + (x1**2/2 + x2**2/2 + x3**2/2)*n - nbar/2' assert str((A^B^C^X)) == '-x3*e_1^e_2^e_3^n + x3*e_1^e_2^e_3^nbar + (x1**2/2 + x2**2/2 + x3**2/2 - 1/2)*e_1^e_2^n^nbar' assert str((A^B^n^X)) == '-x3*e_1^e_2^e_3^n + (x1/2 + x2/2 - 1/2)*e_1^e_2^n^nbar + x3*e_1^e_3^n^nbar/2 - x3*e_2^e_3^n^nbar/2' assert str((((A^B)^C)^D)^X) == '(-x1**2/2 - x2**2/2 - x3**2/2 + 1/2)*e_1^e_2^e_3^n^nbar' assert str((A^B^n^D^X)) == '(-x1/2 - x2/2 - x3/2 + 1/2)*e_1^e_2^e_3^n^nbar' L = (A^B^e)^X assert str(L) == '-x3*e_1^e_2^e_3^n - x3*e_1^e_2^e_3^nbar + (-x1**2/2 + x1 - x2**2/2 + x2 - x3**2/2 - 1/2)*e_1^e_2^n^nbar + x3*e_1^e_3^n^nbar - x3*e_2^e_3^n^nbar' return
def test_properties_of_geometric_objects(self): global n, nbar g = '# # # 0 0,'+ \ '# # # 0 0,'+ \ '# # # 0 0,'+ \ '0 0 0 0 2,'+ \ '0 0 0 2 0' c3d = Ga('p1 p2 p3 n nbar', g=g) (p1, p2, p3, n, nbar) = c3d.mv() P1 = F(p1) P2 = F(p2) P3 = F(p3) L = P1 ^ P2 ^ n delta = (L | n) | nbar assert str(delta) == '2*p1 - 2*p2' C = P1 ^ P2 ^ P3 delta = ((C ^ n) | n) | nbar assert str(delta) == '2*p1^p2 - 2*p1^p3 + 2*p2^p3' assert str((p2 - p1) ^ (p3 - p1)) == 'p1^p2 - p1^p3 + p2^p3'
def test_extracting_vectors_from_conformal_2_blade(self): g = '0 -1 #,'+ \ '-1 0 #,'+ \ '# # #' e2b = Ga('P1 P2 a', g=g) (P1, P2, a) = e2b.mv() B = P1 ^ P2 Bsq = B * B assert str(Bsq) == '1' ap = a - (a ^ B) * B assert str(ap) == '-(P2.a)*P1 - (P1.a)*P2' Ap = ap + ap * B Am = ap - ap * B assert str(Ap) == '-2*(P2.a)*P1' assert str(Am) == '-2*(P1.a)*P2' assert str(Ap * Ap) == ZERO_STR assert str(Am * Am) == ZERO_STR aB = a | B assert str(aB) == '-(P2.a)*P1 + (P1.a)*P2'
def properties_of_geometric_objects(): Print_Function() global n, nbar Fmt(1) g = '# # # 0 0,'+ \ '# # # 0 0,'+ \ '# # # 0 0,'+ \ '0 0 0 0 2,'+ \ '0 0 0 2 0' c3d = Ga('p1 p2 p3 n \\bar{n}', g=g) (p1, p2, p3, n, nbar) = c3d.mv() print('g_{ij} =', c3d.g) P1 = F(p1) P2 = F(p2) P3 = F(p3) print('\\text{Extracting direction of line from }L = P1\\W P2\\W n') L = P1 ^ P2 ^ n delta = (L | n) | nbar print('(L|n)|\\bar{n} =', delta) print('\\text{Extracting plane of circle from }C = P1\\W P2\\W P3') C = P1 ^ P2 ^ P3 delta = ((C ^ n) | n) | nbar print('((C^n)|n)|\\bar{n}=', delta) print('(p2-p1)^(p3-p1)=', (p2 - p1) ^ (p3 - p1)) return
def properties_of_geometric_objects(): Print_Function() global n, nbar g = '# # # 0 0,'+ \ '# # # 0 0,'+ \ '# # # 0 0,'+ \ '0 0 0 0 2,'+ \ '0 0 0 2 0' c3d = Ga('p1 p2 p3 n nbar', g=g) (p1, p2, p3, n, nbar) = c3d.mv() print('g_{ij} =\n', c3d.g) P1 = F(p1) P2 = F(p2) P3 = F(p3) print('Extracting direction of line from L = P1^P2^n') L = P1 ^ P2 ^ n delta = (L | n) | nbar print('(L|n)|nbar =', delta) print('Extracting plane of circle from C = P1^P2^P3') C = P1 ^ P2 ^ P3 delta = ((C ^ n) | n) | nbar print('((C^n)|n)|nbar =', delta) print('(p2-p1)^(p3-p1) =', (p2 - p1) ^ (p3 - p1))
def extracting_vectors_from_conformal_2_blade(): Print_Function() g = '0 -1 #,'+ \ '-1 0 #,'+ \ '# # #' e2b = Ga('P1 P2 a', g=g) (P1, P2, a) = e2b.mv() print('g_{ij} =\n', e2b.g) B = P1 ^ P2 Bsq = B * B print('B**2 =', Bsq) ap = a - (a ^ B) * B print("a' = a-(a^B)*B =", ap) Ap = ap + ap * B Am = ap - ap * B print("A+ = a'+a'*B =", Ap) print("A- = a'-a'*B =", Am) print('(A+)^2 =', Ap * Ap) print('(A-)^2 =', Am * Am) aB = a | B print('a|B =', aB) return
def basic_multivector_operations_2D(): Print_Function() g2d = Ga('e*x|y') (ex, ey) = g2d.mv() print('g_{ij} =', g2d.g) X = g2d.mv('X', 'vector') A = g2d.mv('A', 'spinor') print(X.Fmt(1, 'X')) print(A.Fmt(1, 'A')) print((X | A).Fmt(2, 'X|A')) print((X < A).Fmt(2, 'X<A')) print((A > X).Fmt(2, 'A>X')) return
def test_derivatives_in_spherical_coordinates(self): X = (r, th, phi) = symbols('r theta phi') s3d = Ga('e_r e_theta e_phi', g=[1, r**2, r**2 * sin(th)**2], coords=X, norm=True) (er, eth, ephi) = s3d.mv() grad = s3d.grad f = s3d.mv('f', 'scalar', f=True) A = s3d.mv('A', 'vector', f=True) B = s3d.mv('B', 'bivector', f=True) assert str(f) == 'f' assert str(A) == 'A__r*e_r + A__theta*e_theta + A__phi*e_phi' assert str( B ) == 'B__rtheta*e_r^e_theta + B__rphi*e_r^e_phi + B__thetaphi*e_theta^e_phi' assert str( grad * f ) == 'D{r}f*e_r + D{theta}f*e_theta/r + D{phi}f*e_phi/(r*sin(theta))' assert str( (grad | A).simplify() ) == '(r*D{r}A__r + 2*A__r + A__theta/tan(theta) + D{theta}A__theta + D{phi}A__phi/sin(theta))/r' assert str( -s3d.I() * (grad ^ A) ) == '(A__phi/tan(theta) + D{theta}A__phi - D{phi}A__theta/sin(theta))*e_r/r + (-r*D{r}A__phi - A__phi + D{phi}A__r/sin(theta))*e_theta/r + (r*D{r}A__theta + A__theta - D{theta}A__r)*e_phi/r' assert latex( grad ) == r'\boldsymbol{e}_{r} \frac{\partial}{\partial r} + \boldsymbol{e}_{\theta } \frac{1}{r} \frac{\partial}{\partial \theta } + \boldsymbol{e}_{\phi } \frac{1}{r \sin{\left (\theta \right )}} \frac{\partial}{\partial \phi }' assert latex(B | ( eth ^ ephi)) == r'- B^{\theta \phi } {\left (r,\theta ,\phi \right )}' assert str( grad ^ B ) == '(r*D{r}B__thetaphi - B__rphi/tan(theta) + 2*B__thetaphi - D{theta}B__rphi + D{phi}B__rtheta/sin(theta))*e_r^e_theta^e_phi/r' return
def test_basic_multivector_operations(self): g3d = Ga('e*x|y|z') (ex,ey,ez) = g3d.mv() A = g3d.mv('A','mv') assert str(A) == 'A + A__x*e_x + A__y*e_y + A__z*e_z + A__xy*e_x^e_y + A__xz*e_x^e_z + A__yz*e_y^e_z + A__xyz*e_x^e_y^e_z' assert str(A) == 'A + A__x*e_x + A__y*e_y + A__z*e_z + A__xy*e_x^e_y + A__xz*e_x^e_z + A__yz*e_y^e_z + A__xyz*e_x^e_y^e_z' assert str(A) == 'A + A__x*e_x + A__y*e_y + A__z*e_z + A__xy*e_x^e_y + A__xz*e_x^e_z + A__yz*e_y^e_z + A__xyz*e_x^e_y^e_z' X = g3d.mv('X','vector') Y = g3d.mv('Y','vector') assert str(X) == 'X__x*e_x + X__y*e_y + X__z*e_z' assert str(Y) == 'Y__x*e_x + Y__y*e_y + Y__z*e_z' assert str((X*Y)) == '(e_x.e_x)*X__x*Y__x + (e_x.e_y)*X__x*Y__y + (e_x.e_y)*X__y*Y__x + (e_x.e_z)*X__x*Y__z + (e_x.e_z)*X__z*Y__x + (e_y.e_y)*X__y*Y__y + (e_y.e_z)*X__y*Y__z + (e_y.e_z)*X__z*Y__y + (e_z.e_z)*X__z*Y__z + (X__x*Y__y - X__y*Y__x)*e_x^e_y + (X__x*Y__z - X__z*Y__x)*e_x^e_z + (X__y*Y__z - X__z*Y__y)*e_y^e_z' assert str((X^Y)) == '(X__x*Y__y - X__y*Y__x)*e_x^e_y + (X__x*Y__z - X__z*Y__x)*e_x^e_z + (X__y*Y__z - X__z*Y__y)*e_y^e_z' assert str((X|Y)) == '(e_x.e_x)*X__x*Y__x + (e_x.e_y)*X__x*Y__y + (e_x.e_y)*X__y*Y__x + (e_x.e_z)*X__x*Y__z + (e_x.e_z)*X__z*Y__x + (e_y.e_y)*X__y*Y__y + (e_y.e_z)*X__y*Y__z + (e_y.e_z)*X__z*Y__y + (e_z.e_z)*X__z*Y__z' g2d = Ga('e*x|y') (ex,ey) = g2d.mv() X = g2d.mv('X','vector') A = g2d.mv('A','spinor') assert str(X) == 'X__x*e_x + X__y*e_y' assert str(A) == 'A + A__xy*e_x^e_y' assert str((X|A)) == '-A__xy*((e_x.e_y)*X__x + (e_y.e_y)*X__y)*e_x + A__xy*((e_x.e_x)*X__x + (e_x.e_y)*X__y)*e_y' assert str((X<A)) == '-A__xy*((e_x.e_y)*X__x + (e_y.e_y)*X__y)*e_x + A__xy*((e_x.e_x)*X__x + (e_x.e_y)*X__y)*e_y' assert str((A>X)) == 'A__xy*((e_x.e_y)*X__x + (e_y.e_y)*X__y)*e_x - A__xy*((e_x.e_x)*X__x + (e_x.e_y)*X__y)*e_y' o2d = Ga('e*x|y', g=[1, 1]) (ex, ey) = o2d.mv() X = o2d.mv('X', 'vector') A = o2d.mv('A', 'spinor') assert str(X) == 'X__x*e_x + X__y*e_y' assert str(A) == 'A + A__xy*e_x^e_y' assert str((X*A)) == '(A*X__x - A__xy*X__y)*e_x + (A*X__y + A__xy*X__x)*e_y' assert str((X|A)) == '-A__xy*X__y*e_x + A__xy*X__x*e_y' assert str((X<A)) == '-A__xy*X__y*e_x + A__xy*X__x*e_y' assert str((X>A)) == 'A*X__x*e_x + A*X__y*e_y' assert str((A*X)) == '(A*X__x + A__xy*X__y)*e_x + (A*X__y - A__xy*X__x)*e_y' assert str((A|X)) == 'A__xy*X__y*e_x - A__xy*X__x*e_y' assert str((A<X)) == 'A*X__x*e_x + A*X__y*e_y' assert str((A>X)) == 'A__xy*X__y*e_x - A__xy*X__x*e_y' return
def derivatives_in_spherical_coordinates(): Print_Function() X = (r, th, phi) = symbols('r theta phi') s3d = Ga('e_r e_theta e_phi', g=[1, r ** 2, r ** 2 * sin(th) ** 2], coords=X, norm=True) (er, eth, ephi) = s3d.mv() grad = s3d.grad f = s3d.mv('f', 'scalar', f=True) A = s3d.mv('A', 'vector', f=True) B = s3d.mv('B', 'bivector', f=True) print('f =', f) print('A =', A) print('B =', B) print('grad*f =', grad * f) print('grad|A =', grad | A) print('-I*(grad^A) =', -s3d.E() * (grad ^ A)) print('grad^B =', grad ^ B) return
def rounding_numerical_components(): Print_Function() o3d = Ga('e_x e_y e_z', g=[1, 1, 1]) (ex, ey, ez) = o3d.mv() X = 1.2 * ex + 2.34 * ey + 0.555 * ez Y = 0.333 * ex + 4 * ey + 5.3 * ez print('X =', X) print('Nga(X,2) =', Nga(X, 2)) print('X*Y =', X * Y) print('Nga(X*Y,2) =', Nga(X * Y, 2)) return
def basic_multivector_operations_2D_orthogonal(): Print_Function() o2d = Ga('e*x|y', g=[1, 1]) (ex, ey) = o2d.mv() print('g_{ii} =', o2d.g) X = o2d.mv('X', 'vector') A = o2d.mv('A', 'spinor') print(X.Fmt(1, 'X')) print(A.Fmt(1, 'A')) print((X * A).Fmt(2, 'X*A')) print((X | A).Fmt(2, 'X|A')) print((X < A).Fmt(2, 'X<A')) print((X > A).Fmt(2, 'X>A')) print((A * X).Fmt(2, 'A*X')) print((A | X).Fmt(2, 'A|X')) print((A < X).Fmt(2, 'A<X')) print((A > X).Fmt(2, 'A>X')) return
def test_rounding_numerical_components(self): o3d = Ga('e_x e_y e_z', g=[1, 1, 1]) (ex, ey, ez) = o3d.mv() X = 1.2*ex+2.34*ey+0.555*ez Y = 0.333*ex+4*ey+5.3*ez assert str(X) == '1.2*e_x + 2.34*e_y + 0.555*e_z' assert str(Nga(X,2)) == '1.2*e_x + 2.3*e_y + 0.55*e_z' assert str(X*Y) == '12.7011000000000 + 4.02078*e_x^e_y + 6.175185*e_x^e_z + 10.182*e_y^e_z' assert str(Nga(X*Y,2)) == '13. + 4.0*e_x^e_y + 6.2*e_x^e_z + 10.0*e_y^e_z' return
def test_lt_function(self): """ Test construction from a function """ base = Ga('a b', g=[1, 1], coords=symbols('x, y', real=True)) a, b = base.mv() def not_linear(x): return x * x with pytest.raises(ValueError, match='linear'): base.lt(not_linear) def not_vector(x): return x + S.One with pytest.raises(ValueError, match='vector'): base.lt(not_vector) def ok(x): return (x | b) * a + 2*x f = base.lt(ok) x = base.mv('x', 'vector') y = base.mv('y', 'vector') assert f(x) == ok(x) assert f(x^y) == ok(x)^ok(y) assert f(1 + 2*(x^y)) == 1 + 2*(ok(x)^ok(y))
def conformal_representations_of_circles_lines_spheres_and_planes(): global n, nbar Print_Function() g = '1 0 0 0 0,0 1 0 0 0,0 0 1 0 0,0 0 0 0 2,0 0 0 2 0' cnfml3d = Ga('e_1 e_2 e_3 n nbar', g=g) (e1, e2, e3, n, nbar) = cnfml3d.mv() print('g_{ij} =\n', cnfml3d.g) e = n + nbar #conformal representation of points A = make_vector(e1, ga=cnfml3d) # point a = (1,0,0) A = F(a) B = make_vector(e2, ga=cnfml3d) # point b = (0,1,0) B = F(b) C = make_vector(-e1, ga=cnfml3d) # point c = (-1,0,0) C = F(c) D = make_vector(e3, ga=cnfml3d) # point d = (0,0,1) D = F(d) X = make_vector('x', 3, ga=cnfml3d) print('F(a) =', A) print('F(b) =', B) print('F(c) =', C) print('F(d) =', D) print('F(x) =', X) print('a = e1, b = e2, c = -e1, and d = e3') print('A = F(a) = 1/2*(a*a*n+2*a-nbar), etc.') print('Circle through a, b, and c') print('Circle: A^B^C^X = 0 =', (A ^ B ^ C ^ X)) print('Line through a and b') print('Line : A^B^n^X = 0 =', (A ^ B ^ n ^ X)) print('Sphere through a, b, c, and d') print('Sphere: A^B^C^D^X = 0 =', (((A ^ B) ^ C) ^ D) ^ X) print('Plane through a, b, and d') print('Plane : A^B^n^D^X = 0 =', (A ^ B ^ n ^ D ^ X)) L = (A ^ B ^ e) ^ X print(L.Fmt(3, 'Hyperbolic Circle: (A^B^e)^X = 0 =')) return
def check_generalized_BAC_CAB_formulas(): Print_Function() g5d = Ga('a b c d e') (a, b, c, d, e) = g5d.mv() print('g_{ij} =\n', g5d.g) print('a|(b*c) =', a | (b * c)) print('a|(b^c) =', a | (b ^ c)) print('a|(b^c^d) =', a | (b ^ c ^ d)) print('a|(b^c)+c|(a^b)+b|(c^a) =', (a | ( b ^ c)) + (c | (a ^ b)) + (b | (c ^ a))) print('a*(b^c)-b*(a^c)+c*(a^b) =',a*(b^c)-b*(a^c)+c*(a^b)) print('a*(b^c^d)-b*(a^c^d)+c*(a^b^d)-d*(a^b^c) =',a*(b^c^d)-b*(a^c^d)+c*(a^b^d)-d*(a^b^c)) print('(a^b)|(c^d) =',(a^b)|(c^d)) print('((a^b)|c)|d =',((a^b)|c)|d) print('(a^b)x(c^d) =',Ga.com(a^b,c^d)) print('(a|(b^c))|(d^e) =',(a|(b^c))|(d^e)) return
def check_generalized_BAC_CAB_formulas(): Print_Function() g4d = Ga('a b c d e') (a, b, c, d, e) = g4d.mv() print('g_{ij} =', g4d.g) print('\\bm{a|(b*c)} =', a | (b * c)) print('\\bm{a|(b^c)} =', a | (b ^ c)) print('\\bm{a|(b^c^d)} =', a | (b ^ c ^ d)) print('\\bm{a|(b^c)+c|(a^b)+b|(c^a)} =', (a | (b ^ c)) + (c | (a ^ b)) + (b | (c ^ a))) print('\\bm{a*(b^c)-b*(a^c)+c*(a^b)} =', a * (b ^ c) - b * (a ^ c) + c * (a ^ b)) print( '\\bm{a*(b^c^d)-b*(a^c^d)+c*(a^b^d)-d*(a^b^c)} =', a * (b ^ c ^ d) - b * (a ^ c ^ d) + c * (a ^ b ^ d) - d * (a ^ b ^ c)) print('\\bm{(a^b)|(c^d)} =', (a ^ b) | (c ^ d)) print('\\bm{((a^b)|c)|d} =', ((a ^ b) | c) | d) print('\\bm{(a^b)\\times (c^d)} =', Ga.com(a ^ b, c ^ d)) print('\\bm{(a^b^c)(d^e)} =', ((a ^ b ^ c) * (d ^ e)).Fmt(2)) return
def main(): Format() snr = 1 g = '0 0 1 0 ,0 0 0 1 ,1 0 0 0 ,0 1 0 0' sk4coords = (e1, e2, e3, e4) = symbols('e1 e2 e3 e4') sk4 = Ga('e_1 e_2 e_3 e_4', g=g, coords=sk4coords) (e1, e2, e3, e4) = sk4.mv() print('g_{ii} =', sk4.g) v = symbols('v', real=True) x1 = (e1 + e3) / sqrt(2) x2 = (e2 + e4) / sqrt(2) print('x_1<x_1==', x1 < x1) print('x_1<x_2==', x1 < x2) print('x_2<x_1==', x2 < x1) print('x_2<x_2==', x2 < x2) print(r'#$-\infty < v < \infty$') print('(-v*(x_1^x_2)/2).exp()==', (-v * (x1 ^ x2) / 2).exp()) v = symbols('v', real=True, positive=True) print(r'#$0\le v < \infty$') print('(-v*(x_1^x_2)/2).exp()==', (-v * (x1 ^ x2) / 2).exp()) xpdf(pdfprog=None) return
def test_reciprocal_frame_test(self): g = '1 # #,'+ \ '# 1 #,'+ \ '# # 1' g3dn = Ga('e1 e2 e3',g=g) (e1,e2,e3) = g3dn.mv() E = e1^e2^e3 Esq = (E*E).scalar() assert str(E) == 'e1^e2^e3' assert str(Esq) == '(e1.e2)**2 - 2*(e1.e2)*(e1.e3)*(e2.e3) + (e1.e3)**2 + (e2.e3)**2 - 1' Esq_inv = 1/Esq E1 = (e2^e3)*E E2 = (-1)*(e1^e3)*E E3 = (e1^e2)*E assert str(E1) == '((e2.e3)**2 - 1)*e1 + ((e1.e2) - (e1.e3)*(e2.e3))*e2 + (-(e1.e2)*(e2.e3) + (e1.e3))*e3' assert str(E2) == '((e1.e2) - (e1.e3)*(e2.e3))*e1 + ((e1.e3)**2 - 1)*e2 + (-(e1.e2)*(e1.e3) + (e2.e3))*e3' assert str(E3) == '(-(e1.e2)*(e2.e3) + (e1.e3))*e1 + (-(e1.e2)*(e1.e3) + (e2.e3))*e2 + ((e1.e2)**2 - 1)*e3' w = (E1|e2) w = w.expand() assert str(w) == '0' w = (E1|e3) w = w.expand() assert str(w) == '0' w = (E2|e1) w = w.expand() assert str(w) == '0' w = (E2|e3) w = w.expand() assert str(w) == '0' w = (E3|e1) w = w.expand() assert str(w) == '0' w = (E3|e2) w = w.expand() assert str(w) == '0' w = (E1|e1) w = (w.expand()).scalar() Esq = expand(Esq) assert str(simplify(w/Esq)) == '1' w = (E2|e2) w = (w.expand()).scalar() assert str(simplify(w/Esq)) == '1' w = (E3|e3) w = (w.expand()).scalar() assert str(simplify(w/Esq)) == '1' return
def main(): # Print_Function() (x, y, z) = xyz = symbols('x,y,z',real=True) (o3d, ex, ey, ez) = Ga.build('e_x e_y e_z', g=[1, 1, 1], coords=xyz) grad = o3d.grad (u, v) = uv = symbols('u,v',real=True) (g2d, eu, ev) = Ga.build('e_u e_v', coords=uv) grad_uv = g2d.grad v_xyz = o3d.mv('v','vector') A_xyz = o3d.mv('A','vector',f=True) A_uv = g2d.mv('A','vector',f=True) print('#3d orthogonal ($A$ is vector function)') print('A =', A_xyz) print('%A^{2} =', A_xyz * A_xyz) print('grad|A =', grad | A_xyz) print('grad*A =', grad * A_xyz) print('v|(grad*A) =',v_xyz|(grad*A_xyz)) print('#2d general ($A$ is vector function)') print('A =', A_uv) print('%A^{2} =', A_uv * A_uv) print('grad|A =', grad_uv | A_uv) print('grad*A =', grad_uv * A_uv) A = o3d.lt('A') print('#3d orthogonal ($A,\\;B$ are linear transformations)') print('A =', A) print(r'\f{mat}{A} =', A.matrix()) print('\\f{\\det}{A} =', A.det()) print('\\overline{A} =', A.adj()) print('\\f{\\Tr}{A} =', A.tr()) print('\\f{A}{e_x^e_y} =', A(ex^ey)) print('\\f{A}{e_x}^\\f{A}{e_y} =', A(ex)^A(ey)) B = o3d.lt('B') print('g =', o3d.g) print('%g^{-1} =', latex(o3d.g_inv)) print('A + B =', A + B) print('AB =', A * B) print('A - B =', A - B) print('General Symmetric Linear Transformation') Asym = o3d.lt('A',mode='s') print('A =', Asym) print('General Antisymmetric Linear Transformation') Aasym = o3d.lt('A',mode='a') print('A =', Aasym) print('#2d general ($A,\\;B$ are linear transformations)') A2d = g2d.lt('A') print('g =', g2d.g) print('%g^{-1} =', latex(g2d.g_inv)) print('%gg^{-1} =', latex(simplify(g2d.g * g2d.g_inv))) print('A =', A2d) print(r'\f{mat}{A} =', A2d.matrix()) print('\\f{\\det}{A} =', A2d.det()) A2d_adj = A2d.adj() print('\\overline{A} =', A2d_adj) print('\\f{mat}{\\overline{A}} =', latex(simplify(A2d_adj.matrix()))) print('\\f{\\Tr}{A} =', A2d.tr()) print('\\f{A}{e_u^e_v} =', A2d(eu^ev)) print('\\f{A}{e_u}^\\f{A}{e_v} =', A2d(eu)^A2d(ev)) B2d = g2d.lt('B') print('B =', B2d) print('A + B =', A2d + B2d) print('A - B =', A2d - B2d) # TODO: add this back when we drop Sympy 1.3. The 64kB of output is far too # printer-dependent if False: print('AB =', A2d * B2d) a = g2d.mv('a','vector') b = g2d.mv('b','vector') print(r'a|\f{\overline{A}}{b}-b|\f{\underline{A}}{a} =',((a|A2d.adj()(b))-(b|A2d(a))).simplify()) m4d = Ga('e_t e_x e_y e_z', g=[1, -1, -1, -1],coords=symbols('t,x,y,z',real=True)) T = m4d.lt('T') print('g =', m4d.g) print(r'\underline{T} =',T) print(r'\overline{T} =',T.adj()) print(r'\f{\det}{\underline{T}} =',T.det()) print(r'\f{\mbox{tr}}{\underline{T}} =',T.tr()) a = m4d.mv('a','vector') b = m4d.mv('b','vector') print(r'a|\f{\overline{T}}{b}-b|\f{\underline{T}}{a} =',((a|T.adj()(b))-(b|T(a))).simplify()) coords = (r, th, phi) = symbols('r,theta,phi', real=True) (sp3d, er, eth, ephi) = Ga.build('e_r e_th e_ph', g=[1, r**2, r**2*sin(th)**2], coords=coords) grad = sp3d.grad sm_coords = (u, v) = symbols('u,v', real=True) smap = [1, u, v] # Coordinate map for sphere of r = 1 sph2d = sp3d.sm(smap,sm_coords,norm=True) (eu, ev) = sph2d.mv() grad_uv = sph2d.grad F = sph2d.mv('F','vector',f=True) f = sph2d.mv('f','scalar',f=True) print('f =',f) print('grad*f =',grad_uv * f) print('F =',F) print('grad*F =',grad_uv * F) tp = (th,phi) = symbols('theta,phi',real=True) smap = [sin(th)*cos(phi),sin(th)*sin(phi),cos(th)] sph2dr = o3d.sm(smap,tp,norm=True) (eth, ephi) = sph2dr.mv() grad_tp = sph2dr.grad F = sph2dr.mv('F','vector',f=True) f = sph2dr.mv('f','scalar',f=True) print('f =',f) print('grad*f =',grad_tp * f) print('F =',F) print('grad*F =',grad_tp * F) return
def test_lt_matrix(self): base = Ga('a b', g=[1, 1], coords=symbols('x, y', real=True)) a, b = base.mv() A = base.lt([a+b, 2*a-b]) assert str(A) == 'Lt(a) = a + b\nLt(b) = 2*a - b' assert str(A.matrix()) == 'Matrix([[1, 2], [1, -1]])'
from __future__ import absolute_import, division from __future__ import print_function from sympy import expand, simplify from galgebra.printer import Format, xpdf from galgebra.ga import Ga g = '1 # #,' + \ '# 1 #,' + \ '# # 1' Format() ng3d = Ga('e1 e2 e3', g=g) (e1, e2, e3) = ng3d.mv() print('g_{ij} =', ng3d.g) E = e1 ^ e2 ^ e3 Esq = (E * E).scalar() print('E =', E) print('%E^{2} =', Esq) Esq_inv = 1 / Esq E1 = (e2 ^ e3) * E E2 = (-1) * (e1 ^ e3) * E E3 = (e1 ^ e2) * E print('E1 = (e2^e3)*E =', E1) print('E2 =-(e1^e3)*E =', E2) print('E3 = (e1^e2)*E =', E3) w = (E1 | e2) w = w.expand() print('E1|e2 =', w) w = (E1 | e3) w = w.expand()
# A2d.adj().Fmt(4,'\\overline{A}') print('\\f{\\Tr}{A} =', A2d.tr()) print('\\f{A}{e_u^e_v} =', A2d(eu ^ ev)) print('\\f{A}{e_u}^\\f{A}{e_v} =', A2d(eu) ^ A2d(ev)) B2d = g2d.lt('B') print('B =', B2d) print('A + B =', A2d + B2d) print('AB =', A2d * B2d) print('A - B =', A2d - B2d) a = g2d.mv('a', 'vector') b = g2d.mv('b', 'vector') print(r'a|\f{\overline{A}}{b}-b|\f{\underline{A}}{a} =', ((a | A2d.adj()(b)) - (b | A2d(a))).simplify()) print('#4d Minkowski spaqce (Space Time)') m4d = Ga('e_t e_x e_y e_z', g=[1, -1, -1, -1], coords=symbols('t,x,y,z', real=True)) T = m4d.lt('T') print('g =', m4d.g) # FIXME incorrect sign for T and T.adj() print(r'\underline{T} =', T) print(r'\overline{T} =', T.adj()) # m4d.mv(T.det()).Fmt(4,r'\f{\det}{\underline{T}}') print(r'\f{\mbox{tr}}{\underline{T}} =', T.tr()) a = m4d.mv('a', 'vector') b = m4d.mv('b', 'vector') print(r'a|\f{\overline{T}}{b}-b|\f{\underline{T}}{a} =', ((a | T.adj()(b)) - (b | T(a))).simplify()) xpdf(paper=(10, 12), debug=True)
def basic_multivector_operations(): Print_Function() g3d = Ga('e*x|y|z') (ex, ey, ez) = g3d.mv() A = g3d.mv('A', 'mv') print(A.Fmt(1, 'A')) print(A.Fmt(2, 'A')) print(A.Fmt(3, 'A')) X = g3d.mv('X', 'vector') Y = g3d.mv('Y', 'vector') print('g_{ij} =\n', g3d.g) print(X.Fmt(1, 'X')) print(Y.Fmt(1, 'Y')) print((X * Y).Fmt(2, 'X*Y')) print((X ^ Y).Fmt(2, 'X^Y')) print((X | Y).Fmt(2, 'X|Y')) g2d = Ga('e*x|y') (ex, ey) = g2d.mv() print('g_{ij} =\n', g2d.g) X = g2d.mv('X', 'vector') A = g2d.mv('A', 'spinor') print(X.Fmt(1, 'X')) print(A.Fmt(1, 'A')) print((X | A).Fmt(2, 'X|A')) print((X < A).Fmt(2, 'X<A')) print((A > X).Fmt(2, 'A>X')) o2d = Ga('e*x|y', g=[1, 1]) (ex, ey) = o2d.mv() print('g_{ii} =\n', o2d.g) X = o2d.mv('X', 'vector') A = o2d.mv('A', 'spinor') print(X.Fmt(1, 'X')) print(A.Fmt(1, 'A')) print((X * A).Fmt(2, 'X*A')) print((X | A).Fmt(2, 'X|A')) print((X < A).Fmt(2, 'X<A')) print((X > A).Fmt(2, 'X>A')) print((A * X).Fmt(2, 'A*X')) print((A | X).Fmt(2, 'A|X')) print((A < X).Fmt(2, 'A<X')) print((A > X).Fmt(2, 'A>X')) return
def reciprocal_frame_test(): Print_Function() g = '1 # #,'+ \ '# 1 #,'+ \ '# # 1' g3dn = Ga('e1 e2 e3', g=g) (e1, e2, e3) = g3dn.mv() print('g_{ij} =\n', g3dn.g) E = e1 ^ e2 ^ e3 Esq = (E * E).scalar() print('E =', E) print('E**2 =', Esq) Esq_inv = 1 / Esq E1 = (e2 ^ e3) * E E2 = (-1) * (e1 ^ e3) * E E3 = (e1 ^ e2) * E print('E1 = (e2^e3)*E =', E1) print('E2 =-(e1^e3)*E =', E2) print('E3 = (e1^e2)*E =', E3) w = (E1 | e2) w = w.expand() print('E1|e2 =', w) w = (E1 | e3) w = w.expand() print('E1|e3 =', w) w = (E2 | e1) w = w.expand() print('E2|e1 =', w) w = (E2 | e3) w = w.expand() print('E2|e3 =', w) w = (E3 | e1) w = w.expand() print('E3|e1 =', w) w = (E3 | e2) w = w.expand() print('E3|e2 =', w) w = (E1 | e1) w = (w.expand()).scalar() Esq = expand(Esq) print('(E1|e1)/E**2 =', simplify(w / Esq)) w = (E2 | e2) w = (w.expand()).scalar() print('(E2|e2)/E**2 =', simplify(w / Esq)) w = (E3 | e3) w = (w.expand()).scalar() print('(E3|e3)/E**2 =', simplify(w / Esq)) return
def noneuclidian_distance_calculation(): from sympy import solve, sqrt Print_Function() g = '0 # #,# 0 #,# # 1' necl = Ga('X Y e', g=g) (X, Y, e) = necl.mv() print('g_{ij} =', necl.g) print('(X^Y)**2 =', (X ^ Y) * (X ^ Y)) L = X ^ Y ^ e B = (L * e).expand().blade_rep() # D&L 10.152 print('B =', B) Bsq = B * B print('B**2 =', Bsq.obj) Bsq = Bsq.scalar() print('#L = X^Y^e is a non-euclidian line') print('B = L*e =', B) BeBr = B * e * B.rev() print('B*e*B.rev() =', BeBr) print('B**2 =', B * B) print('L**2 =', L * L) # D&L 10.153 (s, c, Binv, M, S, C, alpha) = symbols('s c (1/B) M S C alpha') XdotY = necl.g[0, 1] Xdote = necl.g[0, 2] Ydote = necl.g[1, 2] Bhat = Binv * B # D&L 10.154 R = c + s * Bhat # Rotor R = exp(alpha*Bhat/2) print('s = sinh(alpha/2) and c = cosh(alpha/2)') print('exp(alpha*B/(2*|B|)) =', R) Z = R * X * R.rev() # D&L 10.155 Z.obj = expand(Z.obj) Z.obj = Z.obj.collect([Binv, s, c, XdotY]) print(Z.Fmt(3, 'R*X*R.rev()')) W = Z | Y # Extract scalar part of multivector # From this point forward all calculations are with sympy scalars print('Objective is to determine value of C = cosh(alpha) such that W = 0') W = W.scalar() print('Z|Y =', W) W = expand(W) W = simplify(W) W = W.collect([s * Binv]) M = 1 / Bsq W = W.subs(Binv**2, M) W = simplify(W) Bmag = sqrt(XdotY**2 - 2 * XdotY * Xdote * Ydote) W = W.collect([Binv * c * s, XdotY]) #Double angle substitutions W = W.subs(2 * XdotY**2 - 4 * XdotY * Xdote * Ydote, 2 / (Binv**2)) W = W.subs(2 * c * s, S) W = W.subs(c**2, (C + 1) / 2) W = W.subs(s**2, (C - 1) / 2) W = simplify(W) W = W.subs(Binv, 1 / Bmag) W = expand(W) print('S = sinh(alpha) and C = cosh(alpha)') print('W =', W) Wd = collect(W, [C, S], exact=True, evaluate=False) Wd_1 = Wd[one] Wd_C = Wd[C] Wd_S = Wd[S] print('Scalar Coefficient =', Wd_1) print('Cosh Coefficient =', Wd_C) print('Sinh Coefficient =', Wd_S) print('|B| =', Bmag) Wd_1 = Wd_1.subs(Bmag, 1 / Binv) Wd_C = Wd_C.subs(Bmag, 1 / Binv) Wd_S = Wd_S.subs(Bmag, 1 / Binv) lhs = Wd_1 + Wd_C * C rhs = -Wd_S * S lhs = lhs**2 rhs = rhs**2 W = expand(lhs - rhs) W = expand(W.subs(1 / Binv**2, Bmag**2)) W = expand(W.subs(S**2, C**2 - 1)) W = W.collect([C, C**2], evaluate=False) a = simplify(W[C**2]) b = simplify(W[C]) c = simplify(W[one]) print('Require a*C**2+b*C+c = 0') print('a =', a) print('b =', b) print('c =', c) x = Symbol('x') C = solve(a * x**2 + b * x + c, x)[0] print('cosh(alpha) = C = -b/(2*a) =', expand(simplify(expand(C)))) return
def test_noneuclidian_distance_calculation(self): from sympy import solve, sqrt g = '0 # #,# 0 #,# # 1' necl = Ga('X Y e', g=g) (X, Y, e) = necl.mv() assert str((X ^ Y) * (X ^ Y)) == '(X.Y)**2' L = X ^ Y ^ e B = (L * e).expand().blade_rep() # D&L 10.152 assert str(B) == 'X^Y - (Y.e)*X^e + (X.e)*Y^e' Bsq = B * B assert str(Bsq) == '(X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e)' Bsq = Bsq.scalar() assert str(B) == 'X^Y - (Y.e)*X^e + (X.e)*Y^e' BeBr = B * e * B.rev() assert str(BeBr) == '(X.Y)*(-(X.Y) + 2*(X.e)*(Y.e))*e' assert str(B * B) == '(X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e)' assert str(L * L) == '(X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e)' # D&L 10.153 (s, c, Binv, M, S, C, alpha) = symbols('s c (1/B) M S C alpha') XdotY = necl.g[0, 1] Xdote = necl.g[0, 2] Ydote = necl.g[1, 2] Bhat = Binv * B # D&L 10.154 R = c + s * Bhat # Rotor R = exp(alpha*Bhat/2) assert str( R) == 'c + (1/B)*s*X^Y - (1/B)*(Y.e)*s*X^e + (1/B)*(X.e)*s*Y^e' Z = R * X * R.rev() # D&L 10.155 Z.obj = expand(Z.obj) Z.obj = Z.obj.collect([Binv, s, c, XdotY]) assert str( Z ) == '((1/B)**2*(X.Y)**2*s**2 - 2*(1/B)**2*(X.Y)*(X.e)*(Y.e)*s**2 + 2*(1/B)*(X.Y)*c*s - 2*(1/B)*(X.e)*(Y.e)*c*s + c**2)*X + 2*(1/B)*(X.e)**2*c*s*Y + 2*(1/B)*(X.Y)*(X.e)*s*(-(1/B)*(X.Y)*s + 2*(1/B)*(X.e)*(Y.e)*s - c)*e' W = Z | Y # From this point forward all calculations are with sympy scalars W = W.scalar() assert str( W ) == '(1/B)**2*(X.Y)**3*s**2 - 4*(1/B)**2*(X.Y)**2*(X.e)*(Y.e)*s**2 + 4*(1/B)**2*(X.Y)*(X.e)**2*(Y.e)**2*s**2 + 2*(1/B)*(X.Y)**2*c*s - 4*(1/B)*(X.Y)*(X.e)*(Y.e)*c*s + (X.Y)*c**2' W = expand(W) W = simplify(W) W = W.collect([s * Binv]) M = 1 / Bsq W = W.subs(Binv**2, M) W = simplify(W) Bmag = sqrt(XdotY**2 - 2 * XdotY * Xdote * Ydote) W = W.collect([Binv * c * s, XdotY]) #Double angle substitutions W = W.subs(2 * XdotY**2 - 4 * XdotY * Xdote * Ydote, 2 / (Binv**2)) W = W.subs(2 * c * s, S) W = W.subs(c**2, (C + 1) / 2) W = W.subs(s**2, (C - 1) / 2) W = simplify(W) W = W.subs(Binv, 1 / Bmag) W = expand(W) assert str( W.simplify() ) == '(X.Y)*C - (X.e)*(Y.e)*C + (X.e)*(Y.e) + S*sqrt((X.Y)*((X.Y) - 2*(X.e)*(Y.e)))' Wd = collect(W, [C, S], exact=True, evaluate=False) Wd_1 = Wd[one] Wd_C = Wd[C] Wd_S = Wd[S] assert str(Wd_1) == '(X.e)*(Y.e)' assert str(Wd_C) == '(X.Y) - (X.e)*(Y.e)' assert str(Wd_S) == 'sqrt((X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e))' assert str(Bmag) == 'sqrt((X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e))' Wd_1 = Wd_1.subs(Binv, 1 / Bmag) Wd_C = Wd_C.subs(Binv, 1 / Bmag) Wd_S = Wd_S.subs(Binv, 1 / Bmag) lhs = Wd_1 + Wd_C * C rhs = -Wd_S * S lhs = lhs**2 rhs = rhs**2 W = expand(lhs - rhs) W = expand(W.subs(1 / Binv**2, Bmag**2)) W = expand(W.subs(S**2, C**2 - 1)) W = W.collect([C, C**2], evaluate=False) a = simplify(W[C**2]) b = simplify(W[C]) c = simplify(W[one]) assert str(a) == '(X.e)**2*(Y.e)**2' assert str(b) == '2*(X.e)*(Y.e)*((X.Y) - (X.e)*(Y.e))' assert str(c) == '(X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e) + (X.e)**2*(Y.e)**2' x = Symbol('x') C = solve(a * x**2 + b * x + c, x)[0] assert str(expand(simplify(expand(C)))) == '-(X.Y)/((X.e)*(Y.e)) + 1'
def test_noneuclidian_distance_calculation(self): from sympy import solve,sqrt g = '0 # #,# 0 #,# # 1' necl = Ga('X Y e',g=g) (X,Y,e) = necl.mv() assert str((X^Y)*(X^Y)) == '(X.Y)**2' L = X^Y^e B = (L*e).expand().blade_rep() # D&L 10.152 assert str(B) == 'X^Y - (Y.e)*X^e + (X.e)*Y^e' Bsq = B*B assert str(Bsq) == '(X.Y)*((X.Y) - 2*(X.e)*(Y.e))' Bsq = Bsq.scalar() assert str(B) == 'X^Y - (Y.e)*X^e + (X.e)*Y^e' BeBr = B*e*B.rev() assert str(BeBr) == '(X.Y)*(-(X.Y) + 2*(X.e)*(Y.e))*e' assert str(B*B) == '(X.Y)*((X.Y) - 2*(X.e)*(Y.e))' assert str(L*L) == '(X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e)' # D&L 10.153 (s,c,Binv,M,S,C,alpha) = symbols('s c (1/B) M S C alpha') XdotY = necl.g[0,1] Xdote = necl.g[0,2] Ydote = necl.g[1,2] Bhat = Binv*B # D&L 10.154 R = c+s*Bhat # Rotor R = exp(alpha*Bhat/2) assert str(R) == 'c + (1/B)*s*X^Y - (1/B)*(Y.e)*s*X^e + (1/B)*(X.e)*s*Y^e' Z = R*X*R.rev() # D&L 10.155 Z.obj = expand(Z.obj) Z.obj = Z.obj.collect([Binv,s,c,XdotY]) assert str(Z) == '((1/B)**2*(X.Y)**2*s**2 - 2*(1/B)**2*(X.Y)*(X.e)*(Y.e)*s**2 + 2*(1/B)*(X.Y)*c*s - 2*(1/B)*(X.e)*(Y.e)*c*s + c**2)*X + 2*(1/B)*(X.e)**2*c*s*Y + 2*(1/B)*(X.Y)*(X.e)*s*(-(1/B)*(X.Y)*s + 2*(1/B)*(X.e)*(Y.e)*s - c)*e' W = Z|Y # From this point forward all calculations are with sympy scalars W = W.scalar() assert str(W) == '(1/B)**2*(X.Y)**3*s**2 - 4*(1/B)**2*(X.Y)**2*(X.e)*(Y.e)*s**2 + 4*(1/B)**2*(X.Y)*(X.e)**2*(Y.e)**2*s**2 + 2*(1/B)*(X.Y)**2*c*s - 4*(1/B)*(X.Y)*(X.e)*(Y.e)*c*s + (X.Y)*c**2' W = expand(W) W = simplify(W) W = W.collect([s*Binv]) M = 1/Bsq W = W.subs(Binv**2,M) W = simplify(W) Bmag = sqrt(XdotY**2-2*XdotY*Xdote*Ydote) W = W.collect([Binv*c*s,XdotY]) #Double angle substitutions W = W.subs(2*XdotY**2-4*XdotY*Xdote*Ydote,2/(Binv**2)) W = W.subs(2*c*s,S) W = W.subs(c**2,(C+1)/2) W = W.subs(s**2,(C-1)/2) W = simplify(W) W = W.subs(Binv,1/Bmag) W = expand(W) assert str(W.simplify()) == '(X.Y)*C - (X.e)*(Y.e)*C + (X.e)*(Y.e) + S*sqrt((X.Y)*((X.Y) - 2*(X.e)*(Y.e)))' Wd = collect(W,[C,S],exact=True,evaluate=False) Wd_1 = Wd[one] Wd_C = Wd[C] Wd_S = Wd[S] assert str(Wd_1) == '(X.e)*(Y.e)' assert str(Wd_C) == '(X.Y) - (X.e)*(Y.e)' assert str(Wd_S) == 'sqrt((X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e))' assert str(Bmag) == 'sqrt((X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e))' Wd_1 = Wd_1.subs(Binv,1/Bmag) Wd_C = Wd_C.subs(Binv,1/Bmag) Wd_S = Wd_S.subs(Binv,1/Bmag) lhs = Wd_1+Wd_C*C rhs = -Wd_S*S lhs = lhs**2 rhs = rhs**2 W = expand(lhs-rhs) W = expand(W.subs(1/Binv**2,Bmag**2)) W = expand(W.subs(S**2,C**2-1)) W = W.collect([C,C**2],evaluate=False) a = simplify(W[C**2]) b = simplify(W[C]) c = simplify(W[one]) assert str(a) == '(X.e)**2*(Y.e)**2' assert str(b) == '2*(X.e)*(Y.e)*((X.Y) - (X.e)*(Y.e))' assert str(c) == '(X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e) + (X.e)**2*(Y.e)**2' x = Symbol('x') C = solve(a*x**2+b*x+c,x)[0] assert str(expand(simplify(expand(C)))) == '-(X.Y)/((X.e)*(Y.e)) + 1' return
def main(): Format() (g3d, ex, ey, ez) = Ga.build('e*x|y|z') A = g3d.mv('A', 'mv') print(r'\bm{A} =', A) A.Fmt(2, r'\bm{A}') A.Fmt(3, r'\bm{A}') X = (x, y, z) = symbols('x y z', real=True) o3d = Ga('e_x e_y e_z', g=[1, 1, 1], coords=X) (ex, ey, ez) = o3d.mv() f = o3d.mv('f', 'scalar', f=True) A = o3d.mv('A', 'vector', f=True) B = o3d.mv('B', 'bivector', f=True) print(r'\bm{A} =', A) print(r'\bm{B} =', B) print('grad*f =', o3d.grad * f) print(r'grad|\bm{A} =', o3d.grad | A) print(r'grad*\bm{A} =', o3d.grad * A) print(r'-I*(grad^\bm{A}) =', -o3d.i * (o3d.grad ^ A)) print(r'grad*\bm{B} =', o3d.grad * B) print(r'grad^\bm{B} =', o3d.grad ^ B) print(r'grad|\bm{B} =', o3d.grad | B) g4d = Ga('a b c d') (a, b, c, d) = g4d.mv() print('g_{ij} =', g4d.g) print('\\bm{a|(b*c)} =', a | (b * c)) print('\\bm{a|(b^c)} =', a | (b ^ c)) print('\\bm{a|(b^c^d)} =', a | (b ^ c ^ d)) print('\\bm{a|(b^c)+c|(a^b)+b|(c^a)} =', (a | (b ^ c)) + (c | (a ^ b)) + (b | (c ^ a))) print('\\bm{a*(b^c)-b*(a^c)+c*(a^b)} =', a * (b ^ c) - b * (a ^ c) + c * (a ^ b)) print( '\\bm{a*(b^c^d)-b*(a^c^d)+c*(a^b^d)-d*(a^b^c)} =', a * (b ^ c ^ d) - b * (a ^ c ^ d) + c * (a ^ b ^ d) - d * (a ^ b ^ c)) print('\\bm{(a^b)|(c^d)} =', (a ^ b) | (c ^ d)) print('\\bm{((a^b)|c)|d} =', ((a ^ b) | c) | d) print('\\bm{(a^b)\\times (c^d)} =', Ga.com(a ^ b, c ^ d)) g = '1 # #,'+ \ '# 1 #,'+ \ '# # 1' ng3d = Ga('e1 e2 e3', g=g) (e1, e2, e3) = ng3d.mv() E = e1 ^ e2 ^ e3 Esq = (E * E).scalar() print('E =', E) print('%E^{2} =', Esq) Esq_inv = 1 / Esq E1 = (e2 ^ e3) * E E2 = (-1) * (e1 ^ e3) * E E3 = (e1 ^ e2) * E print('E1 = (e2^e3)*E =', E1) print('E2 =-(e1^e3)*E =', E2) print('E3 = (e1^e2)*E =', E3) print('E1|e2 =', (E1 | e2).expand()) print('E1|e3 =', (E1 | e3).expand()) print('E2|e1 =', (E2 | e1).expand()) print('E2|e3 =', (E2 | e3).expand()) print('E3|e1 =', (E3 | e1).expand()) print('E3|e2 =', (E3 | e2).expand()) w = ((E1 | e1).expand()).scalar() Esq = expand(Esq) print('%(E1\\cdot e1)/E^{2} =', simplify(w / Esq)) w = ((E2 | e2).expand()).scalar() print('%(E2\\cdot e2)/E^{2} =', simplify(w / Esq)) w = ((E3 | e3).expand()).scalar() print('%(E3\\cdot e3)/E^{2} =', simplify(w / Esq)) X = (r, th, phi) = symbols('r theta phi') s3d = Ga('e_r e_theta e_phi', g=[1, r**2, r**2 * sin(th)**2], coords=X, norm=True) (er, eth, ephi) = s3d.mv() f = s3d.mv('f', 'scalar', f=True) A = s3d.mv('A', 'vector', f=True) B = s3d.mv('B', 'bivector', f=True) print('A =', A) print('B =', B) print('grad*f =', s3d.grad * f) print('grad|A =', s3d.grad | A) print('-I*(grad^A) =', -s3d.i * (s3d.grad ^ A)) print('grad^B =', s3d.grad ^ B) coords = symbols('t x y z') m4d = Ga('gamma*t|x|y|z', g=[1, -1, -1, -1], coords=coords) (g0, g1, g2, g3) = m4d.mv() I = m4d.i B = m4d.mv('B', 'vector', f=True) E = m4d.mv('E', 'vector', f=True) B.set_coef(1, 0, 0) E.set_coef(1, 0, 0) B *= g0 E *= g0 J = m4d.mv('J', 'vector', f=True) F = E + I * B print('B = \\bm{B\\gamma_{t}} =', B) print('E = \\bm{E\\gamma_{t}} =', E) print('F = E+IB =', F) print('J =', J) gradF = m4d.grad * F gradF.Fmt(3, 'grad*F') print('grad*F = J') (gradF.get_grade(1) - J).Fmt(3, '%\\grade{\\nabla F}_{1} -J = 0') (gradF.get_grade(3)).Fmt(3, '%\\grade{\\nabla F}_{3} = 0') (alpha, beta, gamma) = symbols('alpha beta gamma') (x, t, xp, tp) = symbols("x t x' t'") m2d = Ga('gamma*t|x', g=[1, -1]) (g0, g1) = m2d.mv() R = cosh(alpha / 2) + sinh(alpha / 2) * (g0 ^ g1) X = t * g0 + x * g1 Xp = tp * g0 + xp * g1 print('R =', R) print( r"#%t\bm{\gamma_{t}}+x\bm{\gamma_{x}} = t'\bm{\gamma'_{t}}+x'\bm{\gamma'_{x}} = R\lp t'\bm{\gamma_{t}}+x'\bm{\gamma_{x}}\rp R^{\dagger}" ) Xpp = R * Xp * R.rev() Xpp = Xpp.collect() Xpp = Xpp.trigsimp() print(r"%t\bm{\gamma_{t}}+x\bm{\gamma_{x}} =", Xpp) Xpp = Xpp.subs({sinh(alpha): gamma * beta, cosh(alpha): gamma}) print(r'%\f{\sinh}{\alpha} = \gamma\beta') print(r'%\f{\cosh}{\alpha} = \gamma') print(r"%t\bm{\gamma_{t}}+x\bm{\gamma_{x}} =", Xpp.collect()) coords = symbols('t x y z') m4d = Ga('gamma*t|x|y|z', g=[1, -1, -1, -1], coords=coords) (g0, g1, g2, g3) = m4d.mv() I = m4d.i (m, e) = symbols('m e') psi = m4d.mv('psi', 'spinor', f=True) A = m4d.mv('A', 'vector', f=True) sig_z = g3 * g0 print('\\bm{A} =', A) print('\\bm{\\psi} =', psi) dirac_eq = (m4d.grad * psi) * I * sig_z - e * A * psi - m * psi * g0 dirac_eq.simplify() dirac_eq.Fmt( 3, r'\nabla \bm{\psi} I \sigma_{z}-e\bm{A}\bm{\psi}-m\bm{\psi}\gamma_{t} = 0' ) # xpdf() xpdf(pdfprog=None) return
def test_reciprocal_frame_test(self): g = '1 # #,'+ \ '# 1 #,'+ \ '# # 1' g3dn = Ga('e1 e2 e3', g=g) (e1, e2, e3) = g3dn.mv() E = e1 ^ e2 ^ e3 Esq = (E * E).scalar() assert str(E) == 'e1^e2^e3' assert str( Esq ) == '(e1.e2)**2 - 2*(e1.e2)*(e1.e3)*(e2.e3) + (e1.e3)**2 + (e2.e3)**2 - 1' Esq_inv = 1 / Esq E1 = (e2 ^ e3) * E E2 = (-1) * (e1 ^ e3) * E E3 = (e1 ^ e2) * E assert str( E1 ) == '((e2.e3)**2 - 1)*e1 + ((e1.e2) - (e1.e3)*(e2.e3))*e2 + (-(e1.e2)*(e2.e3) + (e1.e3))*e3' assert str( E2 ) == '((e1.e2) - (e1.e3)*(e2.e3))*e1 + ((e1.e3)**2 - 1)*e2 + (-(e1.e2)*(e1.e3) + (e2.e3))*e3' assert str( E3 ) == '(-(e1.e2)*(e2.e3) + (e1.e3))*e1 + (-(e1.e2)*(e1.e3) + (e2.e3))*e2 + ((e1.e2)**2 - 1)*e3' w = (E1 | e2) w = w.expand() assert str(w) == ZERO_STR w = (E1 | e3) w = w.expand() assert str(w) == ZERO_STR w = (E2 | e1) w = w.expand() assert str(w) == ZERO_STR w = (E2 | e3) w = w.expand() assert str(w) == ZERO_STR w = (E3 | e1) w = w.expand() assert str(w) == ZERO_STR w = (E3 | e2) w = w.expand() assert str(w) == ZERO_STR w = (E1 | e1) w = (w.expand()).scalar() Esq = expand(Esq) assert str(simplify(w / Esq)) == '1' w = (E2 | e2) w = (w.expand()).scalar() assert str(simplify(w / Esq)) == '1' w = (E3 | e3) w = (w.expand()).scalar() assert str(simplify(w / Esq)) == '1'
from __future__ import print_function import sys from sympy import symbols, sin, latex, diff, Function, expand from galgebra.ga import Ga from galgebra.lt import Mlt from galgebra.printer import Eprint, Format, xpdf Format() #Define spherical coordinate system in 3-d coords = (r, th, phi) = symbols('r,theta,phi', real=True) sp3d = Ga('e_r,e_th,e_ph', g=[1, r**2, r**2 * sin(th)**2], coords=coords) (er, eth, ephi) = sp3d.mv() #Define coordinates for 2-d (u,v) and 1-d (s) manifolds u, v, s, alpha = symbols('u v s alpha', real=True) sub_coords = (u, v) smap = [1, u, v] # Coordinate map for sphere of r = 1 in 3-d print(r'(u,v)\rightarrow (r,\theta,\phi) = ', smap) #Define unit sphere manifold sph2d = sp3d.sm(smap, sub_coords) print('#Unit Sphere Manifold:')