数值分析实验(二)迭代法的应用

2023-11-01

目录

实验名称:数值分析实验(二)迭代法的应用

实验题目:

实验原理:

         (1)高斯消去法

(2)Jacobi迭代法

(3)G-S迭代法

(4)SOR迭代法

实验数据记录及处理:

实验内容及步骤:

(1)高斯消元法:

(2)Jacobi迭代法:

(3)G-S迭代法

(4)SOR迭代法:


实验名称:数值分析实验(二)迭代法的应用

实验题目:

  考虑方程组=b的解,其中系数矩阵H为Hilbert矩阵:

H=\left ( h_{i,j} \right )_{n\times m},h_{i,j}=\frac{1}{i+j-1}      i,j=1,2,3,4......n   

   这是一个著名的病态问题。通过首先给定解(例如取为各个分量均为1)再计算出右端的办法给出确定的问题。

(1)选择问题的维数为6,分别用 Gauss消去法、J迭代法、GS迭代法和SOR迭代法求解方程组,其各自的结果如何?将计算结果与问题的解比较,结论如何。

(2)逐步增大问题的维数,仍用上述的方法来解它们,计算的结果如何?计算的结果说明的什么?

(3)讨论病态问题求解的算法。

实验目的:通过本实验加深对于高斯消去法,Jacobi迭代法,G-S迭代法和SOR迭代法的理解和运用,同时理解不同阶数对于方程的影响,同时加深对于病态方程的理解。

实验原理:

1)高斯消去法
高斯消去法是一种用于解线性方程组的数值方法,其原理基于初等行变换和回代。

假设给定一个线性方程组 AX=b,其中 A 是一个 n×n 的系数矩阵,X 和 b 分别是未知数向量和常数向量。高斯消去法的主要步骤如下:

1.构建增广矩阵:将系数矩阵 A 和常数向量 b 合并成一个增广矩阵 [A | b]。

2.消元过程:通过一系列的初等行变换将增广矩阵转化为上三角形矩阵。这些初等行变换包括以下操作:

3.交换两行的位置;

4.用一个非零常数乘以某一行的所有元素;

5.用一行的倍数加到另一行上。

在消元过程中,每一步都以一个主元为基准,将主元以下的列中的元素通过消元操作变为零,以实现逐步消去下方的元素。

回代过程:从上三角形矩阵的最后一行开始,通过回代求解未知数的值。回代的步骤如下:

求解最后一行的未知数;继续向上一行回代,依次求解每个未知数,直到求解出所有未知数。回代过程中,每个未知数的解是通过将已知的未知数代入方程进行求解得到的。

得到方程组的解:回代过程完成后,我们得到了线性方程组的解向量 X。

高斯消去法的关键思想是通过消元操作将线性方程组转化为上三角形矩阵,从而使回代过程更加简单和可行。它的优点是简单易实现,但它的缺点是可能会面临主元为零或接近零的情况,导致算法的稳定性下降,需要进行一些修正,如选取主元时使用行部分选主元(部分主元消去法)或使用列部分选主元(完全主元消去法)。

    这里还有LU分解的过程:

对于 (A非奇异)求解时,可以先将A分解成一个下三角矩阵L和一个上三角矩阵U的乘积,即 ,就可以通过

                               

求解出 的值。

欲把一个给定的矩阵A分解为一个下三角阵L与一个上三角阵U的乘积,最自然的做法便是通过一系列的初等变换,逐步将A约化为一个上三角阵,而又能保证这些变换的乘积是一个下三角阵。这可归结为:对于一个任意给定的向量 找一个尽可能简单的下三角阵,使 经这一矩阵作用之后的第 至第 个分量均为零。能够完成这一任务的最简单的下三角阵便是如下形式的初等下三角阵:

                                

其中

                           

这种类型的初等下三角阵称作Gauss变换,而称向量 为Gauss向量。

对于一个给定的向量 我们有:

由此立即可知,只要取

                            

便有

                           

当然,这里我们要求 

而后经过多次变换可以得到

                               

从而求出上三角阵U,而后通过

                           

求得下三角阵

                                            

将结果带入到 式中求出的值即可。

(2)Jacobi迭代法

Jacobi迭代法是一种用于解线性方程组的迭代方法,其原理基于将线性方程组的解逐步逼近的思想。

