私は、PythonでA = Bxという形式の線形代数問題を扱い、これをMATLABとMathematicaの同僚のコードと比較しています。 Bが特異行列であるときに、Pythonと他のものとの違いに気付きました。 numpy.linalg.solve()
を使用すると、私は特異行列エラーを投げるので、代わりに.pinv()
(Moore Penrose擬似逆行列)を実装しました。特異行列の方程式を扱うときにMathematicaとPythonの答えが異なるのはなぜですか?
逆行列の格納は計算効率が悪く、Pythonで特異行列を扱うより良い方法があるかどうか不思議です。しかし、私の疑問は、Pythonが無限の解空間から答えを選ぶ方法、そしてなぜMATLABとMathematica以外のものを選ぶのかということにあります。
B = np.array([[2,4,6],[1,0,3],[0,7,0]])
A = np.array([[12],[4],[7]])
BI = linalg.pinv(B)
x = BI.dot(A)
私にはPythonの出力がある答え:ここで
は私のおもちゃの問題である[[ 0.4]
[ 1. ]
[ 1.2]]
これが正しい答えは確かですが、それは私が意図したものではありません:(1,1,1)。なぜPythonはこの特定のソリューションを生成しますか?可能な解決策ではなく、ソリューションのスペースを返す方法はありますか?私の同僚のコードが返されました(1、1、1) - PythonがMathematicaとMATLABと異なるのはなぜですか?
より便利な比較のために、代わりに 'BI'を印刷しないでください。 – Eric
_ "私の同僚のコードが返されました(1,1,1)" _ - これはmatlab、mathematica、またはその両方でしたか?そのコードを表示できますか? – Eric
'pinv(B)* A'は私にmatlabと同じ結果を与えます。だからあなたのMATLABコードは何ですか? – Eric