Как построить график аппроксимаций метода степенных итераций - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь построить график аппроксимации собственных значений для первых 20 итераций со следующим кодом:

def metoda_potegowa(A,X0,iterations):

  iteracje=[]
  aproks=[]
  ii=0

  while(1):
    for i in range (iterations):
      A = A*A

    x = A*X0
    aproks.append(x)
    iteracje.append(ii)
    ii=ii+1
    norm = np.linalg.norm(x)

    plt.scatter(iteracje,aproks)
    plt.xlabel('iteracja')
    plt.ylabel('aproksymacja')
    plt.grid
    plt.show

    break

  print (x/norm)
  print (np.linalg.eig(A)[1])

Я получаю предупреждение:

ValueError                                Traceback (most recent call last)
<ipython-input-96-d18eef58c53a> in <module>()
----> 1 metoda_potegowa(a,x0,5)

4 frames
/usr/local/lib/python3.6/dist-packages/matplotlib/axes/_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, plotnonfinite, **kwargs)
   4378         y = np.ma.ravel(y)
   4379         if x.size != y.size:
-> 4380             raise ValueError("x and y must be the same size")
   4381 
   4382         if s is None:

ValueError: x and y must be the same size

как я могу это исправить так это dr aws сюжет для меня?

1 Ответ

1 голос
/ 25 мая 2020

Во-первых, позвольте мне сказать вам, что код

while(1):
   code...
   break

не имеет смысла. Поскольку это то же самое, что и

code...

Согласно Википедия , вы можете вычислить следующее приближение собственного вектора по следующей формуле:

enter image description here

Ось iteracje и aproks - плохой выбор для диаграммы рассеяния, потому что у нас есть векторы. Как мы можем представить вектор точкой? Мы можем выбрать следующий подход:

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('ggplot')

def metoda_potegowa(A,X0,iterations):
    fig, ax = plt.subplots(figsize=(15,10))
    b_k = X0.copy()
    for i, _ in enumerate(range(iterations)):
        # calculate the product between A and b_k
        Ab_k = np.dot(A, b_k)

        # calculate the norm
        Ab_k_norm = np.linalg.norm(Ab_k)

        # get next aproximation of eigenvector
        b_k = Ab_k / Ab_k_norm

        # plot the current iteration i
        plt.scatter(list(range(1, len(b_k)+1)), b_k.ravel(), label=i)
    plt.xlabel('index')
    plt.ylabel('value') 
    # use colors to distinguish iteration
    plt.legend()
    plt.show()

    return b_k

Затем вы можете вызвать функцию с помощью iterations = 20 и построить график результата:

a = np.array([[1, 0, 3], [0, 2, 0], [3, 0, 1]])
x0 = np.array([1,1,1]).transpose()
eigenvector_20 = metoda_potegowa(a,x0,20)
...