假设给定一个线性方程组 AX=b,其中 A 是一个 n×n 的系数矩阵,X 和 b 分别是未知数向量和常数向量。Jacobi迭代法的主要步骤如下:

1.将线性方程组转化为等价的形式:将 A 分解为 A = D - L - U,其中 D 是 A 的对角线矩阵,L 是 A 的严格下三角矩阵(即除去对角线的元素),U 是 A 的严格上三角矩阵(即除去对角线的元素)。

2.初始化:将解向量 X 的初始值设置为一个任意的向量,通常选择一个全零向量。

迭代过程:根据迭代公式 X(k+1) = D^(-1) * (b - (L + U) * X(k)),其中 X(k) 表示第 k 次迭代的解向量,X(k+1) 表示第 k+1 次迭代的解向量。

3.在每一次迭代中,根据上述迭代公式,将 X(k) 代入计算 X(k+1)。

4.迭代过程将 X 的值逐步逼近最终的解向量。

5.判断终止条件:根据需要设置一个终止条件,如达到一定的迭代次数或解向量的变化量小于某个阈值。

6.输出解向量:当满足终止条件时,迭代停止,输出最终的解向量 X。

以下是Jacobi迭代法的公式推导:

考虑非奇异线性代数方程组:  令 

其中

                                                               

                                                               

                                                               

那么合并之后可以写成一下形式:                                                                 

其中                                                             

若给定初始向量                       

并代入(1.4)式右边,又可得到一个向量 ;一次类推,有                                                 

                                                                                

  这就是所谓的Jacobi迭代法,其中 叫做Jacobi迭代法的迭代矩阵, 叫做Jacobi迭代法的常数项。

(3)G-S迭代法

Gauss-Seidel(G-S)迭代法是一种用于解线性方程组的迭代方法,其原理基于将线性方程组的解逐步逼近的思想,并结合了前向替代和后向替代。

假设给定一个线性方程组 AX=b,其中 A 是一个 n×n 的系数矩阵,X 和 b 分别是未知数向量和常数向量。G-S迭代法的主要步骤如下:

1. 将线性方程组转化为等价的形式:将 A 分解为 A = D - L - U,其中 D 是 A 的对角线矩阵,L 是 A 的严格下三角矩阵(即除去对角线的元素),U 是 A 的严格上三角矩阵(即除去对角线的元素)。

2. 初始化:将解向量 X 的初始值设置为一个任意的向量,通常选择一个全零向量。

3. 迭代过程:根据迭代公式 X(k+1) = D^(-1) * (b - L * X(k+1) - U * X(k)),其中 X(k) 表示第 k 次迭代的解向量,X(k+1) 表示第 k+1 次迭代的解向量。

   在每一次迭代中,根据上述迭代公式,先使用已知的 X(k) 来计算新的 X(k+1) 的值,然后将新的 X(k+1) 代入计算下一次迭代的 X(k+1)。

   在计算 X(k+1) 的过程中,使用的是当前已经计算出来的新值,这就是 G-S 迭代法与 Jacobi 迭代法的区别。

4. 判断终止条件:根据需要设置一个终止条件,如达到一定的迭代次数或解向量的变化量小于某个阈值。

5. 输出解向量:当满足终止条件时,迭代停止,输出最终的解向量 X。

G-S迭代法的关键思想是通过迭代过程,利用当前解向量的近似值来计算下一次迭代的解向量,逐步逼近方程组的解。相比于 Jacobi 迭代法,G-S 迭代法在每次迭代中直接使用新的解向量,因此收敛速度相对较快。然而,对于某些特殊的方程组,G-S 迭代法可能不收敛或收敛较慢。在实际应用中,可以通过调整迭代次数或使用其他更高效的迭代方法来提高求解效率。

以下是G-S迭代法的公式推导:

注意到Jacobi迭代法中各分量的计算顺序是没有关系的,先算那个分量都一样。现在,假设不按Jacobi迭代格式,而是在计算 的第一个分量用 的各个分量计算,但当计算 的第二个分量 时,因 已经算出,用它代替 ,其他分量仍用 。类似地,计算 时,因 都已算出,用它们代替 其他分量仍用 的分量,于是有

