Gauss-Jordan消去法中完全选主元法求解线性方程组

分类: 数值分析 2007-12-01 09:50 1245人阅读 评论(0) 收藏 举报
outputmatrix算法stringclass
算法名称:完全主元法
算法描述:
1.       在系数矩阵A中找到绝对值最大的数作为主元,并记录它的列号col,行号row,将第col行与第row行交换,即将此主元经过一次初等行变换放到主对角线上。
2.       移动过后,主元所在行每个元除以主元的值,使主元所在位置值为1。
3.       进行初等行变换,使得主元所在列的其他元为0,主元所在行不变。
4.       返回1进行迭代,迭代总次数恰好为A的行数。
:每次初等行变换都要求增广阵b同时进行相应变换。
实际例子
Coefficient matrix:
 | 0.0 2.0 0.0 1.0 | 0.0 |
 | 2.0 2.0 3.0 2.0 | -2.0 |
 | 4.0 -3.0 0.0 1.0 | -7.0 |
 | 6.0 1.0 -6.0 -5.0 | 6.0 |
-----------------------------------------------
After 1 time(s) elimination:
 | 0.0 2.0 0.0 1.0 | 0.0 |
 | 5.0 2.5 0.0 -0.5 | 1.0 |
 | -1.0 -0.16666666666666666 1.0 0.8333333333333333 | -1.0 |
 | 4.0 -3.0 0.0 1.0 | -7.0 |
-----------------------------------------------
After 2 time(s) elimination:
 | 1.0 0.5 0.0 -0.1 | 0.2 |
 | 0.0 2.0 0.0 1.0 | 0.0 |
 | 0.0 0.33333333333333337 1.0 0.7333333333333333 | -0.8 |
 | 0.0 -5.0 0.0 1.4 | -7.8 |
-----------------------------------------------
After 3 time(s) elimination:
 | 1.0 0.0 0.0 0.03999999999999998 | -0.5800000000000001 |
 | -0.0 1.0 -0.0 -0.27999999999999997 | 1.56 |
 | 0.0 0.0 1.0 0.8266666666666667 | -1.3200000000000003 |
 | 0.0 0.0 0.0 1.56 | -3.12 |
-----------------------------------------------
After 4 time(s) elimination:
 | 1.0 0.0 0.0 0.0 | -0.5000000000000001 |
 | 0.0 1.0 0.0 0.0 | 1.0 |
 | 0.0 0.0 1.0 0.0 | 0.33333333333333304 |
 | 0.0 0.0 0.0 1.0 | -2.0 |
-----------------------------------------------
The final solution matrix:
 | 1.0 0.0 0.0 0.0 | -0.5000000000000001 |
 | 0.0 1.0 0.0 0.0 | 1.0 |
 | 0.0 0.0 1.0 0.0 | 0.33333333333333304 |
 | 0.0 0.0 0.0 1.0 | -2.0 |
-----------------------------------------------

代码

package com.nc4nr.chapter02.guassj;

public class GuassJ {
    
    // 4 * 4 coefficient matrix a
    double[][] a = {
            {0.0, 2.0, 0.0, 1.0},
            {2.0, 2.0, 3.0, 2.0},
            {4.0, -3.0, 0.0, 1.0},
            {6.0, 1.0, -6.0, -5.0}
    };
    
    // 4 * 1 coefficient matrix b
    double[][] b = {
            {0.0},
            {-2.0},
            {-7.0},
            {6.0}
    };
    
