是否有更简洁的方法来解决numpy的线性方程组?

时间:2013-02-15 15:10:15

标签: python numpy linear-algebra

我有一套6个方程式,我想为我解决这个问题。所以我构造了一个6x6的系数矩阵,并用各种值填充它。但是,我最后编写的代码是非常难以理解的,并且很少传达我想要解释给我的代码的读者的方程式。

例如,填写系数矩阵看起来像这样:

# Coefficients matrix
# Order of variables: w, X, Y, Z, s, t
A = np.mat( np.zeros((6,6)) )

A[0:3,0] = cam_inv[...,2]
A[0:3,1:4] = -np.identity(3)
A[3:6,1:4] = np.identity(3)
A[3:,4] = -eigvecs[...,0]
A[3:,5] = -eigvecs[...,1]

# Constants matrix (RHS of equation)
b = np.mat( np.zeros((6,1)) )
b[0:3,0] = -cam_inv[...,0:2] * point
b[3:,] = mean.T

res = np.linalg.solve(A,b)

(其中cam_inv,eigvecs,mean和point是其他地方计算的其他矩阵。)

显然上面的代码可以有更多的注释,但我觉得即使有一些注释,它仍然无法真正传达正在解决的基础方程式。是否有更好的方法将方程式输入求解器,从而使代码更清晰?

1 个答案:

答案 0 :(得分:1)

问题是表示等式的A行与代码行没有一对一的映射关系。我在自己的工作(经济学)中所做的是为A的每一行提供一个具有清晰英文名称(或至少一行代码,没有功能表示)的函数。必要时,我有一个明确的但代码的速度很慢或者可能长得多,与我最终使用的代码完全相同。

因此,例如(来自Bretscher的线性代数与应用1997,例如37页29,一个简单的,不切实际的例子),考虑一个有三个行业的经济体,I1,I2,I3,每个行业都将其他两个行业产出作为输入。他们应该产生哪些产出来满足消费者和工业需求?

A =np.zeros((3,3)) 
#Each unit of production by I1 requires 0.1 units of good 2 and .2 of good 3
A[:,0] = [0, 0.1, 0.2] 
#Each unit of production by I2 requires 0.2 units of good 1 and .5 of good 3
A[:,1] = [0.2, 0, 0.5] 
#Each unit of production by I3 requires 0.3 units of good 1 and .4 of good 2    
A[:,2] = [0.3, 0.4, 0] 
#The required production for consumers. 
b = np.array([320,150,90]).reshape(-1,1)
#The optimal production levels of x1, x2, and x3
res = np.linalg.solve(A,b)

根据我的建议,这可能会更慢或更简洁,但阅读起来会更清楚。