# Converted from etaordern_large.m - eta vs phi for large orders (n>=1)importnumpyasnpfromscipy.integrateimportsolve_ivpfromscipy.specialimportivasbesselifrommiscimportoctave_saveordervec=[1.,2.,5.,10.]p=dict(q=2.,thiele=10.,k=2.)c0=0.01der=1e-8start=1.eps_sq=np.sqrt(np.finfo(float).eps)defivp(t,x,order,p):xdot=np.zeros(2)xdot[0]=x[1]ift==0:xdot[1]=p['k']*x[0]**orderelse:xdot[1]=-p['q']/t*x[1]+p['k']*x[0]**orderreturnxdotdefmake_g(order,p):defg(t,x):val=np.sqrt((order+1)/2*x[0]**(order-1)*p['k'])*t/(p['q']+1)returnval-p['thiele']g.terminal=Trueg.direction=0returngtable_list=[]no=len(ordervec)forjinrange(no):order=ordervec[j]iforder<1:# Stage 1tsteps=np.concatenate([[0.],np.logspace(-2,5,200)])x0=np.array([c0,0.])sol=solve_ivp(lambdat,x:ivp(t,x,order,p),[tsteps[0],tsteps[-1]],x0,method='Radau',t_eval=tsteps,rtol=eps_sq,atol=1e-18)ts=sol.t;xs=sol.y.Tphi=np.sqrt((order+1)/2*xs[:,0]**(order-1)*p['k'])*ts/(p['q']+1)eta=xs[:,1]/(p['k']*ts*xs[:,0]**order)*(p['q']+1)phi[0]=0.;eta[0]=1.# Stage 2tsteps2=np.concatenate([np.linspace(start,start+2,30),np.logspace(np.log10(start+2),np.log10(40.),20)])x0=np.array([0.,der])sol2=solve_ivp(lambdat,x:ivp(t,x,order,p),[tsteps2[0],tsteps2[-1]],x0,method='Radau',t_eval=tsteps2,rtol=eps_sq,atol=1e-18)ts2=sol2.t;xs2=sol2.y.Tphidry=np.sqrt((order+1)/2*xs2[:,0]**(order-1)*p['k'])*(ts2+start)/(p['q']+1)etadry=xs2[:,1]/(p['k']*(ts2+start)*xs2[:,0]**order)*(p['q']+1)tab=np.vstack([np.column_stack([phi,eta]),np.column_stack([phidry[1:][::-1],etadry[1:][::-1]])])eliforder==1:phi_v=np.logspace(-2,2,250)ifp['q']==0:eta_v=np.tanh(phi_v)/phi_velifp['q']==1:eta_v=besseli(1,phi_v)/(phi_v*besseli(0,phi_v))else:# sphereeta_v=(1./phi_v)*(1./np.tanh(3*phi_v)-1./(3*phi_v))tab=np.column_stack([phi_v,eta_v])else:x0_=np.array([c0,0.])t_out=np.concatenate([[0.],np.logspace(-1,10,2000)])ev=make_g(order,p)sol=solve_ivp(lambdat,x:ivp(t,x,order,p),[t_out[0],t_out[-1]],x0_,method='Radau',t_eval=t_out,events=ev,rtol=eps_sq,atol=eps_sq)ts=sol.t;xs=sol.y.Tphi=np.sqrt((order+1)/2*xs[:,0]**(order-1)*p['k'])*ts/(p['q']+1)eta=xs[:,1]/(p['k']*ts*xs[:,0]**order)*(p['q']+1)tab=np.column_stack([phi[1:],eta[1:]])table_list.append(tab)octave_save('etaordern_large.dat',*[('table%d'%j,table_list[j])forjinrange(no)])