我想计算Python中2d函数的一阶导数。为此我编写了以下脚本:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.sparse as scspar
r_num = 10000
r_vec = np.linspace(-10, 10, r_num)
X_mat, Y_mat = np.meshgrid(r_vec, r_vec)
x_square = lambda X, Y: np.exp(-np.power(X, 2)/2-np.power(Y, 2)/2)
dh = abs(r_vec[1]-r_vec[0])
A = (np.eye(r_num)*(-30)+np.eye(r_num, k=-1)*(16)+np.eye(r_num, k=1)*(16)-np.eye(r_num, k=2)-np.eye(r_num, k=-2))/(12*dh*dh)
C = (np.eye(r_num)*(-30)+np.eye(r_num, k=-1)*(16)+np.eye(r_num, k=1)*(16)-np.eye(r_num, k=-2)-np.eye(r_num, k=2))/(12*dh*dh)
B = scspar.csc_matrix((np.eye(r_num)*-30+np.eye(r_num, k=-1)*16+np.eye(r_num, k=1)*16-np.eye(r_num, k=-2)-np.eye(r_num, k=2))/(12*dh*dh))
T = x_square(X_mat, Y_mat)
plt.imshow(A-B)
plt.show()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X_mat, Y_mat, T*B+(T.transpose()*B).transpose())
plt.show()
现在矩阵A
和B
是相等的,除了一个被定义为稀疏,另一个被定义为密集。但是在更换线路时
T*B+(T.transpose()*B).transpose()
与
T*A+(T.transpose()*A).transpose()
结果发生了显着变化。为什么呢?
答案 0 :(得分:0)
如果它们相同,它们应该具有相同的结果。因此,你可以得出结论,你在某个地方犯了错误。
来自scipy docs:
尽管它们与NumPy阵列有相似之处,但强烈反对 因为NumPy可以直接在这些矩阵上使用NumPy函数 没有正确地将它们转换为计算,导致意外(和 不正确的)结果。如果您确实想要将NumPy函数应用于这些函数 矩阵,首先检查SciPy是否有自己的实现 给定稀疏矩阵类,或将稀疏矩阵转换为NumPy 数组(例如,使用类的toarray()方法)之前 应用该方法。
实际上,文档告诉我们不要在这些稀疏矩阵上使用numpy函数,而是使用specialized functions from scipy来操作稀疏矩阵。