Tôi đã xác định chức năng sau:
def eigval(ma trận):
a = ma trận[0, 0]
b = ma trận[0, 1]
c = ma trận[1, 0]
d = ma trận[1, 1]
c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
trả về c1/2, c2/2
Nó được tạo ra để tìm các giá trị riêng của ma trận 2 X 2. Tôi sử dụng nó để chạy lặp lại thuật toán Jacobi trên ma trận. Ma trận đến là một từ điển với các bộ dữ liệu là khóa đại diện cho vị trí và số float là giá trị. Hàm này sẽ hoạt động tốt trong khoảng 6 lần lặp, nhưng sau đó tôi nhận được:
TypeError: __getitem__() nhận chính xác 2 đối số (đã cho 2 đối số)
Trong dòng đầu tiên của khối (dòng có a).
Tôi hoàn toàn bối rối vì điều này vì như tôi đã nói, nó chạy tốt khoảng 6 lần rồi dừng lại.
EDIT: Đây là hàm tạo ra loại ma trận tôi truyền vào: (với điều kiện là ma trận sẽ khác nhau trong mỗi lần lặp)
chắc chắn tạo():
ma trận = {}
ma trận[0, 0] = 2
ma trận[0, 1] = 1
ma trận[1, 0] = 1
ma trận[1, 1] = 2
ma trận trả về
Bất kỳ trợ giúp nào đều được đánh giá cao (PS đăng bài đầu tiên ở đây)
Ma trận của bạn là một từ điển sử dụng các bộ dữ liệu làm khóa, đây có thể không phải là điều bạn muốn làm.
Hãy thử sử dụng danh sách lồng nhau:
từ sqrt nhập toán học
chắc chắn tạo():
ma trận = [[1, 2], [1, 2]]
ma trận trả về
def eigval(ma trận):
a = ma trận[0][0]
b = ma trận[1][0]
c = ma trận[0][1]
d = ma trận[1][1]
c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
trả về [c1/2, c2/2]
>>> m = tạo()
>>> eigval(m)
[3.0, 0.0]
Hoặc sử dụng gọn gàng:
nhập khẩu
def eigval(ma trận):
a = ma trận[0, 0]
b = ma trận[1, 0]
c = ma trận[0, 1]
d = ma trận[1, 1]
c1 = (a + d) + sqrt((4 * b * c) + ((a - d)**2))
c2 = (a + d) - sqrt((4 * b * c) + ((a - d)**2))
trả về numpy.array([c1 / 2, c2 / 2])
>>> m = numpy.array([[1, 2], [1, 2]])
>>> tôi
mảng([[1, 2],
[1, 2]])
>>> giá trị riêng, vectơ eig = numpy.linalg.eig(m)
>>> giá trị riêng
mảng([ 0., 3.])
>>> eigval(m)
mảng([ 3., 0.])
Tôi là một lập trình viên xuất sắc, rất giỏi!