4

numpy 1.3.0 と MATLAB 7.9.0 を使用すると、次の問題が発生します: python コード

import numpy as np    
Lu = [[1.01250000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-0.00250000000000000,1.01250000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,-0.00250000000000000,1.01250000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,-0.00250000000000000,1.01250000000000,0,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0,0,0,0,0],[-0.00250000000000000,0,0,0,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0,0,0,0],[0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0,0,0],[0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0,0],[0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,0,0,0,-0.00250000000000000,0,0,0,0,0,0,0,0],[0,0,0,0,-0.00250000000000000,0,0,0,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0,0],[0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0,0],[0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0,0,0],[0,0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,0,0,0,-0.00250000000000000,0,0,0,0],[0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,0,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0,0],[0,0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0,0],[0,0,0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,-0.00250000000000000,0,0,-0.00250000000000000,0],[0,0,0,0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01000000000000,0,0,0,-0.00250000000000000],[0,0,0,0,0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,0,1.01250000000000,-0.00250000000000000,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01250000000000,-0.00250000000000000,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01250000000000,-0.00250000000000000],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-0.00250000000000000,0,0,-0.00250000000000000,1.01250000000000]]
rhs = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0,0, 0,  0, 0, 0.0050, 0.0050, 0.0050, 0.0050]

Lu = np.array(Lu)
rhs = np.array(rhs)
ans = np.linalg.solve(Lu,rhs)
print ans

出力を生成します

[  1.87241716e-13   1.89545264e-13   1.89545264e-13   1.87241716e-13
   7.56433496e-11   7.63890449e-11   7.63890449e-11   7.56433496e-11
   3.04833369e-08   3.07089522e-08   3.07089522e-08   3.04833369e-08
   1.22844835e-05   1.23451480e-05   1.23451480e-05   1.22844835e-05
   4.95055571e-03   4.96277946e-03   4.96277946e-03   4.95055571e-03]

一方、MATLAB でバックスラッシュを使用すると出力が生成されます

 0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0000    0.0050    0.0050    0.0050    0.0050

numpy と matlab が異なる解を生成する線形代数方程式の他のシステムは見つかりませんでした。私は現在外出しているため、別のバージョンの numpy (別のコンピューター上) で正しい結果が得られるかどうかを確認できません。np.linalg.solve は、このシステムを解決するために使用する正しい関数ではありませんか (システム行列 Lu はスパースです)? これは私のバージョンの numpy のバグですか? 私のコードに何か問題がありますか?

ありがとう!

4

1 に答える 1

4

実際には、それらはおそらく同じ解決策です。MATLABは0.0000に丸めています(少なくとも印刷する場合)が、Pythonははるかに詳細な数値を提供します(いくつかの問題は浮動小数点の丸め誤差に起因する可能性があります)。0.0050として表示されているのは、である番号だけですe-03。他のすべての数値は0.0005より小さいため、0.0000に丸められる可能性があります。

于 2012-04-07T11:27:33.400 に答える