我一直在试图弄清楚过去两天我做错了什么。我不知道我是否真的做错了什么,或者在通常的越级问题中错误是否应该如此之大。我试着用一个精确的数值来检查我的数值解。具体来说,字符串的初始条件是
和
具有精确解
pde 是
第一个初始条件给我所有 ,第二个初始条件给我
其中 C 是 Courant 数
找到进一步的时间步
我确保满足 Courant 条件。波的幅度为 0.25 个单位,而仅在 316 个时间步之后就有 0.1 个单位的误差。大约是 0.316 秒。我不认为越级方法具有如此弱的可预测性(是吗?)。如果我增加时间步长,那么直到误差达到 0.1 的时间步数只会以相同的比例减少。我今天尝试将其与另一个精确的解决方案相匹配,但错误更大。我确信我的方法有问题,但我似乎无法弄清楚是什么。我非常有信心我的重复关系是正确的。如果误差真的应该这么大,那么对于这类问题的误差是否有任何分析公式可以用来正确选择我的参数?
这是我在 python 中的代码(使用更快的算法进行编辑,因为我只需要知道最后两个时间步的值即可计算下一个时间步的值):
import numpy as np
from math import *
# Exact Soln
def y_exact(x,t):
if t==0:
return x*(1-x)
else:
sum = 0
for i in range(1,n):
if i%2 == 1:
sum += 8*sin(i*pi*x)*cos(v*i*pi*t)/((i**3)*(pi**3))
return sum
n = 200
v = 1
tolerance = 0.1
L = 1
T = 1
x = np.linspace(0,L,10)
t = np.linspace(0,T,1000)
dx = x[1] - x[0]
dt = t[1] - t[0]
c = dx/dt
C = v/c
C2 = C*C
nx = len(x)
y = np.zeros((nx,3))
max_error = 0
# Initial condition 1
for i in range(nx):
y[i,0] = y_exact(x[i],0)
# Initial condition 2
for i in range(nx):
if i == 0 or i == (nx - 1) : # Boundary Condition
y[i,1] = 0
else:
y[i,1] = y[i,0] + 0.5*C2*(y[i+1,0] + y[i-1,0] - 2*y[i,0])
for j in range(2,len(t)):
if max_error >= tolerance :
print(f"Error exceeded {tolerance} at time step number {j-1}.")
break
for i in range(nx):
if i==0 or i == (nx -1):
y[i,2] = 0
else:
y[i,2] = 2*y[i,1] - y[i,0] + C2*(y[i+1,1] + y[i-1,1] - 2*y[i,1])
error = abs(y[i,2] - y_exact(x[i],dt*j))
if error >= max_error :
max_error = error
for k in range(nx):
y[i,0] = y[i,1]
y[i,1] = y[i,2]
print(f"Maximum value of error was {max_error}")
```