我们称这种迭代格式为Gauss-Seidel迭代法,简称为G-S迭代法。它的一个明显的好处是在编写程序是存储量减少了。如果 存在,G-S迭代法可以改写成

我们把 叫做G-S迭代法的迭代矩阵,而把 叫做G-S迭代法的常数项。

(4)SOR迭代法

Successive Over-Relaxation(SOR)迭代法是一种用于解线性方程组的迭代方法,其原理基于将线性方程组的解逐步逼近的思想,并结合了Gauss-Seidel迭代法和松弛因子的概念。

假设给定一个线性方程组 AX=b,其中 A 是一个 n×n 的系数矩阵,X 和 b 分别是未知数向量和常数向量。SOR迭代法的主要步骤如下:

1. 将线性方程组转化为等价的形式:将 A 分解为 A = D - L - U,其中 D 是 A 的对角线矩阵,L 是 A 的严格下三角矩阵(即除去对角线的元素),U 是 A 的严格上三角矩阵(即除去对角线的元素)。

2. 初始化:将解向量 X 的初始值设置为一个任意的向量,通常选择一个全零向量。

3. 迭代过程:根据迭代公式 X(k+1) = (1 - w) * X(k) + w * D^(-1) * (b - L * X(k+1) - U * X(k)),其中 X(k) 表示第 k 次迭代的解向量,X(k+1) 表示第 k+1 次迭代的解向量,w 是松弛因子(0 < w < 2)。

在每一次迭代中,根据上述迭代公式,首先使用已知的 X(k) 来计算新的 X(k+1) 的值,然后将新的 X(k+1) 代入计算下一次迭代的 X(k+1)。

 松弛因子 w 控制着迭代的加速程度。当 w=1 时,SOR迭代法就等价于Gauss-Seidel迭代法;当 w<1 时,迭代过程为欠松弛;当 w>1 时,迭代过程为过松弛。

4.判断终止条件:根据需要设置一个终止条件,如达到一定的迭代次数或解向量的变化量小于某个阈值。

5. 输出解向量:当满足终止条件时,迭代停止,输出最终的解向量 X。

SOR迭代法的关键思想是通过迭代过程,利用当前解向量的近似值来计算下一次迭代的解向量,逐步逼近方程组的解。通过调整松弛因子 w,可以控制迭代的加速程度。在实际应用中,选择合适的松弛因子 w 对于迭代的收敛性和效率非常重要。如果选择合适的 w,SOR迭代法可以加快收敛速度。

以下是SOR迭代法的推导公式:

 

实验数据记录及处理:

 

实验内容及步骤:

Q1:选择问题的维数为 6,分别用 Gauss 消去法、J迭代法、GS 选代法和SOR迭代法求解方程组,其各自的结果如何?将计算结果与问题的解比较,结论如何

(1)首先将实验的数据导入并且做成numpy矩阵:

# 构建 Hilbert 矩阵 H
H = np.zeros((n, n))
for i in range(1, n + 1):
    for j in range(1, n + 1):
        H[i-1, j-1] = 1 / (i + j - 1)
print(H)
# 构建解向量 x
x = np.ones(n)

# 计算右端向量 b
b = np.dot(H, x)

    (2)高斯消元法:

          书写公式并且打印出一些过程变量:

#高斯消元法
def gaussian_elimination(A, b):
    n = len(A)
    # 构建增广矩阵
    aug_matrix = np.concatenate((A, b.reshape(-1, 1)), axis=1)
    # 消元过程
    for i in range(n):
        
        pivot = aug_matrix[i, i]  # 主元
        # 消除下方的元素
        for j in range(i + 1, n):
            factor = aug_matrix[j, i]/pivot
            aug_matrix[j, :] -= factor * aug_matrix[i, :]
    return aug_matrix  //返回消去最后的矩阵

# 调用高斯消去法求解方程组
aug_matrix = gaussian_elimination(H, b)

# 输出最后的 A 矩阵
UA= aug_matrix[:, :-1]
print("最后的 A 矩阵:")
for i in range(n):
     for j in range(n):
          if(i>j):
               UA[i][j]=0
print(UA)
rUA = np.linalg.inv(UA)
LA=np.dot(H,rUA)
print("LA")
for i in range(n):
     for j in range(n):
          if(i<j):
               LA[i][j]=0
