Python 官方文档:入门教程 => 点击学习
共轭梯度法,特征值聚堆情况下迭代次数讨论 输入各种特征值聚堆与分散时的矩阵,并应用共轭梯度法,观察迭代次数与聚堆情况的关系。 因为对角矩阵的对角线元素为其特征值,则用对角矩阵讨论较
输入各种特征值聚堆与分散时的矩阵,并应用共轭梯度法,观察迭代次数与聚堆情况的关系。
因为对角矩阵的对角线元素为其特征值,则用对角矩阵讨论较为方便
代码
import numpy as np
def cg(x0, A, b):
r0 = np.dot(A, x0) - b
p0 = -r0
rk = r0
pk = p0
xk = x0
t = 0 #记录迭代次数
while np.linalg.nORM(rk) >= 1e-6:
rr = np.dot(rk.T, rk)
ak = rr / np.dot(np.dot(pk.T, A), pk)
xk = xk + ak * pk
rk = rk + ak * np.dot(A, pk)
bk = np.dot(rk.T, rk) / rr
pk = -rk + bk * pk
t += 1
return xk, t
#输入列表,生成以列表为对角元素的对角矩阵
def DiaGonal_matrix(D):
n = len(D)
diag = np.zeros((n,n))
for i in range(n):
diag[i][i] = D[i]
return diag
#矩阵对角线元素
D_1 = [1, 1, 1, 1, 1, 6, 7, 8, 9, 10]
D_2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D_3 = [0.8, 0.9, 1, 1.1, 1.2, 6, 7, 8, 9, 10]
D_4 = [1 - 2*1e-7, 1 - 1e-7, 1, 1 + 1e-7, 1 + 2*1e-7, 6, 7, 8, 9, 10]
D_5 = [1, 1, 1, 2, 2, 2, 3, 3, 3, 10]
#初始值
x0 = np.zeros((10,1))
b = np.ones((10,1))
#生成对角矩阵
diag1 = Diagonal_matrix(D_1)
diag2 = Diagonal_matrix(D_2)
diag3 = Diagonal_matrix(D_3)
diag4 = Diagonal_matrix(D_4)
diag5 = Diagonal_matrix(D_5)
#共轭梯度法迭代
x_1, n_1 = cg(x0, diag1, b)
x_2, n_2 = cg(x0, diag2, b)
x_3, n_3 = cg(x0, diag3, b)
x_4, n_4 = cg(x0, diag4, b)
x_5, n_5 = cg(x0, diag5, b)
n = [n_1, n_2, n_3, n_4, n_5]
#输出
for i in range(5):
print('矩阵',i + 1 ,'的迭代次数为: ', n[i])
矩阵1,前5个元素聚堆且都为相同元素
矩阵2,特征值分散
矩阵3,前5个特征值聚堆,但是最大差为0.4 ,而cg法精度为1e-6
矩阵4,前5个特征值聚堆,且相差最大小于1e-6
矩阵5,三聚堆
输出:
分析:
以上就是python共轭梯度法特征值迭代次数讨论的详细内容,更多关于Python共轭梯度法迭代的资料请关注编程网其它相关文章!
--结束END--
本文标题: python共轭梯度法特征值迭代次数讨论
本文链接: https://lsjlt.com/news/122990.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0