2012-2013(1)专业课程实践论文
选主元(列)的三角分解法
范俊,0818180124,R数学08-1班 毛勇,0818180117,R数学08-1班
一、算法理论
从直接三角分解公式可看出,当时计算将中断或者当绝对值很
小时,按分解公式计算可能要求舍入误差的累积,但如果非奇异,就可通过交换的行实现矩阵
的
分解,因此可采用与列主元素消去法类似的方法
(可以证明下述方法与列主元素消去法等价),将直接三角分解法修改为(部分)选主元的三角分解法。
设第
步分解已完成,这时有
第步分解需要用到式
及式
为了避免用小的数
作除数,引进量
于是有
,
,
用作为,交换的行与行元素(将位置的新元素仍记作及
),于是有。由此在进行第步分解计算。
该程序即利用选主元的三角分解法解方程求方程的根。先选择列主元,再构造LU矩阵,通过求解LY = B和UX = Y得出需要的解。
注:方程维数在程序中需按题意自定义。
二、算法框图
输入方程组选列主元否是否是该列最大绝对值是交换行构造LU矩阵求解LY = B求解UX = Y
三、算法程序
源代码源代码:
LU_Decomposition.cpp #include
#define N 4 //矩阵维数,可自定义 static double A[N][N]; //系数矩阵 static double B[N]; //右端项 static double Y[N]; //中间项 static double X[N]; //输出
static double S[N]; //选取列主元的比较器 int i,j,k; //计数器 void main()
{
cout << \请输入线性方程组(ai1,ai2,ai3......ain, yi):\ for ( i = 0; i < N ;i++) {
for (int j = 0; j< N ;j++ ) cin >> A[i][j]; cin >>B[i]; }
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; }