zoukankan      html  css  js  c++  java
  • 求一个n元一次方程的解,Gauss消元

    求一个n元一次方程的解,Gauss消元

    const Matrix=require('./Matrix.js')
    
    /*Gauss 消元
    传入一个矩阵,传出结果
    */
    function Gauss(matrix){
        let l=[];//是否为自由元
        let ans=[];//存储解
        const n=matrix.Column-1;//解的个数
        const EPS=0.00001;
        let res=0,r=0;
        for(let i=0;i<matrix.Column;i++){
            for(let j=r;j<matrix.Row;j++){
                if(Math.abs(matrix.getItem(j,i))>EPS){
                    if(j!==r){
                        //行交换位置
                        for(let k=i;k<=n;k++){
                            const temp1=matrix.getItem(j,k)
                            const temp2=matrix.getItem(r,k)
                            matrix.setItem(j,k,temp2)
                            matrix.setItem(r,k,temp1)
                        }
                    }
                    break;
                }
            }
            // console.log(matrix.toString(),r,i)
            if(Math.abs(matrix.getItem(r,i)<EPS)){
                ++res;
                console.log('continue')
                continue;
            }
            //方程相减,消除元
            for(let j=0;j<matrix.Row;j++){
                if(j!==r&&Math.abs(matrix.getItem(j,i))>EPS){
                    let tmp=matrix.getItem(j,i)/matrix.getItem(r,i);
                    for(let k=i;k<=n;k++){
                        const item=matrix.getItem(j,k)-tmp*matrix.getItem(r,k)
                        matrix.setItem(j,k,item)
                    }
    
                }
            }
            l[i]=true;
            r++;
        }
        //输出答案
        for(let i=0;i<n;i++){
            if(l[i]){
                for(let j=0;j<n;j++){
                    if(Math.abs(matrix.getItem(j,i))>0){
                        ans[i]=matrix.getItem(j,n)/a.getItem(j,i)
                    }
                }
            }
        }
        return ans;
    }
    
    //x+y+z=6
    //x+2y+z=8
    //x+2y+3z=15
    
    const a=new Matrix([
        1,1,1,4,
        1,2,1,6,
        1,2,1,6,
        1,2,3,10
    ],4,4);
    console.log(Gauss(a))

    [ 0, 2, 2 ]

  • 相关阅读:
    模拟hadoop-rpc通信
    IOUtils方式上传下载文件
    HDFS基本操作的API
    HDFS基本命令行操作及上传文件的简单API
    gcj_2016_Round1_B
    hiho_1070_RMQ
    hiho_1068_RMQ_st算法
    hiho_1067_最近公共祖先2
    hiho_1062_最近公共祖先
    hiho_1066_并查集
  • 原文地址:https://www.cnblogs.com/caoke/p/10451181.html
Copyright © 2011-2022 走看看