我有一组6个方程式,我希望numpy为我解决。因此,我构建了一个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,均值和点是在其他位置计算的其他一些矩阵。)

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

最佳答案

问题在于,代表等号的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)


按照我的建议进行操作可能会更慢或更简洁,但是阅读起来会清晰得多。

关于python - 是否有更清晰的方法可以使用numpy解决线性方程组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14897587/

10-11 16:36