print(LA)
rLA = np.linalg.inv(LA)
y=np.dot(rLA,b)
rUA = np.linalg.inv(UA)
x=np.dot(rUA,y)
print(x)

(程序运行结果1)高斯消去法:

计算返回的A矩阵的最后形式就是LU分解所得的U矩阵

再通过得出矩阵L的值为:

最后通过Ly=b y=Ux两个公式的代换求出要求x的值为:

故该方程的解为:

 

(3)Jacobi迭代法:

首先计算L,U,D,B矩阵:

D = np.diag(np.diag(H))
D_inv = np.linalg.inv(D)
L = -np.tril(H, k=-1)
U = -np.triu(H, k=1)
B=np.dot(D_inv,(L+U))
print(D)
print(L)
print(U)
print(B)

D矩阵如下:

L矩阵

U矩阵:

计算B矩阵的值:  

计算B矩阵的谱半径判断其是否收敛:

得出 所以矩阵式发散的,Jacobi迭代法不能求解x的值。

(4)G-S迭代法

首先先求 和 两个矩阵的值:

C = np.linalg.inv(D-L)
L1=np.dot(C,U)
G1=np.dot(C,b)
print(L1)
print(G1)

 的矩阵如下:

 的矩阵如下:

接下来求谱半径的值:

(eva1, evt1) = np.linalg.eig(L1)
print("eigenvalue of matrix L1:\n{}".format(eva1))
max_abs_value1 = max(map(abs, eva1))
print("lamda1中绝对值的最大值:", max_abs_value1)
if max_abs_value1>1:
     print("矩阵的谱半径大于1,该矩阵发散,无法求解x的值")
if max_abs_value1<1:
     print("矩阵的谱半径小于1,该矩阵收敛")

得出的结果如下:

此时谱半径小于1,可以进行迭代求解x的值:

以下是求解的迭代的过程:设定eps=1e-6

x_test1=np.zeros(n)
x_result=G1+np.dot(L1,x_test1)
k=0
print(x_result)
eps=1e-6
while max(map(abs, x_test1-x_result))>eps:
     x_test1=x_result
     x_result=G1+np.dot(L1,x_test1)
     k=k+1
print(x_test1)
print(k)

 

结果显示再经过14521次迭代之后得到这样的结果:

故此时x的值为:

(5)SOR迭代法:

首先判断松弛因子是否存在:

#SOR迭代法
rob=max_abs_value#max_abs_value=p(B) 谱半径
flag=1-rob*rob
if flag<0:
     print("松弛因子不存在,取w=1.5!")
     w=1.5
if flag>=0:
     w=2/(1+cmath.sqrt(flag))

由于 ,所以flag<0,松弛因子不存在,故我们自行设定松弛因子为1.5

再求Lw矩阵的值:

Tw=np.linalg.inv(D-w*L)
Gw=(1-w)*D+w*U
Lw=np.dot(Tw,Gw)
print(Lw)

再求Lw的谱半径的值:

(eva2, evt2) = np.linalg.eig(Lw)
print("eigenvalue of matrix B:\n{}".format(eva2))
max_abs_value2 = max(map(abs, eva2))
print("lamda中绝对值的最大值:", max_abs_value2)
lamda2=max_abs_value2
if lamda2>1:
     print("矩阵的谱半径大于1,该矩阵发散,无法求解x的值")
if lamda2<=1:
    print("SOR迭代法收敛!")

结果如下:

那么迭代法收敛就进行迭代:

x_test2=np.zeros(n)
x_result2=np.dot(Lw,x_test2)+w*np.dot(Tw,b)
k1=0
eps1=1e-5
print(x_result2)
while max(map(abs, x_test2-x_result2))>eps1:
     x_test2=x_result2
     x_result2=np.dot(Lw,x_test2)+w*np.dot(Tw,b)
     k1=k1+1
print(x_test2)
print(k1)

设定eps1=1e-6,求出的结果如下所示:

经过15533次的迭代之后,得到x的值为:

  在n=6的时候用高斯消去法直接求解出了x的精确解,而利用SOR迭代法或者G-S迭代法则是通过不断相当大次数的迭代来求解出x的近似解,在eps=1e-6的情况下还是比较精确的,然而在这道题中我们没办法利用Jacobi迭代法来进行x的求解。

