4

次の関数を定義しています。

def eigval(matrix):
    a = matrix[0, 0]
    b = matrix[0, 1]
    c = matrix[1, 0]
    d = matrix[1, 1]
    c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
    c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
    return c1 / 2, c2 / 2

2 X 2 行列の固有値を見つけるために作成されます。これを使用して、行列でヤコビ アルゴリズムを繰り返し実行しています。渡される行列は、タプルをキーとして使用して位置を表し、浮動小数点数を値として使用する辞書です。この関数は、約 6 回の繰り返しで正常に動作しますが、次の結果が得られます。

TypeError: __getitem__() takes exactly 2 arguments (2 given) 

ブロックの最初の行 (a のある行)。

私が言ったように、約6回の実行で問題なく動作し、その後停止するため、私はこれに完全に混乱しています.

編集:これは、私が渡す行列の種類を作成する関数です:(行列が反復ごとに異なることを考えると)

def create():
    matrix = {}
    matrix[0, 0] = 2
    matrix[0, 1] = 1
    matrix[1, 0] = 1
    matrix[1, 1] = 2
    return matrix

どんな助けでも大歓迎です!(PS初投稿はこちら)

4

1 に答える 1

1

あなたの行列は、タプルをキーとして使用する辞書です。これはおそらくあなたがやりたいことではありません。

ネストされたリストを使用してみてください:

from math import sqrt

def create():
    matrix = [[1, 2], [1, 2]]
    return matrix

def eigval(matrix):
    a = matrix[0][0]
    b = matrix[1][0]
    c = matrix[0][1]
    d = matrix[1][1]
    c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
    c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
    return [c1 / 2, c2 / 2]

>>> m = create() 
>>> eigval(m)
[3.0, 0.0]

または、代わりに numpy を使用します。

import numpy

def eigval(matrix):
    a = matrix[0, 0]
    b = matrix[1, 0]
    c = matrix[0, 1]
    d = matrix[1, 1]
    c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
    c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
    return numpy.array([c1 / 2, c2 / 2])

>>> m = numpy.array([[1, 2], [1, 2]])
>>> m
array([[1, 2],
       [1, 2]])
>>> eigvalues, eigvectors = numpy.linalg.eig(m)
>>> eigvalues
array([ 0.,  3.])

>>> eigval(m)
array([ 3.,  0.])
于 2013-05-07T06:47:56.377 に答える