Pythonで2次元関数の1次導関数を計算したいと思います。 Pythonの行列乗算の疎行列と密行列の違い
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*A+(T.transpose()*A).transpose()
でライン
T*B+(T.transpose()*B).transpose()
を交換する場合でも、結果が大きく変化します。どうして?
「B = scspar.csc_matrix(A)」を設定しているので、それらは等しいはずですか? –
私は直接の経験はありませんが、等価演算子は過負荷になる可能性があります。私はちょうど確認した、そう、それはそうだ:https://github.com/scipy/scipy/blob/69170135bd5e5b1e9b4d712ca9a4307283780f14/scipy/sparse/base.py#L309 – JDong
そしてそれは意味する? –