我在 Python 2.7.5 上编写了一个代码,以数值方式求解以下微分方程。
以这种方式选择 S 是为了使作为精确解,可以与构造的解进行比较。
微分算子使用二阶中心有限差分法离散化。
Err
运行代码时,对于第一批点N
(10,20,40,80,100,800,2000,5000)(下降到10e-11),离散化误差演化的数量级是正确的(二阶) .
但是我发现对于非常小的dx
意义,非常大的意义Nx
(10000,50000,100000,600000,900000),Err
不会停滞在机器精度误差上(如预期的那样),而是上升了几个数量级,更糟糕的是,离散化错误Err
恶化(高达 10e-7)。
对于非常小的数字,这是 Python 的精度/圆形管理中的一个问题,还是对于这么多的点有更糟糕的错误是正常的?
我尝试以不同的方式(矩阵、循环、矩阵反转技术)编写问题,但发生了同样的现象。
import numpy as np
import matplotlib.pyplot as plt
import scipy.sparse as sp
from scipy.sparse.linalg.dsolve import spsolve
Err=[]
N=np.array([10,20,40,80,100,800,2000,5000,10000,50000,100000,600000,900000])
#Loop on the number of points used for the discretization of the 1D domain
for Nx in N:
dx=(1.0)/Nx# fixed distance between two consecutive points in the domain
x = np.linspace(dx,1.0-dx,Nx-1)# points of the 1D domain
#contruction of the diff operator discretization Matrix
data = [np.ones(Nx-1), -2*np.ones(Nx-1), np.ones(Nx-1)]# Diagonal terms
offsets = np.array([-1, 0, 1])# Their positions
LAP = sp.dia_matrix((data, offsets), shape=(Nx-1, Nx-1))#Sparse matrix
S = np.pi**2*np.sin(np.pi*x)*dx**2# Second member
f = spsolve(LAP,-S)#Resolution of the matrix system
f_ana=np.sin(np.pi*x)#The exact solution
Err.append((np.absolute((f_ana-f))).max())
plt.figure()
plt.plot(N,Err,N,N**float(-2),'--')
plt.legend(['Err','Theoretical asymptotic behaviour'])
plt.xlabel('dx')
plt.ylabel('Err')
plt.xscale('log')
plt.yscale('log')
plt.show()