1
2
|
import numpy as np import time |
1.1 Jacobi迭代算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
def Jacobi_tensor_V2(A,b,Delta,m,n,M): start = time.perf_counter() #开始计时 find = 0 #用于标记是否在规定步数内收敛 X = np.ones(n) #迭代起始点 x = np.ones(n) #用于存储迭代的中间结果 d = np.ones(n) #用于存储Ax**(m-2)的对角线部分 m1 = m - 1 m2 = 2 - m for i in range (M): print ( 'X' ,X) a = np.copy(A) #得Ax**(m-2) for j in range (m - 2 ): a = np.dot(a,X) #得d 和 (2-m)Dx**(m-2)+(L'+U')x**(m-2) for j in range (n): d[j] = a[j,j] a[j,j] = m2 * a[j,j] #迭代更新 for j in range (n): x[j] = (b[j] - np.dot(a[j],X)) / (m1 * d[j]) #判断是否满足精度要求 if np. max (np.fabs(X - x))<Delta: find = 1 break X = np.copy(x) end = time.perf_counter() #结束计时 print ( '时间:' ,end - start) print ( '迭代' ,i) return X,find,i,end - start<br> |
1.2 张量A的生成函数和向量b的生成函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
def Creat_A(m,n): #生成张量A size = np.full(m, n) X = np.ones(n) while 1 : #随机生成给定形状的张量A A = np.random.randint( - 49 , 50 ,size = size) #判断Dx**(m-2)是否非奇异,如果是,则满足要求,跳出循环 D = np.copy(A) for i1 in range (n): for i2 in range (n): if i1! = i2: D[i1,i2] = 0 for i in range (m - 2 ): D = np.dot(D,X) det = np.linalg.det(D) if det! = 0 : break #将A的对角面张量扩大十倍,使对角面占优 for i1 in range (n): for i2 in range (n): if i1 = = i2: A[i1,i2] = A[i1,i2] * 10 print ( 'A:' ) print (A) return A #由A和给定的X根据Ax**(m-1)=b生成向量b def Creat_b(A,X,m): a = np.copy(A) for i in range (m - 1 ): a = np.dot(a,X) print ( 'b:' ) print (a) return a |
1.3 对称张量S的生成函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def Creat_S(m,n): #生成对称张量B size = np.full(m, n) S = np.zeros(size) print ( 'S' ,S) for i in range ( 4 ): #生成n为向量a a = np.random.random(n) * np.random.randint( - 5 , 6 ) b = np.copy(a) #对a进行m-1次外积,得到秩1对称张量b for j in range (m - 1 ): b = outer(b,a) #将不同的b叠加得到低秩对称张量S S = S + b print ( 'S:' ) print (S) return S def outer(a,b): c = [] for i in b: c.append(i * a) return np.array(c) return a |
1.4 实验一
1
2
3
4
5
6
7
8
9
|
def test_1(): Delta = 0.01 #精度 m = 3 #A的阶数 n = 3 #A的维数 M = 200 #最大迭代步数 X_real = np.array( [ 2 , 3 , 4 ]) A = Creat_A(m,n) b = Creat_b(A,X_real,m) Jacobi_tensor_V2(A,b,Delta,m,n) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/Fengqiao/p/Jacobi_tensor.html