Построение x_n = A ** n * x0 в питоне - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь построить матричное умножение в Python. У меня есть матрица A = [[0,-1],[1,1.6]] и x0 = [[5],[-1]]. Задача состоит в том, чтобы построить xn, когда я знаю, что xn = A**n * x0, для n = 1, ... ,30 Пока это мой код:

import numpy as np
import matplotlib.pyplot as plt

n = 30
A = np.matrix([[0,-1],[1,1.6]])
xn = np.zeros(n)
x0 = np.matrix([[5],[-1]])
for i in range(n):
    xn[i]= A**i*x0
    plt.plot(xn)
plt.show()

Я получаю ошибку значения: установка элемента массива с помощьюпоследовательность, и когда это работает, я получаю действительно странный сюжет, что, вероятно, неправильно. Есть идеи как это сделать?

1 Ответ

0 голосов
/ 23 октября 2019

Я не уверен, хотите ли вы привести матрицу к степени, умножив ее на себя или возведя в степень числа в ней. В любом случае причина, по которой ваш код выдает 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.

...