import java.util.Arrays;
/**
* 矩阵的直接三角分解 ,调用示例:
*
* DirectDecomposition dd = new DirectDecomposition(data);//data为一个二维double数组,代替一个矩阵
*
* double[][] l = dd.getL();//获取L
*
* double[][] u = dd.getU();//获取U
*
* @author 清雨季
*/
public class DoolittleDecomposition {
private double[][] data;
private double[][] l;
private double[][] u;
private int n;
/**
* 创建一个n阶的矩阵
*
* @param n
*/
public DoolittleDecomposition(double[][] data) {
if (data == null || data.length == 0 || data.length != data[0].length) {
throw new RuntimeException("不是一个方阵");
}
this.data = data;
n = data.length;
l = new double[n][n];
u = new double[n][n];
countLU();
}
protected void countLU() {
for (int i = 0; i < n; i++) {// 第一步,计算L的第一列和U的第一行:U1i=A1i,Li1=Ai1/U1i
u[0][i] = data[0][i];
l[i][0] = data[i][0] / u[0][i];
}
for (int r = 1; r < n; r++) {
for (int i = r; i < n; i++) {
u[r][i] = data[r][i] - sumLrkUki(r, i);
l[i][r] = (data[i][r] - sumLikUkr(r, i)) / u[r][r];
}
}
}
/**
* 求和:Lrk*Uki 对k求和:1<=k<=r-1
*
* @param r
* @param i
* @return
*/
private double sumLrkUki(int r, int i) {
double re = 0.0;
for (int k = 0; k < r; k++) {
re += l[r][k] * u[k][i];
}
return re;
}
private double sumLikUkr(int r, int i) {
double re = 0.0;
for (int k = 0; k < r; k++) {
re += l[i][k] * u[k][r];
}
return re;
}
public double[][] getData() {
return data;
}
public double[][] getL() {
return l;
}
public double[][] getU() {
return u;
}
public static void main(String[] args) {
double[][] data= {
{1,2,6},
{2,5,15},
{6,15,46},
};
DoolittleDecomposition dd = new DoolittleDecomposition(data);
double[][] l = dd.getL();
double[][] u = dd.getU();
int n = l.length;
System.out.println("L阵:");
for (int i = 0; i < n; i++) {
System.out.println(Arrays.toString(u[i]));
}
System.out.println("---------------------");
System.out.println("U阵:");
for (int i = 0; i < n; i++) {
System.out.println(Arrays.toString(l[i]));
}
}
}
14.高斯消元法的求解过程可大致分为两个阶段:(1)把原方程组化为上三角形方程组,称之为“消元”过程;(2)用逆次序逐一求出上三角方程组(原方程组的等价方程组)的解,称之为“回代”过程.
15.定义3.1: 设A为n阶矩阵,L为n阶下三角阵,U为n阶上三角阵。如果A=LU,则说明矩阵A实行了三角分解或LU分解。
16.定义3.2: 如果L为单位下三角阵,U为上三角阵,则称该三角分解为杜里特(Doolittle)分解;如果L为下三角阵,U为单位上三角阵,则称A=LU为克劳特(Crout)分解。
定理3.1:n阶(n≥2)矩阵A有唯一杜里特分解(或克劳特分解)的充要条件是A的前n-1个顺序主子式都不为零。
定理3.2:设A为对称正定矩阵,则有非奇异下三角阵L,使A=LLT;当限定L的对角元全为正时,这种分解是唯一的。