如何根据Numpy中的索引创建可以访问的数组?

时间:2016-07-07 20:35:29

标签: python arrays numpy matrix

我试图通过使用NumPy的Python中的有限差分近似来解决以下问题:

<$> $ u_t = k \,u_ {xx} $,$ 0&lt; x&lt; L $和$ t&gt; 0 $;

$ u(0,t)= u(L,t)= 0 $;

$ u(x,0)= f(x)$。

我为我的问题带了$ u(x,0)= f(x)= x ^ 2 $。

编程不是我的强项,所以我需要帮助实现我的代码。这是我的代码(我很抱歉这有点凌乱,但我希望不是太糟糕):

    ## This program is to implement a Finite Difference method approximation
## to solve the Heat Equation, u_t = k * u_xx,
## in 1D w/out sources & on a finite interval 0 < x < L. The PDE
## is subject to B.C: u(0,t) = u(L,t) = 0,
## and the I.C: u(x,0) = f(x).
import numpy as np
import matplotlib.pyplot as plt

# definition of initial condition function  
def f(x):
    return x^2

# parameters    
L = 1
T = 10
N = 10
M = 100
s = 0.25

# uniform mesh
x_init = 0
x_end = L
dx = float(x_end - x_init) / N

#x = np.zeros(N+1)
x = np.arange(x_init, x_end, dx)
x[0] = x_init

# time discretization
t_init = 0
t_end = T
dt = float(t_end - t_init) / M

#t = np.zeros(M+1)
t = np.arange(t_init, t_end, dt)
t[0] = t_init

# Boundary Conditions
for m in xrange(0, M):
    t[m] = m * dt

# Initial Conditions
for j in xrange(0, N):
    x[j] = j * dx

# definition of solution to u_t = k * u_xx
u = np.zeros((N+1, M+1)) # NxM array to store values of the solution

# finite difference scheme
for j in xrange(0, N-1):
    u[j][0] = x**2 #initial condition

for m in xrange(0, M):
    for j in xrange(1, N-1):
        if j == 1:
            u[j-1][m] = 0 # Boundary condition
        else: 
            u[j][m+1] = u[j][m] + s * ( u[j+1][m] - #FDM scheme
            2 * u[j][m] + u[j-1][m] )
        else:
            if j == N-1:
                u[j+1][m] = 0 # Boundary Condition

print u, t, x
#plt.plot(t, u)
#plt.show()

所以我遇到的第一个问题是我正在尝试创建一个数组/矩阵来存储解决方案的值。我希望它是一个NxM矩阵,但是在我的代码中我创建了矩阵(N+1)x(M+1),因为我不断收到索引超出范围的错误。无论如何我如何使用numpy.array制作这样的矩阵,以免通过创建一个填充零的(N+1)x(M+1)矩阵来不必要地占用内存?

其次,我怎样才能访问&#34;这样的阵列?真实解u(x,t)近似为u(x[j], t[m])j是第j个空间值,m是第m个时间值。有限差分格式由下式给出:

u(x[j],t[m+1]) = u(x[j],t[m]) + s * ( u(x[j+1],t[m]) - 2 * u(x[j],t[m]) + u(x[j-1],t[m]) )

(请参阅此处查看formulation

我希望能够为u(x[j],t[0]) = x**2的所有值实现初始条件j = 0,...,N-1。我还需要为u(x[0],t[m]) = 0 = u(x[N],t[m])的所有值实施边界条件t = 0,...,M。我创建的嵌套循环是最好的方法吗?最初我试图实施国际法委员会。和B.C.在两个不同的for循环下我用来计算矩阵xt的值(在我的代码中,我仍然在我尝试这样做的位置放置了评论)

我想我只是没有使用正确的符号,但我在NumPy的文档中找不到如何&#34;调用&#34;这样的数组,以便迭代所提出的方案中的每个值。谁能说清楚我做错了什么?

非常感谢任何帮助。这不是功课,而是要了解如何为热方程编程FDM,因为稍后我将使用类似的方法来解决Black-Scholes PDE。

编辑:所以当我在第60行运行我的代码时(最后一个&#34;否则&#34;我使用的)我得到一个错误,说明语法无效,并在第51行(u[j][0] = x**2 #initial条件)我得到一个错误,读取&#34;用序列设置数组元素。&#34;这是什么意思?

0 个答案:

没有答案