从无粘性的 Burgers 方程:,我得到了离散化. 有起始条件,, 我想绘制后时间步长。但是,我似乎无法让它工作,并希望得到任何帮助。Python代码:
import numpy as np
import matplotlib.pyplot as plt
import scipy as py
from scipy.sparse.linalg import gmres
#x
x0 = 0 #x min
xe = 1 #x max
N = 100 #Nodes
dx = (xe-x0)/N
x = py.linspace(x0,xe,N)
#t
t0 = 0 #time
te = 1 #max time
dt = 0.0001 #timestep
M = int((te-t0)/dt) #timesteps
#u
u0 = py.sin(py.pi*x)
ts = 50
def EulerMethod(ustart):
U = np.zeros((N,M))
U[:,0] = ustart
t=t0
for i in range(N-1): #one step Euler forward
U[0,1] = 0
U[i+1,1] = U[i+1,0] - (dt/dx)*(U[i+1,0]**2-U[i,0]**2)
for n in range(ts):
U[:,n+2] = NewtonMethod(U[:,n+1],U[:,n]) #Eulers implicit method with Newtons Method
t=t+dt
return U
def NewtonMethod(u,c):
#c = u_n
for i in range(3):
F = np.zeros((N,1))
J = np.zeros((N,N))
J[N-1,N-1] = 1/dt + u[N-1]/dx
F[0] = (u[0] - c[0])/dt + (u[0]**2)/2*dx
for j in range(N-1):
J[j,j] = 1/dt + u[j]/dx
J[j+1,j] = 1/dt + u[j]/dx
F[j+1] = (u[j+1] - c[j+1])/dt + (u[j+1]**2 - u[j]**2)/2*dx
du = gmres(J,-F)[0]
u = u + du
return u
UM = EulerMethod(u0)
plt.plot(x,UM[:,ts])