我试图通过使用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循环下我用来计算矩阵x
和t
的值(在我的代码中,我仍然在我尝试这样做的位置放置了评论)
我想我只是没有使用正确的符号,但我在NumPy的文档中找不到如何&#34;调用&#34;这样的数组,以便迭代所提出的方案中的每个值。谁能说清楚我做错了什么?
非常感谢任何帮助。这不是功课,而是要了解如何为热方程编程FDM,因为稍后我将使用类似的方法来解决Black-Scholes PDE。
编辑:所以当我在第60行运行我的代码时(最后一个&#34;否则&#34;我使用的)我得到一个错误,说明语法无效,并在第51行(u[j][0] = x**2
#initial条件)我得到一个错误,读取&#34;用序列设置数组元素。&#34;这是什么意思?