# -*- coding: UTF-8 -*-
from math import *
import numpy as np
############################################
# 最大固有値と固有ベクトル(べき乗法)
# i : 何番目の固有値かを示す
# n : 次数
# m : 丸め誤差の修正回数
# ct : 最大繰り返し回数
# eps : 収束判定条件
# A : 対象とする行列
# B : nxnの行列,最初は,単位行列
# C : 作業域,nxnの行列
# r : 固有値
# v : 各行が固有ベクトル(nxn)
# v0 : 固有ベクトルの初期値
# v1,v2 : 作業域(n次元ベクトル)
# return : 求まった固有値の数
# coded by Y.Suganuma
############################################
def power(i, n, m, ct, eps, A, B, C, r, v, v0, v1, v2) :
# 初期設定
ind = i
k = 0
l1 = 0.0
for i1 in range(0, n) :
l1 += v0[i1] * v0[i1]
v1[i1] = v0[i1]
l1 = sqrt(l1)
# 繰り返し計算
while k < ct :
# 丸め誤差の修正
if k%m == 0 :
l2 = 0.0
for i1 in range(0, n) :
v2[i1] = 0.0
for i2 in range(0, n) :
v2[i1] += B[i1][i2] * v1[i2]
l2 += v2[i1] * v2[i1]
l2 = sqrt(l2)
for i1 in range(0, n) :
v1[i1] = v2[i1] / l2
# 次の近似
l2 = 0.0
for i1 in range(0, n) :
v2[i1] = 0.0
for i2 in range(0, n) :
v2[i1] += A[i1][i2] * v1[i2]
l2 += v2[i1] * v2[i1]
l2 = sqrt(l2)
for i1 in range(0, n) :
v2[i1] /= l2
# 収束判定
# 収束した場合
if abs((l2-l1)/l1) < eps :
k1 = -1
for i1 in range(0, n) :
if abs(v2[i1]) > 0.001 :
k1 = i1
if v2[k1]*v1[k1] < 0.0 :
l2 = -l2
break
k = ct
r[i] = l2
for i1 in range(0, n) :
v[i][i1] = v2[i1]
if i == n-1 :
ind = i + 1
else :
for i1 in range(0, n) :
for i2 in range(0, n) :
C[i1][i2] = 0.0
for i3 in range(0, n) :
if i1 == i3 :
x = A[i1][i3] - l2
else :
x = A[i1][i3]
C[i1][i2] += x * B[i3][i2]
for i1 in range(0, n) :
for i2 in range(0, n) :
B[i1][i2] = C[i1][i2]
for i1 in range(0, n) :
v1[i1] = 0.0
for i2 in range(0, n) :
v1[i1] += B[i1][i2] * v0[i2]
for i1 in range(0, n) :
v0[i1] = v1[i1]
ind = power(i+1, n, m, ct, eps, A, B, C, r, v, v0, v1, v2)
# 収束しない場合
else :
for i1 in range(0, n) :
v1[i1] = v2[i1]
l1 = l2
k += 1
return ind
----------------------------------
# -*- coding: UTF-8 -*-
import numpy as np
from math import *
from function import power
############################################
# 最大固有値と固有ベクトル(べき乗法)
# coded by Y.Suganuma
############################################
# データの設定
ct = 200
eps = 1.0e-10
n = 3
m = 15
A = np.array([[11, 6, -2],[-2, 18, 1],[-12, 24, 13]], np.float)
B = np.array([[1, 0, 0],[0, 1, 0],[0, 0, 1]], np.float)
C = np.empty((n, n), np.float)
v = np.empty((n, n), np.float)
r = np.empty(n, np.float)
v0 = np.array([1, 1, 1], np.float)
v1 = np.empty(n, np.float)
v2 = np.empty(n, np.float)
# 計算
ind = power(0, n, m, ct, eps, A, B, C, r, v, v0, v1, v2)
# 出力
if ind == 0 :
print("固有値が求まりませんでした!")
else :
for i1 in range(0, ind) :
print("固有値 " + str(r[i1]), end="")
print(" 固有ベクトル ", end="")
for i2 in range(0, n) :
print(" " + str(v[i1][i2]), end="")
print()