    private void gaussj(double[][] a, int anrow, 
                        double[][] b, int bncol) {
        int icol = 0, irow = 0;
        double big, dum, pivinv;
        int n = anrow;
        int m = bncol;
        int[] indxr = new int[n], 
                indxc = new int[n], 
                ipiv = new int[n];
        System.out.println("Coefficident matrix :");
        output(a,4,b,1);
        for (int i = 0; i < n; i++) ipiv[i] = 0;
        for (int i = 0; i < n; i++) {
            big = 0.0;
            for (int j = 0; j < n; j++) {
                if (ipiv[j] != 1) {
                    for (int k = 0; k < n; k++) {
                        if (ipiv[k] == 0) {
                            if (Math.abs(a[j][k]) >= big) {
                                big = Math.abs(a[j][k]);
                                irow = j;
                                icol = k;
                            }
                        }
                    }
                }
            }
            ipiv[icol]= ipiv[icol] + 1;
            if (irow != icol) {
                for (int l = 0; l < n; l++) {
                    double mid = a[irow][l];
                    a[irow][l] = a[icol][l];
                    a[icol][l] = mid;
                }
                for (int l = 0; l < m; l++) {
                    double mid = b[irow][l];
                    b[irow][l] = b[icol][l];
                    b[icol][l] = mid;
                }
            }
            indxr[i] = irow;
            indxc[i] = icol;
            if (a[icol][icol] == 0.0) System.out.println("gaussj: Singular Matrix");
            pivinv = 1.0 / a[icol][icol];
            a[icol][icol] = 1.0;
            for (int l = 0; l < n; l++) {
                if (l != icol) {
                    a[icol][l] *= pivinv;
                }
            }
            for (int l = 0; l < m; l++) b[icol][l] *= pivinv;
            for (int ll = 0; ll < n; ll++) {
                if (ll != icol) {
                    dum = a[ll][icol];
                    a[ll][icol]=0.0;
                    for (int l = 0; l < n; l++) {
                        if (l != icol) {
                            a[ll][l] -= a[icol][l]*dum;
                        }
                    }
                    for (int l = 0; l < m; l++) b[ll][l] -= b[icol][l]*dum;
                }
            }
            System.out.println("After " + (i + 1) + " time(s) elimination:");
            output(a,4,b,1); 
        }                    
        for (int l=n-1;l>=0;l--) {
            if (indxr[l] != indxc[l]) {
                for (int k = 0; k < n; k++) {
                    double mid = a[k][indxr[l]];
                    a[k][indxr[l]] = a[k][indxc[l]];
                    a[k][indxc[l]] = mid;
                }
            }
        }
        System.out.println("The final solution matrix:");
        output(a,4,b,1);
    }
    
    private void output(double a[][], int anrow, double b[][], int bncol) {
        for (int i = 0; i < anrow; i++) {
            System.out.println(" | " + a[i][0] + " " + 
                    a[i][1] + " " + 
                    a[i][2] + " " + 
                    a[i][3] + " | " + b[i][0] + " | ");
        }
        System.out.println("-----------------------------------------------");
    }
    
    public GuassJ() {
        gaussj(a, 4, b, 1);
    }
    
    public static void main(String[] args) {
        new GuassJ();
    }

}