---------------------------ENDQ1-------------------------------

Q2:逐步增大问题的维数,仍用上述的方法来解它们,计算的结果如何? 计算的结果说明的什么?

由于上述证明了Jacobi迭代法不能进行迭代求解,以下就展示剩下三个方法的结果。

当n=20时:

高斯消去法绘制的结果图:

我们可以发现n=20的时候,x的值大幅度溢出了,这就是病态方程的特征,其在计算过程中存在一些特别小的数,使得经过相除使得得到的结果远远超出了我们预计,比如在后面的值都超过了10000,最高的达到了140000.

   相比之下G-S迭代法的效果表现的更加优秀,每一个值都没有溢出,而且都更加接近于精确值,此时迭代了26121次

相比之下SOR迭代法的效果表现的比较优秀,每一个值都没有溢出,而且都更加接近于精确值,此时迭代了34712

n=100:

高斯消去法绘制的效果图如下:

 我们可以看到受到随着n的变大,其值的溢出也越来越明显,溢出的指数都达到了e24

所以在规模大的方程组中,高斯消去法的稳定性还是不够的,受到极小数的影响比较明显,溢出程度比较明显。

相比之下G-S迭代法的效果表现的更加优秀,每一个值都没有溢出,而且都更加接近于精确值,此时迭代了30993次

相比之下SOR迭代法的效果表现的比较优秀,每一个值都没有溢出,而且都更加接近于精确值,此时迭代了98084

但是此时迭代次数已经时G-S迭代法的3倍了,消耗还是比较大的。

---------------------------ENDQ2-------------------------------

(3)讨论病态问题求解的算法

  显然,对于病态方程来说,高斯消去法一般是不推荐使用的,或者在n<10的范围内可以适当使用,解决病态问题还是要考虑迭代法来求解,基于本题,我们来讨论G-S迭代法和SOR法求解病态方程的算法都比较合理。但是还是比较推荐G-S迭代法来求解病态方程,两种算法对于X的值的逼近是差不多的,但是G-S迭代法的运算效率要高于SOR方法,特别是在n的规模比较大的时候,两者的运算的差距就显得比较大了,所G-S迭代法还是比较合适的求解病态方程的算法。

  当然求解病态方程还可以有以下的细节处理:

  1.正则化(Regularization):正则化是一种常见的处理病态问题的方法。它通过在目标函数中引入额外的约束或惩罚项,来限制问题的解空间,使得问题更加稳定和可靠。例如,岭回归和Lasso回归是常见的线性回归问题的正则化方法。

2.截断(Truncation)和截取(Clipping):对于一些问题,可能存在极大或极小的输入数据值,导致问题的不稳定性。截断和截取是一种方法,通过限制输入数据的范围来缓解这个问题。例如,在信号处理中,可以对信号进行截断或截取操作,以移除极端的数据值。

3.数据平滑和滤波(Data Smoothing and Filtering):数据平滑和滤波技术可以用来减少噪声和异常值对病态问题的影响。这些技术包括移动平均、卡尔曼滤波、高斯滤波等,可以通过对数据进行平滑处理来减少噪声的影响。

4.参数调整和模型选择:在病态问题中,模型参数的选择和调整非常重要。不恰当的参数选择可能导致问题的不稳定性。通过调整参数或选择合适的模型,可以改善问题的求解稳定性。

5.数值稳定性技术:在数值计算中,病态问题经常涉及到数值不稳定性,例如数值溢出、舍入误差等。数值稳定性技术,如数值精度控制、矩阵条件数估计、迭代算法的收敛性分析等,可以帮助处理这些数值稳定性问题。

  总之解决病态问题的算法还是比较多的,当我们通过合理的数据处理和选择合适的模型等等来降低病态方程极小数据对于求解的影响是比较好的,选择比较合适的方法和技术可以大大降低误差和求解的难度。

---------------------------ENDQ3-------------------------------

最后附上整体的源程序代码:

import numpy as np
from scipy.linalg import solve, norm
import cmath
from scipy.linalg import lu
import matplotlib.pyplot as plt
def draw_bar_chart(x):
    # 创建画布和子图
    fig, ax = plt.subplots()

    # 绘制条形图
    ax.bar(range(1, len(x)+1), abs(x))

    # 添加标签和标题
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_title('n=100 Gauss-Seidel method')
    # 显示图形
    plt.show()
