Python解决ValueError
Posted
技术标签:
【中文标题】Python解决ValueError【英文标题】:Python spsolve ValueError 【发布时间】:2018-07-22 11:31:18 【问题描述】:我正在尝试使用 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)
我不知道如何解决这个错误。有谁能帮帮我吗?
【问题讨论】:
【参考方案1】:我发现了问题。我将稀疏矩阵与密集矩阵混淆了,因此 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))
【讨论】:
以上是关于Python解决ValueError的主要内容,如果未能解决你的问题,请参考以下文章
如何在解决python中的条件时解决python中的位置索引错误?