在线性代数中,LU分解是将一个矩阵分解为 L(单位下三角矩阵)和 U(上三角矩阵),可用于求解线性方程组、反矩阵和计算行列式。本文结合LU分解,用javascript实现线性方程组的求解;
假设存在线性系统Ax = b,其中A为n*n矩阵, b为1*n向量,先进行A=LU分解,得到 LUx = b, 再令Y = Ux,得到LY = b,求出Y,再由Y = Ux求解x,具体算法实现如下:
/**
* 用于实现1-6元线性方程组求解
* @author: Wujinhua
* */
function BuildArray () {
this.Arr = [];
}
BuildArray.prototype.matrix = function(n) {
for (let i = 0; i < n; i++) {
let nRows = [];
for (let j = 0; j < n; j++) {
nRows.push(0);
}
this.Arr.push(nRows);
}
return this.Arr;
};
BuildArray.prototype.vector = function (n) {
for (let i = 0; i < n; i++) {
this.Arr.push(0);
}
return this.Arr;
};
function _argumentsToArray( args ) {
return [].concat.apply( [], Array.prototype.slice.apply(args) );
}
/**
* lu分解求解线性方程组
* @param: n*n矩阵arraysA 和 n维向量arraysB
* @example:
* let A = [1,2,3,2,5,2,3,1,5];
* let b = [4,18,20];
* let x = lu(A, b);
*/
function lu(arraysA, arraysB) {
let n = arraysA.length;
let result1 = _argumentsToArray(arraysA);
let A = undefined;
if(n === 2) A = mat2(result1);//2*2矩阵
if(n === 3) A = mat3(result1);//3*3
if(n === 4) A = mat4(result1);//4*4
if(n === 5) A = mat5(result1);//5*5
if(n === 6) A = mat6(result1);//6*6
let ll = new BuildArray();//初始化矩阵L
let l = ll.matrix(n);
let uu = new BuildArray();//初始化U矩阵
let u = uu.matrix(n);
//进行U矩阵的第一行赋值