importnumpyasnpfromscipy.optimizeimportfsolveimportmatplotlib.pyplotasplt# Setting grid pointsaxisbox=[-1.5,1.5,-1,1]xa,xb,ya,yb=axisboxnhalf=50npts=2*nhalf+1theta=np.linspace(0,4*np.pi,npts)lamvec=np.exp(1j*theta)# predictor coefficients, 1st, 2nd, 3rd, 4th orderp=[[1,0,0,0],[1.5,-0.5,0,0],[23/12,-4/3,5/12,0],[55/24,-59/24,37/24,-9/24]]# corrector coefficients, 1st, 2nd, 3rd, 4th orderc=[[1,0,0,0],[0.5,0.5,0,0],[5/12,8/12,-1/12,0],[9/24,19/24,-5/24,1/24]]defcharacteristic(w,PCs,lam):cc=c[PCs-1]pp=p[PCs-2]# note, the predictor order is one less than correctora=np.zeros(4,dtype=complex)a[0]=1+w*(cc[0]*(1+w*pp[0])+cc[1])a[1]=w*(cc[0]*w*pp[1]+cc[2])a[2]=w*(cc[0]*w*pp[2]+cc[3])a[3]=w*cc[0]*w*pp[3]order=len(a)G=np.zeros([order,order],dtype=complex)G[0,:]=aG[1:,:-1]=np.eye(order-1)G-=lam*np.eye(order)returnnp.linalg.det(G)deffunc(w,PCs,lam):return[characteristic(w[0]+1j*w[1],PCs,lam).real,characteristic(w[0]+1j*w[1],PCs,lam).imag]PCsvec=[2,3,4]npcs=len(PCsvec)wsol=[np.zeros(npts,dtype=complex)for_inrange(npcs)]forj,PCsinenumerate(PCsvec):w0=0+0jfork,laminenumerate(lamvec):sol=fsolve(func,[w0.real,w0.imag],args=(PCs,lam),full_output=True)ifsol[2]==1:w=sol[0][0]+1j*sol[0][1]wsol[j][k]=ww0=0.95*welse:print(f"Warning: fsolve did not converge for j={j}, k={k}")print(sol)wsav=wsol.copy()# Check for intersecting loopsforindinrange(npcs):forkinrange(len(wsol[ind])-1):z=np.array([wsol[ind].real,wsol[ind].imag])iloop=0forjinrange(k+2,len(wsol[ind])-1):A=np.column_stack([z[:,k]-z[:,k+1],z[:,j+1]-z[:,j]])ifnp.linalg.det(A)!=0:lam=np.linalg.solve(A,z[:,j+1]-z[:,k+1])ifnp.all((0<=lam)&(lam<=1)):iloop=list(range(k+1,j+1))zint=lam[0]*z[:,k]+(1-lam[0])*z[:,k+1]breakifiloop:zcp=complex(zint[0],zint[1])wsol[ind][iloop[0]]=zcpwsol[ind]=np.delete(wsol[ind],iloop[1:])plt.figure()forjinrange(npcs):plt.plot(wsol[j].real,wsol[j].imag,'-o')plt.show(block=False)# Prepare data for saving# Save to APC_stability.dat filewithopen("APC_stability.dat","w")asf:forjinrange(npcs):store=np.column_stack((wsol[j].real,wsol[j].imag))np.savetxt(f,store,fmt='%.6f',header=f"predictor/corrector order:{j+1}/{j+2}")f.write("\n\n")