Gauss-Jordan消去法中完全选主元法求解线性方程组相关推荐

  1. 全选主元高斯消去法 matlab程序,[VB]全选主元高斯消去法求解线性方程组

    功能:  使用全选主元高斯消去法求解线性方程组 '  参数    n     - Integer型变量,线性方程组的阶数 ' dblA   - Double型 n x n 二维数组,线性方程组的系数矩 ...

  2. 主元分析法 matlab,数值分析实习作业之不选主元法高斯分解(Matlab)

    1,用不选主元法今儿选主元法的高斯消去法求解下列方程组,并记下变换后的增广矩阵: (3) 0.729x1+0.81x2+0.9x3 = 0.6867 X1+x2+x3 = 1 1.331x1+1.21 ...

  3. 牛顿-拉普森法求解线性方程组原理及matlab程序

    牛顿-拉普森法求解线性方程组原理及matlab程序 牛顿-拉普森法原理 Nowton-Raphson方法matlab程序? 牛顿-拉普森法原理   在多变量微积分和矩阵理论的交叉点是求解非线性代数方程 ...

  4. 数值计算(一)之解线性方程组(高斯消去法,列选主元消去法,全选主元消去法,杜立特尔分解,克洛特分解,乔里斯基分解)

    解线性方程组即解一个多元一次方程组,例如 目录 消去法 分解法 消去法 原理 没有学过高级的解法也没关系,凭借我们初高中的知识足以解决这个问题 这是一个多元一次方程组,拥有n个未知量,也有n方程 我们 ...

  5. 部分主元法求解线性方程组

    !//---------------原方程------------- !// x + y + z + w = 10 !// 2x + 3y + z + w = 15 !// 3x - y + 2z - ...

  6. 初等变换法求解线性方程组

    初等变换:通过初等行(列同理)变换把增广矩阵变为简化阶梯型矩阵的线性方程组求解算法   具体步骤: 枚举每一列,找到枚举的当前列绝对值最大数的所在行 将该行换到最上面一行(第r行) 将该行第一个数(该 ...

  7. matlab逆矩阵/初等变换法求解线性方程组

    线性方程组是线性代数学课的考虑范畴,会使用matlab解决,可以效率更快.matlab种逆矩阵是左除和右除.初等变换法就是一个rref函数 逆矩阵 两种格式熟记即可 X=A\B % 表示求解矩阵方程A ...

  8. 不选主元Gauss消去法

    1.不选主元Gauss消去法原理 设Ax=b,其中A∈Rn×n. (1) 如果akk(k)≠0(k=1,2,···,n),则可以通过高斯消去法将Ax=b约化为等价的三角形线性方程组,如下: [a11( ...

  9. 线性代数 --- Gauss消元的部分主元法和完全主元法

    Gauss消元的部分主元法和完全主元法 心怀二意的人,在他一切所行的路上都没有定见.----雅各书1章8节 笔者的一些话:刚开始写这篇文章的时候,我觉得高斯消元很简单.因为,这时的我已经完成了我一直想 ...

最新文章

  1. C++:运算符重载函数之成员运算符重载函数
  2. Golang 标准库提供的Log(一)
  3. arm汇编解析—tengine winograd_nhwc卷积实现
  4. 基于JavaWeb实现的研究室综合系统
  5. 源代码电影涉及的计算机思想,关于电影源代码的结局解释
  6. 抑制过拟合的方法之Dropout(随机删除神经元)
  7. 树莓派(Linux)与镜像源
  8. js中的extend
  9. 【LeetCode】【数组】题号:*48,旋转图像
  10. 洛谷 P3951 小凯的疑惑
  11. 北京自贸区国际商务服务片区挂牌 总面积48平方公里
  12. iPhone X改11Pro在线/免越狱QQ空间任意iPhone机型虚拟定位
  13. Qt QListView QStringListModel用法详解
  14. 第10章第4节:使用iSlide的统一色彩命令统一修改某个颜色 [PowerPoint精美幻灯片实战教程]
  15. ES 索引mapping之keyword;term查询添加keyword查询;更改mapping keyword类型
  16. 感恩母亲节主题活动照片作品征集小程序
  17. 程序流程图、N-S图、PAD图
  18. 【Python】PEP8规范中一些需要注意的地方
  19. 如何设置计算机自动连接宽带,宽带连接怎么设置,怎么设置宽带自动连接
  20. C语言入门:猴子吃桃问题

热门文章

  1. PVST的简单应用及其配置
  2. python + selenium在亚马逊下载产品主图
  3. Matic Network的应用场景大揭秘!
  4. 疫情过后,哪些互联网行业将迎来发展机遇
  5. Linux中断申请之request_threaded_irq
  6. 地下城夺宝游戏——杭电OJ 1044题解析
  7. Android G711(PCMA/PCMU)、G726、PCM音频转码到AAC
  8. Python机器学习库sklearn里利用LR模型进行三分类(多分类)的原理
  9. python 恶搞代码
  10. Arcgis pro中Arcpy对Excel文件进行克里金插值