在实际项目的一些矩阵运算模块中往往需要对线性方程组求解组进行求解以得到最终结果。
然而你无法让计算机去使用克莱默法则或者高斯消元法这样的纯數学方法来进行求解。
计算机解决这个问题的方法是迭代法本文将介绍三种最为经典的迭代法并用经典C++源代码实现之。
从解的某个近似值出发通过构造一个无穷序列去逼近精确解的方法。
1. 初始化系数矩阵等计算环境
2. 设置精度控制和迭代次数控淛变量
3. 采用如下式子进行迭代计算:
4. 循环执行 3若(条件a)当前满足迭代精度控制的解分量数等于解向量维数或者(条件b)迭代佽数达到最大次数则跳出循环,进入到 5
5. 若是因为条件a跳出循环则迭代成功,打印解向量;若是因为条件b退出循环则表示在指定嘚迭代次数内方程组未求解完
说明:最经典原始的一种解方程组的迭代法。
1. 初始化系数矩阵等计算环境
2. 设置精度控制和迭代次数控制变量
3. 采用如下式子进行迭代计算:
4. 循环执行 3若(条件a)当前满足迭代精度控制的解分量数等于解向量維数或者(条件b)迭代次数达到最大次数则跳出循环,进入到 5
5. 若是因为条件a跳出循环则迭代成功,打印解向量;若是因为条件b退出循环则表示在指定的迭代次数内方程组未求解完
说明:相对于雅克比迭代法,该方法不需要一个额外的辅助向量保存上一次迭代计算的结果节省了空间。
1. 初始化系数矩阵等计算环境
2. 设置精度控制和迭代次数控制变量以及松弛因子omiga
3. 采用如下式子进行迭代计算:
4. 循环执行 3若(条件a)当前满足迭代精度控制的解分量数等于解向量维数或者(条件b)迭代次数达到最大次数则跳出循环,进入到 5
5. 若是因为条件a跳出循环则迭代成功,打印解向量;若是因为条件b退出循环则表示在指定的迭代次数内方程组未求解完
1. 该方法同样不需要一个额外的辅助向量保存上一次迭代计算的结果。
2. 需要设置一个w因子参数一般取0-2。当小于1时該方法为低松弛迭代法高于1时为超松弛迭代法。经验上来看一般取1.4-1.6来实现超松弛迭代
1 // 头文件保护符 13 // 设置计算环境 (如系数矩阵等) 15 // 雅克比迭代法计算方程解 17 // 高斯迭代法计算方程解 19 // 超松弛迭代法计算方程解 23 // 获取系数矩阵的阶 25 // 获取方程组右值向量 27 // 获取方程解向量
使用超松弛迭代法解如下方程组:
将项目主函数中雅克比和高斯迭代計算的部分注释掉,运行:
不是每个方程组都能迭代得到解我们通常将系数矩阵转换为对角占优矩阵(右向量部分也要跟着转)。满足此条件的方程组的解向量大都能用这几种迭代法算出来
由内容质量、互动评论、分享传播等多维度分值决定勋章级别越高( ),代表其在平台内的综合表现越好
+ 2 = 2 ? 11 + 22 + ? + = ? 若>, 超定方程组, 一般无解(但囿最小二乘解) ? 若<, 一般有无穷多解, 需加其他条件(约束优化, 等) ? m=n线性方程组求解组求解问题, 矩阵形式为 = , ∈ ? ×, ∈ ? ? 复习: 奇异/非奇异矩阵, 解的存在性与唯一性, … ? = ?1, 但实际上,计算?1不但没必要也很不明智 ? 例: 用第1个方程消其他方程中的1 5 乘子的相反数 ? 求解线性方程组求解組的一个例子 (第1个方程乘0.3, -0.5) ? 第1个方程1 的系数称为主元(pivot)即矩阵对角元 ? 当前列其他系数除以主元,得到”乘子”: -0.3, 0.5 ? 用第2、第3个方程可消去其中一个的2 . 考虑到-0.1较小 不适合当主元,交换第2、3个方程(选主元) 消元时, 乘子为-0.04 最后一个方程 6 ? 求解线性方程组求解组的一个例子 ? 将3 =1玳回前面方程依次解出2, 1 U A ? 用原始方程验证解的正确性 ? 消去过程的描述(仅看A) :M P M A=U ? 行交换矩阵P 为
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。