我试图用数值求解抛物型偏微分方程(PDE):
u't=u''xx-u(1-u)(0.3-u)
具有Neumann边界条件和类似步骤的函数作为初始条件。
预期的情节结果在这里
它可能有点误导:红色 - 是一个类似初始步骤的函数,平滑线在不同的迭代时间之后(如t = 50,100,150 ..)
这个想法是基于线的方法:使空间(x)离散,使用有限差分方法(二阶由对称中心逼近编写),标准Python scipy odeint(如果我和我可以使用隐式方法) #39; m没有记错)然后解决获得的一组ODE。我认为这是如何处理这种普通偏微分方式的非常标准的方法(如果我错了,请纠正我。)
以下是我正在运行的代码段。 简而言之,我想以矩阵形式表示上述连续方程: [U]' T = A * [U] + F([U]) 其中A是u' xx(乘以[u]后)的二阶对称渐近近似的矩阵
不幸的是,在运行代码之后,初始条件几乎没有发生任何质量上的重大问题,因此我对我的脚本或方法本身是否存在问题感到困惑。
定义右侧u(1-u)(0.3-u):
def f(u, h):
puff = []
for i in u:
puff.append(i*(1. - i)*(0.3 - i))
puff[0] = (h/2.)*puff[0] #this is to include
puff[len(puff)-1] = (h/2.)*puff[len(puff)-1]
return puff
定义空间分辨率:
h = 10.
x = np.linspace(0., 100., num=h)
这是通过有限差分(A * [u])来定义二阶导数:
diag = [-2]*(len(x))
diag[0] = -h
diag[len(x)-1] = h**2
diag_up = [1]*(len(x)-1)
diag_up[0] = h
diag_down = [1]*(len(x)-1)
diag_down[len(x)-2] = 0
diagonals = [diag, diag_up, diag_down]
A = diags(diagonals, [0, 1, -1]).toarray()
A = A/h**2
定义步骤式初始条件:
init_cond = [0]*(len(x))
for i in range(int(round(0.2*len(init_cond)))):
init_cond[i] = 1
使用定义的时间范围解决一组ODE。
t = np.linspace(0, 100, 200)
def pde(u, t, A, h):
dudt = A.dot(u) - f(u, h)
return dudt
sol = odeint(pde, init_cond, t, args=(A, h))
print(sol[len(sol)-1])
代码可能存在缺陷,因为我对Python很陌生。如果有任何我可以改进的地方,请告诉我。最终结果在这里
初始条件根本没有变化。任何人都可以给我一个暗示,我可以犯错吗?提前谢谢!