2

numpy で解いてもらいたい 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 は、他の場所で計算された他の行列です。)

もちろん、上記のコードにはさらにコメントを付けることができますが、いくつかのコメントを付けても、解かれている基礎となる方程式を実際に伝えることができないと感じています。方程式をソルバーに入力して、より読みやすいコードにするより良い方法はありますか?

4

1 に答える 1

1

問題は、等号を表す A の行が、コード行に 1 対 1 でマッピングされていないことです。私が自分の仕事 (経済学) で行っていることは、A の各行に明確な英語名 (または関数表現のない少なくとも 1 行のコード) を持つ関数を用意することです。必要に応じて、明確なしかし、私が最終的に使用するコードと同じことを行うコードの遅いバージョンまたはおそらくはるかに長いバージョンです。

たとえば (Bretscher's Linear Algebra with Applications 1997, ex. 37 p. 29 から、非現実的ではあるが単純な例)、I1、I2、I3 という 3 つの産業があり、それぞれが他の 2 つの産業の産出を入力として取る経済を考えてみよう。消費者や産業の需要を満たすには、どのような製品を生産する必要がありますか?

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)

おそらく、私が提案することを行うのは遅くなるか、簡潔ではなくなりますが、読むのははるかに明確になります.

于 2013-04-05T13:06:14.360 に答える