In [1]:
import unittest
import sys
from sympy import symbols, sin, cos, Rational, expand, collect, simplify, Symbol
from printer import Format, Eprint, Get_Program
from ga import Ga, one, zero
from mv import Mv, Nga, com
def F(x):
global n, nbar
Fx = ((x * x) * n + 2 * x - nbar) / 2
return(Fx)
def make_vector(a, n=3, ga=None):
if isinstance(a,str):
v = zero
for i in range(n):
a_i = Symbol(a+str(i+1))
v += a_i*ga.basis[i]
v = ga.mv(v)
return(F(v))
else:
return(F(a))
In [2]:
from sympy import solve,sqrt
g = '0 # #,# 0 #,# # 1'
necl = Ga('X Y e',g=g)
(X,Y,e) = necl.mv()
In [3]:
X
Out[3]:
In [4]:
Y
Out[4]:
In [5]:
e
Out[5]:
In [6]:
(X^Y)*(X^Y)
Out[6]:
In [7]:
L = X^Y^e
L
Out[7]:
In [8]:
B = (L*e).expand().blade_rep()
B
Out[8]:
In [9]:
Bsq = B*B
Bsq
Out[9]:
In [10]:
BsqScalar = Bsq.scalar()
BsqScalar
Out[10]:
In [11]:
(Bsq - BsqScalar).simplify() == 0
Out[11]:
In [12]:
BeBr = B*e*B.rev()
BeBr
Out[12]:
In [13]:
B*B
Out[13]:
In [14]:
L*L
Out[14]:
In [15]:
(s,c,Binv,M,S,C,alpha) = symbols('s c (1/B) M S C alpha')
In [16]:
XdotY = necl.g[0,1]
Xdote = necl.g[0,2]
Ydote = necl.g[1,2]
In [17]:
XdotY
Out[17]:
In [18]:
Xdote
Out[18]:
In [19]:
Ydote
Out[19]:
In [20]:
Bhat = Binv*B
Bhat
Out[20]:
In [21]:
R = c+s*Bhat # Rotor R = exp(alpha*Bhat/2)
R
Out[21]:
In [22]:
Z = R*X*R.rev()
Z
Out[22]:
In [23]:
Z.obj
Out[23]:
In [24]:
Z.obj = expand(Z.obj)
Z.obj
Out[24]:
In [25]:
Z.obj = Z.obj.collect([Binv,s,c,XdotY])
Z.obj
Out[25]:
In [26]:
Z
Out[26]:
In [27]:
W = Z|Y
W
Out[27]:
In [28]:
W.scalar()
Out[28]:
In [29]:
W = W.scalar()
W = expand(W)
W = simplify(W)
W = W.collect([s*Binv])
W
Out[29]:
In [30]:
Bsq = Bsq.scalar()
M = 1/Bsq
M
Out[30]:
In [31]:
W = W.subs(Binv**2,M)
W
Out[31]:
In [32]:
W = simplify(W)
W
Out[32]:
In [33]:
Bmag = sqrt(XdotY**2-2*XdotY*Xdote*Ydote)
Bmag
Out[33]:
In [34]:
W = W.collect([Binv*c*s,XdotY])
W
Out[34]:
In [35]:
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(1/Binv,Bmag)
W = expand(W)
W
Out[35]:
In [36]:
# FIXME assert str(W.simplify()) == '(X.Y)*C - (X.e)*(Y.e)*C + (X.e)*(Y.e) + S*sqrt((X.Y)**2 - 2*(X.Y)*(X.e)*(Y.e))'
W.simplify()
Out[36]:
In [37]:
Wd = collect(W,[C,S],exact=True,evaluate=False)
Wd_1 = Wd[one]
Wd_C = Wd[C]
Wd_S = Wd[S]
In [38]:
Wd
Out[38]:
In [39]:
# FIXME assert str(Wd_1) == '(X.e)*(Y.e)'
Wd_1
Out[39]:
In [40]:
Wd_1.simplify()
Out[40]:
In [41]:
# FIXME assert str(Wd_C) == '(X.Y) - (X.e)*(Y.e)'
Wd_C
Out[41]:
In [42]:
Wd_C.simplify()
Out[42]:
In [43]:
Wd_S
Out[43]:
In [44]:
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)
In [45]:
r
Out[45]:
In [46]:
th
Out[46]:
In [47]:
phi
Out[47]:
In [48]:
er
Out[48]:
In [49]:
eth
Out[49]:
In [50]:
ephi
Out[50]:
In [51]:
grad
Out[51]:
In [52]:
f
Out[52]:
In [53]:
A
Out[53]:
In [54]:
B
Out[54]:
In [55]:
grad*f
Out[55]:
In [56]:
(grad|A).simplify()
Out[56]:
In [57]:
-s3d.I()*(grad^A)
Out[57]:
In [58]:
B|(eth^ephi)
Out[58]:
In [59]:
btp = B|(eth^ephi)
In [60]:
str(btp)
Out[60]:
In [62]:
from printer import print_latex
print_latex(btp)
In [63]:
import printer
def latex(expr, **settings):
return GaLatexPrinter(settings).doprint(expr)
def print_latex(expr, **settings):
"""Prints LaTeX representation of the given expression."""
print latex(expr, **settings)
In [81]:
gp = printer.GaLatexPrinter({})
In [82]:
gp.doprint(btp)
Out[82]:
In [83]:
printer.GaLatexPrinter.split_super_sub(str(btp))
Out[83]:
In [84]:
gp._print_Mv(btp)
Out[84]:
In [72]:
btp.Mv_latex_str()
Out[72]:
In [80]:
btp.components()
Out[80]:
In [87]:
str(btp.components()[0])
Out[87]:
In [90]:
btp.Ga.blades_lst
Out[90]:
In [91]:
btp.Ga.blades_to_grades_dict
Out[91]:
In [93]:
printer.ostr(btp)
Out[93]:
In [108]:
btp.Mv_str()
Out[108]:
In [111]:
str(btp.base_rep())
Out[111]:
In [112]:
btp.blade_coefs()
Out[112]:
In [113]:
btp.blade_coefs()[0]
Out[113]:
In [114]:
gp.latex(btp.blade_coefs()[0])
Out[114]:
In [120]:
str(btp.blade_rep())
Out[120]:
In [125]:
btp.coords
Out[125]:
In [126]:
btp.dual_mode_lst
Out[126]:
In [136]:
btp.grades
Out[136]:
In [143]:
(mode, name_lst, supers_lst, subs_lst) = printer.GaLatexPrinter.split_super_sub(str(btp))
In [144]:
mode
Out[144]:
In [145]:
name_lst
Out[145]:
In [146]:
supers_lst
Out[146]:
In [153]:
GaLatexPrinter = printer.GaLatexPrinter
def translate(s):
tmp = s
parse_dict = {}
i_sub = 1
for glyph in GaLatexPrinter.special_alphabet:
if glyph in tmp:
parse_sym = '????' + str(i_sub)
parse_dict[parse_sym] = '\\' + glyph + ' '
tmp = tmp.replace(glyph, parse_sym)
print tmp
for parse_sym in parse_dict:
tmp = tmp.replace(parse_sym, parse_dict[parse_sym])
for glyph in GaLatexPrinter.greek_translated:
if glyph in tmp:
tmp = tmp.replace(glyph, GaLatexPrinter.greek_translated[glyph])
return tmp
In [154]:
translate('thetaphi')
Out[154]:
In [157]:
def translate_corrected(s):
tmp = s
parse_dict = {}
i_sub = 1
for glyph in printer.GaLatexPrinter.special_alphabet:
if glyph in tmp:
parse_sym = '????' + str(i_sub)
i_sub += 1
parse_dict[parse_sym] = '\\' + glyph + ' '
tmp = tmp.replace(glyph, parse_sym)
print tmp
for parse_sym in parse_dict:
tmp = tmp.replace(parse_sym, parse_dict[parse_sym])
for glyph in GaLatexPrinter.greek_translated:
if glyph in tmp:
tmp = tmp.replace(glyph, GaLatexPrinter.greek_translated[glyph])
return tmp
In [158]:
translate_corrected('thetaphi')
Out[158]:
In [159]:
grad
Out[159]:
In [160]:
str(grad)
Out[160]:
In [161]:
printer.GaLatexPrinter.split_super_sub(str(grad))
Out[161]:
In [166]:
translate_corrected('e_theta*1/r*D{theta}')
Out[166]:
In [167]:
translate('e_theta*1/r*D{theta}')
Out[167]:
In [194]:
print translate(str(grad))
In [201]:
cpns = (gr, gt, gph) = grad.components()
cpns
Out[201]:
In [206]:
gp._print_Dop(gt)
Out[206]:
In [207]:
gt.Dop_latex_str()
Out[207]:
In [211]:
gt.terms
Out[211]:
In [217]:
def Dop_latex_str(self):
if len(self.terms) == 0:
return ' 0 '
self.consolidate_coefs()
mv_terms = self.Dop_mv_expand(modes=simplify)
s = ''
for (sdop, base) in mv_terms:
str_sdop = str(sdop)
if base == S(1):
s += str_sdop
else:
if str_sdop == '1':
s += str(base)
if str_sdop == '-1':
s += '-' + str(base)
if str_sdop[1:] != '1':
s += ' ' + str_sdop[1:]
else:
if len(sdop.terms) > 1:
if self.cmpflg:
s += r'\left ( ' + str_sdop + r'\right ) ' + str(base)
else:
s += str(base) + ' ' + r'\left ( ' + str_sdop + r'\right ) '
else:
if str_sdop[0] == '-' and not isinstance(sdop.terms[0][0], Add):
if self.cmpflg:
s += str_sdop + str(base)
else:
s += '-' + str(base) + ' ' + str_sdop[1:]
else:
if self.cmpflg:
s += str_sdop + ' ' + str(base)
else:
s += str(base) + ' ' + str_sdop
s += ' + '
s = s.replace('+ -','-')
# Sdop.str_mode = False
return s[:-3]
In [218]:
Dop_latex_str(gt)
Out[218]:
In [220]:
terms = gt.Dop_mv_expand(modes=simplify)
terms
Out[220]:
In [231]:
def Dop_latex_str_corrected(self):
if len(self.terms) == 0:
return ' 0 '
self.consolidate_coefs()
mv_terms = self.Dop_mv_expand(modes=simplify)
s = ''
for (sdop, base) in mv_terms:
str_base = printer.latex(base)
str_sdop = printer.latex(sdop)
print str_base
print str_sdop
if base == S(1):
s += str_sdop
else:
if str_sdop == '1':
s += str_base
if str_sdop == '-1':
s += '-' + str_base
if str_sdop[1:] != '1':
s += ' ' + str_sdop[1:]
else:
if len(sdop.terms) > 1:
if self.cmpflg:
s += r'\left ( ' + str_sdop + r'\right ) ' + str_base
else:
s += str_base + ' ' + r'\left ( ' + str_sdop + r'\right ) '
else:
if str_sdop[0] == '-' and not isinstance(sdop.terms[0][0], Add):
if self.cmpflg:
s += str_sdop + str_base
else:
s += '-' + str_base + ' ' + str_sdop[1:]
else:
if self.cmpflg:
s += str_sdop + ' ' + str_base
else:
s += str_base + ' ' + str_sdop
s += ' + '
s = s.replace('+ -','-')
# Sdop.str_mode = False
return s[:-3]
In [232]:
print Dop_latex_str_corrected(gt)
In [233]:
print translate_corrected(str(grad))
In [229]:
(gt0, gt1) = terms[0]
gt0
Out[229]:
In [234]:
print translate_corrected(str(gt0))
In [236]:
gp._print_Sdop(gt0)
Out[236]:
$ \boldsymbol{e}_{r} D{r} + \boldsymbol{e}_{\theta } 1/r D{theta} + \boldsymbol{e}_{\phi } 1/(r*sin(theta)) D{phi} $
$ \boldsymbol{e}_{r} D{r} + \boldsymbol{e}_{\theta } 1/r D{\theta} + \boldsymbol{e}_{\phi } 1/(r*sin(\theta)) D{\phi} $
$ \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} $
$ \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 } $
$ - B^{\theta \phi } {\left (r,\theta ,\phi \right )} $
In [ ]: