实验五
矩阵的lu分解法,雅可比迭代法
班级:
学号:
姓名:
实验五 矩阵的LU 分解法,雅可比迭代
一、目的与要求:
熟悉求解线性方程组的有关理论和方法;
会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序; 通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。
二、实验内容:
会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序,进一步了解
各种方法的优缺点。
三、程序与实例
列主元高斯消去法
算法:将方程用增广矩阵[A ∣b ]=(ij a )1n (n )+⨯表示 1) 消元过程 对k=1,2,…,n-1
①选主元,找{}n ,,1k ,k i k +∈使得
k ,i k a =
ik a n
i k max ≤≤
②如果0a k ,i k =,则矩阵A 奇异,程序结束;否则执行③。
③如果k i k ≠,则交换第k 行与第k i 行对应元素位置,
j i kj k a a ↔ j=k,┅,n+1
④消元,对i=k+1, ┅,n 计算
kk ik ik a a l /=
对j=l+1, ┅,n+1计算
kj ik ij ij a l a a -=
2) 回代过程
①若0=nn a ,则矩阵A 奇异,程序结束;否则执行②。
②nn n n n a a x /1,+=;对i=n-1, ┅,2,1,计算
ii n
i j j ij n i i a x a a x /11,⎪⎪⎭
⎫ ⎝
⎛-
=∑+=+
程序与实例
程序设计如下:
#include <iostream>
#include <cmath>
using namespace std;
void disp(double** p,int row,int col){
for(int i=0;i<row;i++){
for(int j=0;j<col;j++)
cout<<p[i][j]<<' ';
cout<<endl;
}
}
void disp(double* q,int n){
cout<<"====================================="<<endl; for(int i=0;i<n;i++)
cout<<"X["<<i+1<<"]="<<q[i]<<endl;
cout<<"====================================="<<endl; }
void input(double** p,int row,int col){
for(int i=0;i<row;i++){
cout<<"输入第"<<i+1<<"行:";
for(int j=0;j<col;j++)
cin>>p[i][j];
}
}
int findMax(double** p,int start,int end){
int max=start;
for(int i=start;i<end;i++){
if(abs(p[i][start])>abs(p[max][start]))
max=i;
}
return max;
}
void swapRow(double** p,int one,int other,int col){
double temp=0;
for(int i=0;i<col;i++){
temp=p[one][i];
p[one][i]=p[other][i];
p[other][i]=temp;
}
}。