2017-12-05 32 views
1

私のコードは、最初の反復のために罰金を実行しているが、その後、それは、次のエラー出力:であまりされていない(私の知る限りニュートン法(方程式のシステム)

ValueError: matrix must be 2-dimensional 

をPython)、私のコードは正しいです。しかし、なぜ私はすべての与えられた反復で正しく動作していないのかわかりません。この問題で誰も助けてくれませんか?

from __future__ import division 
import numpy as np 
import math 
import matplotlib.pylab as plt 
import sympy as sp 
from numpy.linalg import inv 

#initial guesses 
x = -2 
y = -2.5 
i1 = 0 

while i1<5: 
    F= np.matrix([[(x**2)+(x*y**3)-9],[(3*y*x**2)-(y**3)-4]]) 
    theta = np.sum(F) 
    J = np.matrix([[(2*x)+y**3, 3*x*y**2],[6*x*y, (3*x**2)-(3*y**2)]]) 
    Jinv = inv(J) 
    xn = np.array([[x],[y]])  
    xn_1 = xn - (Jinv*F) 
    x = xn_1[0] 
    y = xn_1[1] 
    #~ print theta 
    print xn 
    i1 = i1+1 
+0

'x = xn_1 [0]; y = xn_1 [1] 'はあなたのnumpy配列の* 1番目と2番目の行*をとります。これは、2回目の反復では、[[(x ** 2)+(x * y ** 3)-9]、[(3 * y * x ** 2) - ]] 'は2次元以上の値を返します。これはあなたが望むかもしれないし、そうでないかもしれませんが、' np.matrix'オブジェクト*は* 2次元でなければなりません。 'x'と' y'はどんな値をとるべきですか?また、一般的に 'np.matrix'は避けてください。これはかなり推奨されていません...しかし、あなたは*間違いなく* 2つを混ぜ合わせるべきではないでしょう。 –

答えて

1

x = xn_1[0] 
y = xn_1[1] 

を変更。印刷してみてください[[something], [something]]

したがって、xとyを得るには、多次元インデックスを使用する必要があります。 2次元マトリックス内xn_1は、2つの素子アレイであるため、ここで私は

x = xn_1[0,0] 
y = xn_1[1,0] 

やったこれは動作します。したがって、その単一の要素を取得するために、さらに索引付けする必要があります。

編集:明確にするために、xn_1[1,0]は1をインデックス化し、そのサブアレイとインデックス0を意味します。 And although according to Scipyxn_1[1][0]と機能的に同等である必要がありますが、それは一般的なnp.arrayタイプにのみ適用され、np.matrixタイプには適用されません。 Here is an excellent thread on SO that explains this

したがって、希望する要素を取得するにはxn_1[1,0]の方法を使用する必要があります。

1

xn_1 numpyの行列であるので、要素がitem()方法でアクセスされます、配列を好きではありません。 ([] sの)

だから、私はxn_1が2D行列であると考えてい

x = xn_1.item(0) 
y = xn_1.item(1) 
+0

?要素のアクセスは 'numpy.ndarray'オブジェクトと' np.matrix'オブジェクトの両方で同じように動作します。 –

+0

'xn_1 [0]'は別の 'np.matrix'オブジェクトを返します。理由は分かりませんが、行列オブジェクトにインデックスを使用すると、他の 'np.matrix'オブジェクトだけが返されるようです。実際の数を取得するには、 'item()'を使う必要があります。 'xn_1 [0] [0]'は 'xn_1 [0]'と同じものを返します。 – coolioasjulio

+0

はい、 'xn_1'と同じ形の' some_array'もスカラーではないオブジェクト*を返します。しかし、 'np.matrix'オブジェクトは常に2次元を持つように強制されます。だからそこには矛盾がある。しかし、根本的には、 'xn_1 [0、0]'を使い、連鎖インデックスに依存しないようにする必要があります(これは、さまざまなresonsのために 'numpy.ndarrays'でも避けてください) –

関連する問題