有限差分波动方程

问题描述 投票:0回答:1

我正在尝试使用这种有限差分法求解波动方程(并随后对解进行动画处理)。然而,它似乎只为每个时间步产生相同的解决方案,以便动画保持不变。怎么了?

Tension=100 #N
mu = .1 #

v= (Tension/mu)**0.5
L=1 #string length
Nx=200
SimulationTime=.2


x = linspace(0, L, Nx+1) # Mesh points in space
 
dx = x[1] - x[0]
Nt = 1000
dt = SimulationTime/Nt
t = linspace(0, Nt*dt, Nt+1)
V = v*dt/dx
V2 = V**2

Lambda=.1

u = zeros(Nx+1) # t
u_1 = zeros(Nx+1) # t-1dt
u_2 = zeros(Nx+1) # t-2dt

# function that can be used to describe initial conditions
#Note - I should be zero at the boundary and dI/dx should not have a very large value at the boundary.  
I = lambda x: 1e-3*x*(1-x)  
#I = lambda x: 1.e-3*np.sin(2*np.pi*x/Lambda) 
#I = lambda x: 1.e-3*signal.gausspulse(x-Nx*dx/2, fc=10)

for i in range(0,int(Nx)):
     u_1[i] = I(x[i]) #u_1 - solution at time n-1 - Here we put initial conditions for t=0; 


n=0  #First timepoint
for i in range(1, Nx):
     u[i] = u_1[i] -0.5*V2*(u_1[i-1] - 2*u_1[i] + u_1[i+1])  


# Use variable user_data to store u  for each iteration over time.          
user_data = {}
user_data['x'] = x
user_data['u'] = []
#(n, u)


u_2[:] = u_1
u_1[:] = u
for n in range(1, Nt):
     #Compute the values of the whole string at a given timepoint
     for i in range(1, Nx):
          u[i] = -u_2[i]+2*u_1[i]+V2*(u_1[i+1]-2*u_1[i]+u_1[i-1])
     u[0]=0
     u[Nx]=0
     u_2[:] = u_1
     u_1[:] = u

     user_data['u'].append(u)

我尝试了很多不同的调整,但解决方案似乎保持不变。

python math
1个回答
0
投票

您在每个时间步都附加(引用)u。所以每一个都将是...u[]的最新值!

您需要附加一份副本:

user_data['u'].append(u.copy())
© www.soinside.com 2019 - 2024. All rights reserved.