首页 > 解决方案 > 在 python 中绘制 x_n = A**n * x0

问题描述

我正在尝试在 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()

我不断收到值错误:使用序列设置数组元素,当它工作时,我得到一个非常奇怪的情节,这可能是错误的。关于如何做的任何想法?

标签: pythonmatrixmatrix-multiplication

解决方案


我不确定您是否想通过将矩阵自身相乘或对其中的数字求幂来将矩阵乘以幂。在任何情况下,您的代码抛出 aValueError: setting an array element with a sequence.的原因是矩阵向量乘法A**i * x0返回一个长度为 2 的数组 - 即一个向量。

也许您想绘制由矩阵向量积产生的向量。在这种情况下,这段代码应该可以解决问题:

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 的形状 - 与代码中的 n 相比,它现在是 (nx2)。这意味着矩阵向量乘积的结果将适合 xn。该@符号表示python3中的矩阵乘法。我还在结果图中用矩阵的功率标记了这条线。您可以看到输出向量随着矩阵的变化而变化。我认为这是一个很好的例子,说明在应用于向量时如何将矩阵(尤其是 2x2)视为线性变换。这段视频很好地解释了这个概念:https ://www.youtube.com/watch?v=kYB8IZa5AuE 。


推荐阅读