Python spsolve ValueError
Python spsolve ValueError
我正在尝试使用 spsolve 求解规范形式的系统。
不幸的是,我收到一条我不理解的错误消息。
我的代码
A11 = nablaTnabla + lamda*diag_Ix_squared
A12 = lamda*diag_Ix_Iy
A21 = lamda*diag_Ix_Iy
A22 = nablaTnabla + lamda*diag_Iy_squared
b0 = lamda*(Ix*(Ix*u_0 + Iy*v_0 - It))
b1 = lamda*(Iy*(Ix*u_0 + Iy*v_0 - It))
A = np.matrix([[A11,A12],[A21,A22]])
b0 = b0.flatten()
b1 = b1.flatten()
b = np.array([b0,b1])
u,v = sp.linalg.spsolve(A,b)
我收到以下 spsolve 错误消息:
ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()。
A 的形状为:(2,2)
b 的形状为:(2, 226592)
我不知道如何解决该错误。有人可以帮我吗?
我发现了问题。我混淆了稀疏矩阵和密集矩阵,所以 spsolve 无法计算系统。
变量 diag_Ix_squared 是一个稀疏矩阵,所以其余的也必须是一个。
M = u.shape[0]
N = u.shape[1]
nabla = spnabla(M,N)
nablaTnabla = nabla.T*nabla
u_0 = u
v_0 = v
Ix_flat = Ix.flatten()
Iy_flat = Iy.flatten()
diag_Ix_squared = sp.spdiags(Ix_flat*Ix_flat, 0, M*N, M*N)
diag_Ix_Iy = sp.spdiags(Ix_flat*Iy_flat, 0, M*N, M*N)
diag_Iy_squared = sp.spdiags(Iy_flat*Iy_flat, 0, M*N, M*N)
A11 = nablaTnabla + lamda*diag_Ix_squared
A12 = lamda*diag_Ix_Iy
A21 = lamda*diag_Ix_Iy
A22 = nablaTnabla + lamda*diag_Iy_squared
b0 = lamda*(Ix*(Ix*u_0 + Iy*v_0 - It))
b0 = b0.ravel()
b1 = lamda*(Iy*(Ix*u_0 + Iy*v_0 - It))
b1 = b1.ravel()
A = sp.bmat([[A11,A12],[A21,A22]])
b = np.concatenate((b0,b1))
x = sp.linalg.spsolve(A,b)
u = x[:M*N]
v = x[M*N:]
u = np.reshape(u, (M,N))
v = np.reshape(v, (M,N))
我正在尝试使用 spsolve 求解规范形式的系统。 不幸的是,我收到一条我不理解的错误消息。
我的代码
A11 = nablaTnabla + lamda*diag_Ix_squared
A12 = lamda*diag_Ix_Iy
A21 = lamda*diag_Ix_Iy
A22 = nablaTnabla + lamda*diag_Iy_squared
b0 = lamda*(Ix*(Ix*u_0 + Iy*v_0 - It))
b1 = lamda*(Iy*(Ix*u_0 + Iy*v_0 - It))
A = np.matrix([[A11,A12],[A21,A22]])
b0 = b0.flatten()
b1 = b1.flatten()
b = np.array([b0,b1])
u,v = sp.linalg.spsolve(A,b)
我收到以下 spsolve 错误消息: ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()。
A 的形状为:(2,2) b 的形状为:(2, 226592)
我不知道如何解决该错误。有人可以帮我吗?
我发现了问题。我混淆了稀疏矩阵和密集矩阵,所以 spsolve 无法计算系统。 变量 diag_Ix_squared 是一个稀疏矩阵,所以其余的也必须是一个。
M = u.shape[0]
N = u.shape[1]
nabla = spnabla(M,N)
nablaTnabla = nabla.T*nabla
u_0 = u
v_0 = v
Ix_flat = Ix.flatten()
Iy_flat = Iy.flatten()
diag_Ix_squared = sp.spdiags(Ix_flat*Ix_flat, 0, M*N, M*N)
diag_Ix_Iy = sp.spdiags(Ix_flat*Iy_flat, 0, M*N, M*N)
diag_Iy_squared = sp.spdiags(Iy_flat*Iy_flat, 0, M*N, M*N)
A11 = nablaTnabla + lamda*diag_Ix_squared
A12 = lamda*diag_Ix_Iy
A21 = lamda*diag_Ix_Iy
A22 = nablaTnabla + lamda*diag_Iy_squared
b0 = lamda*(Ix*(Ix*u_0 + Iy*v_0 - It))
b0 = b0.ravel()
b1 = lamda*(Iy*(Ix*u_0 + Iy*v_0 - It))
b1 = b1.ravel()
A = sp.bmat([[A11,A12],[A21,A22]])
b = np.concatenate((b0,b1))
x = sp.linalg.spsolve(A,b)
u = x[:M*N]
v = x[M*N:]
u = np.reshape(u, (M,N))
v = np.reshape(v, (M,N))