12

ランダム化を使用しないスクリプトを実行すると、さまざまな答えが得られます。スクリプトを実行するたびに、答えは同じになると思います。この問題は、特定の (悪条件の) 入力データでのみ発生するようです。

スニペットは、線形システムの特定のタイプのコントローラーを計算するアルゴリズムから来ており、主に線形代数 (逆行列、リカッチ方程式、固有値) を実行することで構成されています。

明らかに、これは私のコードが正しい結果をもたらすとは信じられないため、私にとって大きな懸念事項です。条件の悪いデータでは結果が間違っている可能性があることはわかっていますが、一貫して間違っていると予想しています。Windows マシンで答えが常に同じではないのはなぜですか? Linux マシンと Windows マシンで同じ結果が得られないのはなぜですか?

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win 32Numpy バ​​ージョン 1.8.2 および Scipy 0.14.0を使用しています。(Windows 8、64 ビット)。

コードは以下です。また、2 台の Linux マシンでコードを実行してみましたが、スクリプトは常に同じ答えを返します (ただし、マシンの答えは異なります)。1 つは、Numpy 1.8.2 および Scipy 0.14.0 で Python 2.7.8 を実行していました。2 つ目は、Numpy 1.6.1 と Scipy 0.12.0 で Python 2.7.3 を実行していました。

リカッチ方程式を 3 回解き、答えを出力します。毎回同じ答えを期待していますが、代わりにシーケンス '1.75305103767e-09; を取得します。3.25501787302e-07; 3.25501787302e-07'.

    import numpy as np
    import scipy.linalg

    matrix = np.matrix

    A = matrix([[  0.00000000e+00,   2.96156260e+01,   0.00000000e+00,
                        -1.00000000e+00],
                    [ -2.96156260e+01,  -6.77626358e-21,   1.00000000e+00,
                        -2.11758237e-22],
                    [  0.00000000e+00,   0.00000000e+00,   2.06196064e+00,
                         5.59422224e+01],
                    [  0.00000000e+00,   0.00000000e+00,   2.12407340e+01,
                        -2.06195974e+00]])
    B = matrix([[     0.        ,      0.        ,      0.        ],
                    [     0.        ,      0.        ,      0.        ],
                    [  -342.35401351, -14204.86532216,     31.22469724],
                    [  1390.44997337,    342.33745324,   -126.81720597]])
    Q = matrix([[ 5.00000001,  0.        ,  0.        ,  0.        ],
                    [ 0.        ,  5.00000001,  0.        ,  0.        ],
                    [ 0.        ,  0.        ,  0.        ,  0.        ],
                    [ 0.        ,  0.        ,  0.        ,  0.        ]])
    R = matrix([[ -3.75632852e+04,  -0.00000000e+00,   0.00000000e+00],
                    [ -0.00000000e+00,  -3.75632852e+04,   0.00000000e+00],
                    [  0.00000000e+00,   0.00000000e+00,   4.00000000e+00]])

    counter = 0
    while counter < 3:
            counter +=1

            X = scipy.linalg.solve_continuous_are(A, B, Q, R)
            print(-3449.15531628 - X[0,0])

私の派手な設定は以下の通りですprint np.show_config()

