Я не уверен, хотите ли вы привести матрицу к степени, умножив ее на себя или возведя в степень числа в ней. В любом случае причина, по которой ваш код выдает ValueError: setting an array element with a sequence.
, заключается в том, что умножение вектора матрицы A**i * x0
возвращает массив длины два, то есть вектор.
Может быть, вы хотите построить векторы, которые получаются в результате произведения матрицы на вектор. В этом случае этот код должен выполнить свою задачу:
import numpy as np
import matplotlib.pyplot as plt
n = 30
A = np.matrix([[0,-1],[1,1.6]])
xn = np.zeros((n, 2))
x0 = np.matrix([[5],[-1]])
fig, ax = plt.subplots()
for i in range(n):
A = A @ A
xn[i, :] = np.squeeze(np.dot(A, x0))
ax.plot([0, xn[i, 0]], [0, xn[i, 1]])
label = r"$A^{%i}$" % (i+1)
ax.annotate(label, xy=(xn[i, 0], xn[i, 1]))
plt.show()
Обратите внимание, что я изменил форму xn - теперь это (nx2) по сравнению с n, как в вашем коде. Это означает, что результат произведения матрицы на вектор поместится в xn. Запись @
указывает умножение матрицы в python3. Я также обозначил линию на полученном графике силой, к которой была отнесена матрица. Вы можете увидеть выходной вектор, изменяющий направление при изменении матрицы. Я думаю, что это хороший пример того, как матрицы (особенно 2x2) можно рассматривать как линейные преобразования применительно к векторам. Это видео хорошо объясняет эту концепцию: https://www.youtube.com/watch?v=kYB8IZa5AuE.