#fields fieldsF=[sp.Symbol('psi'), sp.Symbol('phi'), sp.Symbol('Ax')] A=[sp.S(0), fieldsF[1](M.x[0]), fieldsF[2](M.x[0]), sp.S(0)] psi=fieldsF[0](M.x[0]) fields=[psi,A[1],A[2]] #Assumptions on the parameters. -9/4<m^2<-1 ass={m2:-sp.S(2),M.L:1,M.zh:1,alpha3:0,alpha1:0} m2N=float(m2.subs(ass)) syms=fieldsF+M.x+params+varParams+[M.L,M.zh] print('Generating Lagrangian...') try: L=sp.sympify(load(open('cache/L')),dict(zip([str(s) for s in syms],syms))) except IOError: L=getLagrangian(M,m2,alpha3,alpha1,alpha2,psi,[A[0],A[1],A[2]*sp.exp(w*M.x[1]),A[3]],verbose=True) dump(str(L),open('cache/L','w')) L=L.subs(ass) dofs=reduce(lambda a,b:a+b,[[f, f.diff(M.x[0])] for f in fields]) #list of fields and derivatives dummies=[sp.Dummy('d'+str(i)) for i in range(len(dofs))] Lfun=sp.lambdify([M.x[0]]+varParams+dummies, L.subs(zip(dofs, dummies)[::-1]).subs(M.x[1],0)) print('Calculating equations of motion...') eqm=[fieldEqn(L,f,M.x).expand().collect(f) for f in fields] eqm=[series(e,A[2]).doit().simplify() for e in eqm] #assume small Ax, gives eqm linear in Ax print('Solving indicial equations...') try: ind=load(open('cache/indicial')) except IOError:
fieldsF=[sp.Symbol('psi'), sp.Symbol('phi'), sp.Symbol('Ax'), sp.Symbol('Axf')] A=[sp.S(0), fieldsF[1](M.x[0]), fieldsF[2](M.x[0],M.x[1]), sp.S(0)] Axf=fieldsF[3](M.x[0])*sp.exp(M.x[1]*w*sp.I) psi=fieldsF[0](M.x[0]) fields=[psi,A[1],A[2]] #Assumptions on the parameters. -9/4<m^2<-1 ass={m2:-sp.S(2),M.L:1,M.zh:1} m2N=float(m2.subs(ass)) syms=fieldsF+M.x+params+varParams+[M.L,M.zh] print('Generating Lagrangian...') try: L=sp.sympify(load(open('cache/L')),dict(zip([str(s) for s in syms],syms))) except IOError: L=getLagrangian(M,m2,0,0,alpha2,psi,A,verbose=True) dump(str(L),open('cache/L','w')) L=L.subs(ass) dofs=reduce(lambda a,b:a+b,[[f, f.diff(M.x[0])] for f in fields]) #list of fields and derivatives dummies=[sp.Dummy('d'+str(i)) for i in range(len(dofs))] Le=L.subs(A[2],0).subs(zip(dofs, dummies)[::-1]).subs(M.x[1],0).doit() Lfun=sp.lambdify([M.x[0]]+varParams+dummies, Le) print('Calculating equations of motion...') eqm=[fieldEqn(L,f,M.x).subs(A[2],0).doit().simplify() for f in fields[:2]] d=sp.Dummy() eqm.append(series(fieldEqn(L,A[2],M.x).subs(A[2],d*Axf).doit(),d).subs(d,1).doit().simplify()) oeqm=eqm=[sp.fraction(e.cancel())[0] for e in eqm] fields[2]=fieldsF[3](M.x[0]) del A
#TODO assert that r[0] x r[1] x ... x r[n] == i #reduce(lambda a,b:[[(ai,bi) for bi in b]for ai in a],r) assert(len(i)==reduce(lambda a,b:a*b, [len(ri) for ri in r])) return r def getExpansion(ind,p,z): return [sum(j[0]*z**j[1] for j in zip(p[i], ind[i])) for i in range(len(ind))] def getExpansionFun(ind,der=0): dums=[[sp.Dummy() for i in range(len(ind[j]))] for j in range(len(ind))] z=sp.Dummy('z') return sp.lambdify(reduce(lambda a,b:a+b,dums)+[z], [e.diff(z,der) for e in getExpansion(ind,dums,z)]) if __name__=="__main__": from metric import AdSBHz as M #fields, assume only radial dependence A=[f(M.x[0]) for f in sp.symbols(['Az','phi','A1','A2'])] psi=sp.Symbol('psi')(M.x[0]) #parameters m2,gamma,alpha1,alpha2=sp.symbols(['m2','gamma','alpha1','alpha2'],real=True) L=getLagrangian(M,m2,gamma,alpha1,alpha2,psi,*A) L=L.subs({m2:-sp.S('2'),M.L:1,M.zh:1,gamma:0,alpha1:0,alpha2:0,A[0]:0,A[2]:0,A[3]:0}).doit() eqm=psieqm, phieqm=[fieldEqn(L,f,M.x).expand().collect(f) for f in [psi,A[1]]] sp.pprint(frobenius(eqm,[A[1],psi],M.x[0],0,2)) sp.pprint(frobenius(eqm,[A[1],psi],M.x[0],1,2))