# 设置问题的维数为 6
n = 6

# 构建 Hilbert 矩阵 H
H = np.zeros((n, n))
for i in range(1, n + 1):
    for j in range(1, n + 1):
        H[i-1, j-1] = 1 / (i + j - 1)
print(H)
# 构建解向量 x
x = np.ones(n)

# 计算右端向量 b
b = np.dot(H, x)
#Guess消去法
#高斯消元法
def gaussian_elimination(A, b):
    n = len(A)
    
    # 构建增广矩阵
    aug_matrix = np.concatenate((A, b.reshape(-1, 1)), axis=1)
    
    # 消元过程
    for i in range(n):
        
        pivot = aug_matrix[i, i]  # 主元
        
        # 消除下方的元素
        for j in range(i + 1, n):
            factor = aug_matrix[j, i]/pivot
            aug_matrix[j, :] -= factor * aug_matrix[i, :]
    
    return aug_matrix

# 调用高斯消去法求解方程组
aug_matrix = gaussian_elimination(H, b)

# 输出最后的 A 矩阵
UA= aug_matrix[:, :-1]
print("最后的 A 矩阵:")
for i in range(n):
     for j in range(n):
          if(i>j):
               UA[i][j]=0
print(UA)
rUA = np.linalg.inv(UA)
LA=np.dot(H,rUA)
print("LA")
for i in range(n):
     for j in range(n):
          if(i<j):
               LA[i][j]=0
print(LA)
rLA = np.linalg.inv(LA)
y=np.dot(rLA,b)
rUA = np.linalg.inv(UA)
x=np.dot(rUA,y)
print(x)

#Jacobi迭代法
D = np.diag(np.diag(H))
D_inv = np.linalg.inv(D)
L = -np.tril(H, k=-1)
U = -np.triu(H, k=1)
B=np.dot(D_inv,(L+U))
print(D)
print(L)
print(U)
print(B)
(eva, evt) = np.linalg.eig(B)
print("eigenvalue of matrix B:\n{}".format(eva))
max_abs_value = max(map(abs, eva))
print("lamda中绝对值的最大值:", max_abs_value)
if max_abs_value>1:
     print("矩阵的谱半径大于1,该矩阵发散,无法求解x的值")

#G-S迭代法
C = np.linalg.inv(D-L)
L1=np.dot(C,U)
G1=np.dot(C,b)
print(L1)
print(G1)
(eva1, evt1) = np.linalg.eig(L1)
print("eigenvalue of matrix L1:\n{}".format(eva1))
max_abs_value1 = max(map(abs, eva1))
print("lamda1中绝对值的最大值:", max_abs_value1)
if max_abs_value1>1:
     print("矩阵的谱半径大于1,该矩阵发散,无法求解x的值")
if max_abs_value1<1:
     print("矩阵的谱半径小于1,该矩阵收敛")
x_test1=np.zeros(n)
x_result=G1+np.dot(L1,x_test1)
k=0
print(x_result)
eps=1e-6
while max(map(abs, x_test1-x_result))>eps:
     x_test1=x_result
     x_result=G1+np.dot(L1,x_test1)
     k=k+1
print(x_test1)
print(k)
draw_bar_chart(x_test1)
#SOR迭代法
rob=max_abs_value#max_abs_value=p(B) 谱半径
flag=1-rob*rob
if flag<0:
     print("松弛因子不存在,取w=1.5!")
     w=1.5
if flag>=0:
     w=2/(1+cmath.sqrt(flag))

print(w)

Tw=np.linalg.inv(D-w*L)
Gw=(1-w)*D+w*U
Lw=np.dot(Tw,Gw)
print(Lw)
(eva2, evt2) = np.linalg.eig(Lw)
print("eigenvalue of matrix B:\n{}".format(eva2))
max_abs_value2 = max(map(abs, eva2))
print("lamda中绝对值的最大值:", max_abs_value2)
lamda2=max_abs_value2
if lamda2>1:
     print("矩阵的谱半径大于1,该矩阵发散,无法求解x的值")
if lamda2<=1:
    print("SOR迭代法收敛!")
