Преобразование Matlab в Python - тестирование алгоритма Ланцоша - PullRequest
0 голосов
/ 13 января 2020

Я довольно новичок в Python и пытаюсь преобразовать код Matlab в Python. У меня есть работающий алгоритм Ланцоша в Python:

import numpy as np
import scipy as sp
from math import factorial
from numpy import *
from pylab import *

def Lanczos(A,m):
  [n,k] = size(A)
  V =  zeros[k, m+1]
  V[:,2]= rand[k,1]
  V[:,2]=V[:,2]/norm[V[:,2],2]
  beta[2]=0
  for j in range [2: m+2]:
      w=A*V[:,j] - beta[j]*V[:,j-1]
      alpha[j]=w.transpose()*V[:,j]
      w = w - alpha[j]*V[:,j]
      beta[j+1]=norm[w,2]
      V[:,j+1]= w/beta[j+1]
      T=sparse[m+1,m+1]
      disp("approximation quality is: ", (norm(V*T*V.transpose()-A)))
      for i in range [2: m+1]:
          T[i-1,i-1]=alpha[i]
          T[i-1,i]=beta[i+1]
          T[i,i-1]=beta[i+1]
          T[m+1, m+1]=alpha[m+2]
          V=V[:,2:end-1]
          disp("approximating eigenvalues are: ",(eigs(T).transpose()))

, но когда я пытаюсь «проверить» диагонализацию с помощью следующей матрицы:

import numpy as np
import scipy as sp
from math import factorial
from numpy import *
from pylab import *

def Lanczos(A,m):
  [n,k] = size(A)
  V =  zeros[k, m+1]
  V[:,2]= rand[k,1]
  V[:,2]=V[:,2]/norm[V[:,2],2]
  beta[2]=0
  for j in range [2: m+2]:
      w=A*V[:,j] - beta[j]*V[:,j-1]
      alpha[j]=w.transpose()*V[:,j]
      w = w - alpha[j]*V[:,j]
      beta[j+1]=norm[w,2]
      V[:,j+1]= w/beta[j+1]
      T=sparse[m+1,m+1]
      disp("approximation quality is: ", (norm(V*T*V.transpose()-A)))
      for i in range [2: m+1]:
          T[i-1,i-1]=alpha[i]
          T[i-1,i]=beta[i+1]
          T[i,i-1]=beta[i+1]
          T[m+1, m+1]=alpha[m+2]
          V=V[:,2:end-1]
          disp("approximating eigenvalues are: ",(eigs(T).transpose()))
  def test (A,m,i):
      A=rand(5,12)
      A=A.dot(A.transpose()

      for i in range [2:4]:
          disp("runnung for" , str(i), "rounds")
          Lanczos(A,i)
          disp("eigenvalues are", (flipud(eig(A))))

Я продолжаю получать ' неверный синтаксис 'после последнего l oop. Я думаю, что просто могу правильно применить алгоритм к матрице, но я просто не могу разобраться с этим. Спасибо за помощь!

Изображение сообщения об ошибке: enter image description here

1 Ответ

0 голосов
/ 16 января 2020

ОК, так что мне удалось выяснить проблему - это была недостающая скобка:

def test (A,m,i):
    A=rand(5,12)
    A=A.dot(A.transpose())
    disp("eigenvalues are", (flipud(LA.eig(A))))
    Lanczos(A,i)

после A.transpose мне понадобилась вторая скобка ....

Я снова - написал скрипт и теперь он выглядит следующим образом:

import numpy as np
import scipy as sp
from math import factorial
from numpy import *
from pylab import *
from numpy import linalg as LA

def Lanczos(A,m, k, beta_1, j=20):
    V = np.zeros([k, m+1])
    V[:,2]= rand(k,1)
    beta_1=(j)
    alpha=(j)
    for j  in range (m+2):
        w=A*V[:,j] - beta_1*V[:,j-1]
        alpha=w.transpose()*V[:,j]
        w = w - alpha*V[:,j]
        beta[j+1]=norm[w,2]
        V[:,j+1]= w/beta[j+1]
        T=sparse[m+1,m+1]
        print("approximation quality is: ", (norm(V*T*V.transpose()-A)))
        for i in range [2: m+1]:
            T[i-1,i-1]=alpha[i]
            T[i-1,i]=beta[i+1]
            T[i,i-1]=beta[i+1]
            T[m+1, m+1]=alpha[m+2]
            V=V[:,2:end-1]
            print("approximating eigenvalues are: ",(eigs(T).transpose()))
            return 

Lanczos (A=rand(5,12), m = 4, k=1, beta_1=1)

теперь я получаю сообщение об ошибке: 'w = w - alpha * V [:, j] ValueError: операнды не могут быть переданы вместе с фигурами (5,12) (12,5) 'но мне придется больше отлаживать, чтобы все работало. Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...