2013-04-12 34 views
2

我需要解決不同大小的線性方程。有時候,大小可能是0或1,在這種情況下會發生一些錯誤。例如,spsolve和解決意外的差異

import numpy as np 
from numpy.linalg import solve 
from scipy.sparse.linalg import spsolve 
A1 = np.array([[1,2],[2,1]]) 
b1 = np.array([[1],[1]]) 
A2 = np.array([[1]]) 
b2 = np.array([[1]]) 

一些意想不到的結果時會發生呼叫SPSOLVE或解決:

sage: solve(A1,b1) 
array([[ 0.33333333], 
     [ 0.33333333]]) 
sage: solve(A2,b2) 
array([[ 1.]]) 
sage: spsolve(A1,b1) 
array([ 0.33333333, 0.33333333]) 
sage: spsolve(A2,b2) 
ValueError: object of too small depth for desired array 

注意的「SPSOLVE(A1,B1)」,實際上產生一個行向量,呼叫反正是有強制它成爲列向量?另外,調用「spsolve(A2,b2)」的錯誤也很奇怪,因爲A1和b1的大小不爲零。

回答

1

spsolve不返回2d數組,而是1d向量。

使用numpy.atleast_2d以膨脹矢量,例如,在你的例子

In [10]: np.atleast_2d(spsolve(A1,b1)).T 
Out[10]: 
array([[ 0.33333333], 
     [ 0.33333333]]) 

.T得到的柱(2d)的載體中。這可能也解決了第二個問題,與結果向量的深度有關。

(我不使用鼠尾草,所以我不能重現你的錯誤。)

+0

有趣。我在python-2.6上試過你的方法,它沒有任何錯誤。但在Sage-5.3中,它總是彈出錯誤消息:「97選項=字典(ColPerm = permc_spec) 98 return _superlu.gssv(N,A.nnz,A.data,A.indices,A.indptr,b,標記, ---> 99 options = options)[0] 101 def splu(A,permc_spec = None,diag_pivot_thresh = None, ValueError:對於所需數組的深度太小的對象「 – zhh210