x_test2=np.zeros(n)
x_result2=np.dot(Lw,x_test2)+w*np.dot(Tw,b)
k1=0
eps1=1e-6
print(x_result2)
while max(map(abs, x_test2-x_result2))>eps1:
     x_test2=x_result2
     x_result2=np.dot(Lw,x_test2)+w*np.dot(Tw,b)
     k1=k1+1
print(x_test2)
print(k1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数值分析实验(二)迭代法的应用 的相关文章

  • 如何访问pandas数据框中的多级索引?

    我想用相同的索引来调用这些行 这是示例数据框 arrays np array bar bar baz baz foo foo qux qux np array one two one two one two one two df pd Da
  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • 如何屏蔽 PyTorch 权重参数中的权重?

    我正在尝试在 PyTorch 中屏蔽 强制为零 特定权重值 我试图掩盖的权重是这样定义的def init class LSTM MASK nn Module def init self options inp dim super LSTM
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • 如何为多组精灵创建随机位置?

    我尝试使用 blit 和 draw 方法进行 for 循环 并为 PlayerSprite 和 Treegroup 使用不同的变量 for PlayerSprite in Treegroup surface blit PlayerSprit
  • Python While 循环,and (&) 运算符不起作用

    我正在努力寻找最大公因数 我写了一个糟糕的 运算密集型 算法 它将较低的值减一 使用 检查它是否均匀地划分了分子和分母 如果是 则退出程序 但是 我的 while 循环没有使用 and 运算符 因此一旦分子可整除 它就会停止 即使它不是正确
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • WindowsError:[错误 5] 访问被拒绝

    我一直在尝试终止一个进程 但我的所有选项都给出了 Windows 访问被拒绝错误 我通过以下方式打开进程 一个python脚本 test subprocess Popen sys executable testsc py 我想杀死那个进程
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • 是否可以强制浮点数的指数或有效数匹配另一个浮点数(Python)?

    这是我前几天试图解决的一个有趣的问题 是否可以强制一个的有效数或指数float与另一个人一样float在Python中 出现这个问题是因为我试图重新调整一些数据 以便最小值和最大值与另一个数据集匹配 然而 我重新调整后的数据略有偏差 大约小
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 将 Scikit-Learn OneHotEncoder 与 Pandas DataFrame 结合使用

    我正在尝试使用 Scikit Learn 的 OneHotEncoder 将 Pandas DataFrame 中包含字符串的列替换为 one hot 编码的等效项 我的下面的代码不起作用 from sklearn preprocessin
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • 设置ssh登录Linux服务器和git上ssh的使用

    设置ssh登录Linux服务器 前言 环境 配置 客户端 服务器端 可能碰到的问题 使用密钥命令登录依然提示输入密码 git如何使用ssh key 前言 我们在远程Linux服务器或者使用git的时候都需要输入密码登录后进行操作 在进行频繁
  • PaddleOCR对于手写符号识别,从零开始搭建(包括期间遇到的所有问题)

    需求 需要对手写图片进行识别 勾 叉 圈 识别成对于的 v x o 其他的符号识别成 e 搭建环境 win10 gpu模式 用cpu搭建过一版 但是cpu训练太慢 搭建cpu期间的问题比gpu问题的少 使用gpu的需要有一块N卡 英伟达 我
  • 非root用户安装 Python + MySQLdb 及使用

    资源不足时要充分发挥主观能动性 没有测试机的root权限 但想用python脚本对数据库进行压测 只能在自己的目录下安装 所以configure的 prefix以及后来install MySQLdb时的路径选项很重要 1 Python ta
  • Vue3中数组filter方法,使用reactive不更新界面,而使用ref定义更新界面

    Vue3中使用reactive定义数组 对其进行更改不更新界面 也检测不到变化 但数据变了 let todoList reactive JSON parse localStorage getItem todoList function cl
  • Initial job has not accepted any resources; check your cluster UI to ensure that workers are...

    在集群上运行spark应用程序时 出现 Initial job has not accepted any resources check your cluster UI to ensure that workers are register
  • matlab多核计算设置1

    刚才试了一下 我使用的MATLAB2010可以多核运行的 需要多核多线程跑的算法 在之前要让matlab在本地建立4个 实验室 我的机器是4核 所以是4个 gt gt matlabpool local 4 Starting matlabpo
  • (No info could be read for -p: geteuid()=1001 but you should be root.)

    场景 使用netstat nltp命令 提示 No info could be read for p geteuid 1001 but you should be root 解决方案 sudo i 切换为root用户即可
  • oled拼接屏优势详解

    湖北省是中国中部地区的一个省份 拥有着丰富的资源和广阔的市场 在这个省份中 随着科技的不断发展 越来越多的企业开始使用oled拼接屏来展示自己的产品和服务 那么 什么是oled拼接屏呢 它有哪些优势和应用场景呢 下面就让我们来了解一下 首先
  • ubuntu 12.04 安装dropbox

    在线安装可能被墙 所以采用下载后安装 step 1 在 https www dropbox com install os lnx 下载对应的 deb包 dropbox 1 6 0 i386 deb step 2 安装 deb包 dpkg i
  • ConstraintLayout约束布局的应用

    首先需要引入我们的ConstraintLayout 在build gradle中加入 compile com android support constraint constraint layout 1 0 2 ConstraintLayo
  • GZHU 网络DNS修改教程

    一 下载软件 点击下载 二 将该软件所在路径添加到系统环境变量 按 Win S 输入 坏境变量 点击该选项 进入Path的编辑 先点击环境变量 再双击 Path 最后点击新建 把dnsproxy exe 所在目录的路径填写在那里 验证是否添
  • 10个常用的Java8日期处理函数案例详解

    Java 8中的日期函数 主要是基于 ISO标准日历系统 java time 包下的所有类都是不可变类型 且线程安全 现在壹哥就日期处理的常用功能代码总结如下 1 获得当前日期 获得当前日期 Test public void testGet
  • 2023面试问答_操作系统

    简单说下你对并发和并行的理解 并行是指两个或者多个事件在同一时刻发生 而并发是指两个或多个事件在同一时间间隔发生 并行是在不同实体上的多个事件 并发是在同一实体上的多个事件 同步 异步 阻塞 非阻塞的概念 同步 当一个同步调用发出后 调用者
  • vue实现锚点定位(多级动态菜单)

    现在有一个需求是实现多级动态菜单点击跳转到相应位置 一般这种需求实现起来就是href id的方式锚点定位 但是这种方式的滚动很生硬 故不采纳 我使用的方案是根据id 获取到当前元素距离body顶部的距离 判断此时滚动条需要滚动的距离 再通过
  • (2020)End-to-end Neural Coreference Resolution论文笔记

    2020End to end Neural Coreference Resolution论文笔记 Abstract 1 Introduction 2 Related Work 3 Task 4 Model 4 1 Scoring Archi
  • Android studio中使用ViewPager和BottomNavigationView实现底部导航栏和碎片的同步切换

    前言 通过几次的踩雷和摸索 完成了以上的操作 本教程写的详细全面 包教包会 对新手有好 看了不会的联系我 我倒立洗头给你看 1 需要了解的一些知识 所需控件 fragment 作为Android中最常用的控件 它有自己的声明周期 可以粗略地
  • 静态代码检测工具 cppcheck ubantu下安装及使用教程

    Cppcheck是用在C C 中对code进行静态检查的工具 它的源码在 GitHub danmar cppcheck static analysis of C C code 它的License是GPL 3 0 它可以帮助我们检测出代码存在
  • Qt 插件创建教程

    Qt 插件创建教程 Qt 是一款非常流行的跨平台GUI应用程序开发工具 它提供了丰富的API和工具库 让开发者快速开发出高质量的应用程序 其中 在Qt中 插件是一个非常重要的概念 它可以帮助我们实现模块化编程 可以让我们的应用程序更加灵活
  • Linux内核学习笔记(八)Page Cache与Page回写

    你也可以通过我的独立博客 www huliujia com 获取本篇文章 综述 Page cache是通过将磁盘中的数据缓存到内存中 从而减少磁盘I O操作 从而提高性能 此外 还要确保在page cache中的数据更改时能够被同步到磁盘上
  • 数值分析实验(二)迭代法的应用

    目录 实验名称 数值分析实验 二 迭代法的应用 实验题目 实验原理 1 高斯消去法 2 Jacobi迭代法 3 G S迭代法 4 SOR迭代法 实验数据记录及处理 实验内容及步骤 1 高斯消元法 2 Jacobi迭代法 3 G S迭代法 4