北航数值分析C++代码:符号函数与矩阵分解

需积分: 23 1 下载量 157 浏览量 更新于2024-08-21 收藏 13KB TXT 举报
"北航数值分析课程的第二题C++代码实现,主要涉及矩阵的拟三角分解和QR分解算法" 这段代码是针对数值分析中的一种矩阵处理问题,具体包括两个部分:拟三角分解(Nishangsanjiao 分解)和QR分解。这两种分解在数值线性代数中有广泛应用,例如求解线性方程组、特征值问题以及矩阵的近似计算等。 1. 拟三角分解: 拟三角分解是一种简化版的下三角分解,目的是将矩阵转化为一个上三角矩阵和一个低秩矩阵的乘积。在这个过程中,通过一系列行变换(Gauss-Jordan消元法的简化版),逐步将矩阵的下方元素置零。`inishangsanjiaodiv` 函数实现了这个过程。首先,检查矩阵的每一列,如果某列的前一列元素小于预设的较小阈值E,则跳过这一列,避免因数值接近零而引起的计算误差。接着,通过行交换和行标量乘法,逐步将非对角线元素变为零,同时保持矩阵的列不变性。 2. QR分解: QR分解是将一个矩阵A分解为一个正交矩阵Q和一个上三角矩阵R的乘积,即A=QR。在数值计算中,QR分解常用于求解线性最小二乘问题和求解特征值问题。`qrdiv` 函数实现这个过程,采用了Householder反射的迭代方法。对于每一步,它构造一个Householder向量,通过与矩阵的相应列相乘,将列向量的一部分变为零,从而逐渐形成上三角矩阵R。同时,利用这些反射构建正交矩阵Q。 代码中的变量和数据结构如下: - `N`:表示矩阵的大小,固定为10。 - `E`:定义了一个很小的阈值,用于判断是否可以忽略某个元素。 - `MAX`:设置的最大迭代次数,这里设定为10000次,防止无限循环。 - `doublesgn` 函数:返回一个数的符号,如果大于0返回1,小于0返回-1。 - `u`, `p`, `q`, `w` 数组:在矩阵运算中作为临时存储,用于行变换和计算。 - `A`, `Q`, `R` 矩阵:分别代表原始矩阵、正交矩阵和上三角矩阵。 这段代码展示了数值分析中矩阵运算的典型实现,对于学习和理解数值线性代数中的矩阵分解算法有着重要的参考价值。