python求向量函数的雅可比矩阵_计算方法 python【类方法】 使用雅可比方法(吉文斯变换)Jacobi&Givens Transformation 求实对称矩阵的特征值...

该博客介绍了如何使用Python实现雅可比方法(吉文斯变换)求解实对称矩阵的特征值。通过定义SquareMatrix类,实现了矩阵的最大值获取、雅可比迭代过程和吉文斯变换消除法。最终,通过用户输入的矩阵、误差阈值和最大迭代次数,计算并打印出特征值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import math as mt

import copy

class SquareMatrix():

def __init__(self,a):

self.A = self.ori = a

self.n = len(a)

self.trans = []

self.Q = [[0]*self.n for i in range(self.n)]

for i in range(self.n):

self.Q[i][i] = 1

def get_max(self):

max = -1e9

maxx = 0

maxy = 0

for i in range(self.n):

for j in range(self.n):

if i==j:

continue

if abs(self.A[i][j])>max:

maxx = i

maxy= j

max = abs(self.A[i][j])

return (max,maxx,maxy)

def Jacobi_eigen(self,eps,iterN):

_A = self.A

count = 0

while True:

pos = self.get_max()

if pos[0]iterN:

break

Givens_trans_eliminate(self.A,pos[1],pos[2],self.Q)

count +=1

# print(self.A)

# print(count)

list = []

for i in range(self.n):

list.append(self.A[i][i])

list.sort()

for i in range(self.n ):

print("%.2f"%list[i],end=" ")

def Givens_trans_eliminate(a,i,j,Q):

b = (a[i][i]-a[j][j])/(2*a[i][j])

t = 1/(abs(b)+mt.sqrt(1+b**2))

if b<0:

t = -t

cos = 1/(mt.sqrt(1+t**2))

sin = t/(mt.sqrt(1+t**2))

olda = copy.deepcopy(a)

for s in range(len(a)):

if s!=i and s!=j:

a[s][i] = a[i][s] = olda[s][i]*cos+olda[s][j]*sin

a[s][j] = a[j][s] = -olda[s][i]*sin+olda[s][j]*cos

a[i][i] = olda[i][i]*cos*cos +2*olda[i][j]*cos*sin+olda[j][j]*sin*sin

a[j][j] = olda[i][i]*sin*sin-2*olda[i][j]*cos*sin+olda[j][j]*cos*cos

a[i][j] = a[j][i] = 0

oldq = copy.deepcopy(Q)

for s in range(len(a)):

# Q[s][i] = Q[s][i]*cos+Q[s][j]*sin

# Q[s][j] = -Q[s][i]*sin+Q[s][j]*cos

Q[s][i] = oldq[s][i] * cos + oldq[s][j] * sin

Q[s][j] = -oldq[s][i] * sin + oldq[s][j] * cos

def _getMatrix():

matrix = []

row = []

for i in range(3):

inp = input().split(' ')

row = [float(inp[num]) for num in range(len(inp)) ]

matrix.append(row)

return matrix

a = _getMatrix()

s = SquareMatrix(a)

inp = input().split(' ')

eps = float(inp[1])

itern = float(inp[0])

s.Jacobi_eigen(eps,itern)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值