使用行

时间:2017-07-27 18:35:04

标签: python scipy numerical-methods pde

我试图用数值求解抛物型偏微分方程(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很陌生。如果有任何我可以改进的地方,请告诉我。最终结果在这里

初始条件根本没有变化。任何人都可以给我一个暗示,我可以犯错吗?提前谢谢!

0 个答案:

没有答案