[〜#〜] 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)でなければなりません
まだ答えが見つからない場合、または将来誰かがこの質問を持っている場合。
解くには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異なるもの:
scipy.linalg.solve_triangular
のようなメソッドに送りますnumpy.linalg.lstsq
を使用して最小二乗を解くまた、簡単な例を定式化して解決する here を見てください。
正方行列は、行と列の数が同じ行列です。実行しているマトリックスは3 x 2です。この問題を修正するには、ゼロの列を追加します。