一、 L-U列主元法解线性方程组
1.1 实验原理
定理1:设非奇异,若其顺序主子式均不为零,则存在唯一的单位下三角矩阵L和上三角矩阵U,使得A=LU.
设A = LU,其中L为一个单位下三角矩阵,U为一个上角矩阵,即
转化为Ly = b及Ux = y的两个三角形方程组,由三角形方程组很容易通过回代方法求解方程组的解。
1.2 算法说明
1.3 流程图
1.4 程序设计说明
1.5 程序例题
1.5.1 实验题目
计算下列线性方程组的解
1.5.2 程序运行结果
1.5.3 手算验证过程
1.6 代码
// Note:Your choice is C++ IDE
#include<iostream>
using namespace std;
#include<math.h>
#define N 3 //矩阵维数,可自定义
double A[N][N] = {1,2,3,5,4,10,3,0.2,5}; //系数矩阵
double B[N] = {1,0,2}; //右端项
double Y[N]; //中间项
double X[N]; //输出
double S[N]; //选取列主元的比较器
int i, j, k; //计数器
int main()
{
for (k = 0; k < N; k++)
{
//选列主元
int index = k;
for (i = k; i < N; i++)
{
double temp = 0;
for (int m = 0; m < k; m++)
{
temp = temp + A[i][m] * A[m][k];
}
S[i] = A[i][k] - temp;
if (S[index] < S[i])
{
index = i;
}
}
//交换行
double temp;
for (i = k; i < N; i++)
{
temp = A[index][i];
A[index][i] = A[k][i];
A[k][i] = temp;
}
temp = B[index];
B[index] = B[k];
B[k] = temp;
// 构造L、U矩阵
for (j = k; j < N; j++)
{
double temp = 0;
for (int m = 0; m < k; m++)
{
temp = temp + A[k][m] * A[m][j];
}
A[k][j] = A[k][j] - temp; //先构造U一行的向量
}
for (i = k + 1; i < N; i++)
{
double temp = 0;
for (int m = 0; m < k; m++)
{
temp = temp + A[i][m] * A[m][k];
}
A[i][k] = (A[i][k] - temp) / A[k][k]; //再构造L一列的向量
}
}
//求解LY = B
Y[0] = B[0];
for (i = 1; i < N; i++)
{
double temp = 0;
for (int j = 0; j < i; j++)
{
temp = temp + A[i][j] * Y[j];
}
Y[i] = B[i] - temp;
}
//求解UX = Y
X[N - 1] = Y[N - 1] / A[N - 1][N - 1];
for (i = N - 2; i >= 0; i--)
{
double temp = 0;
for (int j = i + 1; j < N; j++)
{
temp = temp + A[i][j] * X[j];
}
X[i] = (Y[i] - temp) / A[i][i];
}
//打印X
cout << "此方程组的解为:" << endl;
for (i = 0; i < N; i++)
{
cout << X[i] << " ";
}
cout << endl;
return 0;
}