lapack_opt_info:
    ライブラリ = ['mkl_blas95'、'mkl_lapack95'、'mkl_intel_c'、'mkl_intel_thread'、'mkl_core'、'libiomp5md'、'mkl_blas95'、'mkl_lapack95'、'mkl_intel_c'、'mkl_intel_thread'、'mkl'corem libiomp'、 ]
    library_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/lib/ia32', 'C:/Program Files (x86)/Intel/Composer XE 2013 SP1/compiler/lib/ia32' ]
    define_macros = [('SCIPY_MKL_H', なし)]
    include_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/include']
blas_opt_info:
    ライブラリ = ['mkl_blas95', 'mkl_lapack95', 'mkl_intel_c', 'mkl_intel_thread', 'mkl_core', 'libiomp5md']
    library_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/lib/ia32', 'C:/Program Files (x86)/Intel/Composer XE 2013 SP1/compiler/lib/ia32' ]
    define_macros = [('SCIPY_MKL_H', なし)]
    include_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/include']
openblas_info:
  利用不可
lapack_mkl_info:
    ライブラリ = ['mkl_blas95'、'mkl_lapack95'、'mkl_intel_c'、'mkl_intel_thread'、'mkl_core'、'libiomp5md'、'mkl_blas95'、'mkl_lapack95'、'mkl_intel_c'、'mkl_intel_thread'、'mkl'corem libiomp'、 ]
    library_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/lib/ia32', 'C:/Program Files (x86)/Intel/Composer XE 2013 SP1/compiler/lib/ia32' ]
    define_macros = [('SCIPY_MKL_H', なし)]
    include_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/include']
blas_mkl_info:
    ライブラリ = ['mkl_blas95', 'mkl_lapack95', 'mkl_intel_c', 'mkl_intel_thread', 'mkl_core', 'libiomp5md']
    library_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/lib/ia32', 'C:/Program Files (x86)/Intel/Composer XE 2013 SP1/compiler/lib/ia32' ]
    define_macros = [('SCIPY_MKL_H', なし)]
    include_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/include']
mkl_info:
    ライブラリ = ['mkl_blas95', 'mkl_lapack95', 'mkl_intel_c', 'mkl_intel_thread', 'mkl_core', 'libiomp5md']
    library_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/lib/ia32', 'C:/Program Files (x86)/Intel/Composer XE 2013 SP1/compiler/lib/ia32' ]
    define_macros = [('SCIPY_MKL_H', なし)]
    include_dirs = ['c:/Program Files (x86)/Intel/Composer XE 2013 SP1/mkl/include']
なし

(質問を削除するために編集)

4

2 に答える 2

2

user333700の回答へのコメントでpvが指摘したように、Riccati ソルバーの以前の定式化は、理論的には正しいものの、数値的に安定していませんでした。この問題は SciPy の開発版では修正されており、ソルバーは一般化された Riccati 方程式もサポートしています。

Riccati ソルバーが更新され、結果のソルバーはバージョン 0.19 以降で利用できるようになります。開発ブランチのドキュメントはこちらで確認できます。

質問の例を使用して、最後のループを次のように置き換えた場合

for _ in range(5):
    x = scipy.linalg.solve_continuous_are(A, B, Q, R)
    Res = x@a + a.T@x + q - x@b@ np.linalg.solve(r,b.T)@ x
    print(Res)

私は得る(Windows 10、py3.5.2)

[[  2.32314924e-05  -2.55086270e-05  -7.66709854e-06  -9.01878229e-06]
 [ -2.62447211e-05   2.61182140e-05   8.27328768e-06   1.00345896e-05]
 [ -7.92257197e-06   8.57094892e-06   2.50908488e-06   3.05714639e-06]
 [ -9.51046241e-06   9.80847472e-06   3.13103374e-06   3.60747799e-06]]
[[  2.32314924e-05  -2.55086270e-05  -7.66709854e-06  -9.01878229e-06]
 [ -2.62447211e-05   2.61182140e-05   8.27328768e-06   1.00345896e-05]
 [ -7.92257197e-06   8.57094892e-06   2.50908488e-06   3.05714639e-06]
 [ -9.51046241e-06   9.80847472e-06   3.13103374e-06   3.60747799e-06]]
[[  2.32314924e-05  -2.55086270e-05  -7.66709854e-06  -9.01878229e-06]
 [ -2.62447211e-05   2.61182140e-05   8.27328768e-06   1.00345896e-05]
 [ -7.92257197e-06   8.57094892e-06   2.50908488e-06   3.05714639e-06]
 [ -9.51046241e-06   9.80847472e-06   3.13103374e-06   3.60747799e-06]]
[[  2.32314924e-05  -2.55086270e-05  -7.66709854e-06  -9.01878229e-06]
 [ -2.62447211e-05   2.61182140e-05   8.27328768e-06   1.00345896e-05]
 [ -7.92257197e-06   8.57094892e-06   2.50908488e-06   3.05714639e-06]
 [ -9.51046241e-06   9.80847472e-06   3.13103374e-06   3.60747799e-06]]
[[  2.32314924e-05  -2.55086270e-05  -7.66709854e-06  -9.01878229e-06]
 [ -2.62447211e-05   2.61182140e-05   8.27328768e-06   1.00345896e-05]
 [ -7.92257197e-06   8.57094892e-06   2.50908488e-06   3.05714639e-06]
 [ -9.51046241e-06   9.80847472e-06   3.13103374e-06   3.60747799e-06]]

参考までに、返されたソリューションは次のとおりです。

array([[-3449.15531305,  4097.1707738 ,  1142.52971904,  1566.51333847],
       [ 4097.1707738 , -4863.70533241, -1356.66524959, -1860.15980716],
       [ 1142.52971904, -1356.66524959,  -378.32586814,  -518.71965102],
       [ 1566.51333847, -1860.15980716,  -518.71965102,  -711.21062988]])
于 2016-10-15T15:53:09.037 に答える