web-dev-qa-db-ja.com

LinAlgError:配列の最後の2次元は正方でなければなりません

[〜#〜] a [〜#〜] x = [〜#〜] b [〜#〜]の形式の連立方程式を解く必要があります。 xの場合。 numpy.linalg.solve関数を使用してAとBを入力しましたが、エラー「LinAlgError:配列の最後の2次元は正方形でなければなりません」が表示されます。どうすれば修正できますか?

私のコードは次のとおりです。

A = matrix([[v1x, v2x], [v1y, v2y], [v1z, v2z]])
print A

B = [(p2x-p1x-nmag[0]), (p2y-p1y-nmag[1]), (p2z-p1z-nmag[2])]
print B

x = numpy.linalg.solve(A, B)

マトリックス/ベクトルの値はコードの前半で計算され、これは正常に機能しますが、値は次のとおりです。

[〜#〜] a [〜#〜] =

(-0.56666301, -0.52472909)
(0.44034147, 0.46768087)
(0.69641397,  0.71129036)

[〜#〜] b [〜#〜] =

(-0.38038602567630364, -24.092279373295057, 0.0)

xの形式は(x1、x2,0)でなければなりません

7
K Jackson

まだ答えが見つからない場合、または将来誰かがこの質問を持っている場合。

解くにはAx = b

numpy.linalg.solveはLAPACK gesvを使用します。 LAPACKのドキュメント で述べたように、gesvは[〜#〜] a [〜#〜]が正方形である必要があります。

LA_GESVは、実数または複素数の線形連立方程式AX = Bの解を計算します。ここで、Aは正方行列、XおよびBは長方形行列またはベクトルです。行交換によるガウス消去法は、A = PL * UとしてAを因数分解するために使用されます。ここで、Pは置換行列、Lは単位下三角、Uは上三角です。次に、Aの因数分解された形式を使用して、上記のシステムを解きます。

[〜#〜] a [〜#〜]行列が正方でない場合、方程式よりも多くの変数を持っているか、他の方法であることを意味します周り。このような状況では、解決策がない場合や無限の解決策がある場合があります。解空間を決定するのは、列の数と比較した行列のランクです。したがって、最初にマトリックスのランクを確認する必要があります。

そうは言っても、別の方法を使用して線形方程式系を解くことができます。 LUまたはQRまたはSVDのような因数分解メソッドを見ることをお勧めします。LAPACKではgetrsを使用でき、Python異なるもの:

  • 最初にQRのような因数分解を行い、次に結果の行列をscipy.linalg.solve_triangularのようなメソッドに送ります
  • numpy.linalg.lstsqを使用して最小二乗を解く

また、簡単な例を定式化して解決する here を見てください。

13
Keivan

正方行列は、行と列の数が同じ行列です。実行しているマトリックスは3 x 2です。この問題を修正するには、ゼロの列を追加します。

2
ashish trehan