数值分析计算实习题列主元高斯消去法解线性方程组.docx
《数值分析计算实习题列主元高斯消去法解线性方程组.docx》由会员分享,可在线阅读,更多相关《数值分析计算实习题列主元高斯消去法解线性方程组.docx(17页珍藏版)》请在冰豆网上搜索。
数值分析计算实习题列主元高斯消去法解线性方程组
数值分析计算实习题
第5章解线性方程组的直接方法
列主元高斯消去法解线性方程组。
书上的计算实习题1、2、3都要求用列主元高斯消去法解线性方程组,所以考虑写一个普适的程序来实现。
对于线性方程组Ax=b,程序允许用户从文件读入矩阵数据或直接在屏幕输入数据。
文件输入格式要求:
(1)第一行为一个整数n(2<=n<=100),表示矩阵阶数。
(2)第2〜n+1行为矩阵A各行列的值。
(3)第n+2〜n+n+2行为矩阵b各行的值。
屏幕输入:
按提示输入各个数据。
输出:
A、b、det(A)、列主元高斯消去计算过程、解向量X。
【算法说明】
设有线性方程组Ax=b,其中设A为非奇异矩阵。
方程组的增广矩阵为
[a,b]=
an„
第1步(k=l):
首先在A的第一列中选取绝对值最大的元素%,作为第一步的主元素:
如凜产如工0
然后交换(A,b)的第1行与第1行元素,再进行消元计算。
设列主元素消去法已经完成第1步到第k・l步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组A(k)x=b(k)
用姐…哦盘…於?
MB
•
■
•
■
■
[A,b]T[A(?
b(*)]=
■
…盅
•
a"〉
■
唱”
■
■
■
•
•
•
•
...卅
IUI
•
第k步计算如下:
对于k=l,2,n-1|時卜maxaf"
(1)按列选主元:
即确定t使
(2)如果tHk,则交换[A,b]第t行与第k行元素。
(3)消元计算
aikJ叫=-bgk+X・・Ji)
akk
%<-%+叫ciy(i,j=k+l,…川)
»〜乞+叫几(j=k+l,…屮)
消元乘数mik满足:
M=吃+1,产•,)
(4)回代求解
(b厂工陶形)
兀<,('=〃_1屮_2,・・、1)
【程序】
/*
【普适列主元消去法解线性方程组】对于线性方程组:
Ax=b
输入:
[选择屏幕直接输入]
1・A的行阶数11(1<=n<=100)
2.A的值
3.b的值
[选择读取文件]
文件名(和主程序同级文件夹下)
输出:
1.A
2.b
3.det(A)
4.解向量x
#include
#include
#include
doubleA[1O5][1O5],A_B[1O5][1O习、b[105],x[105];doubledetA;
intnjnaik=1;
〃读入数据
voidinput(){
intij;
charch[20],name[100];
FILE*f;
printfC^—-\ii是否从文件读取数据(Y/N):
”);scaufp%s:
&ch);
if(ch[O]=Y'||ch[0]=V){
prmtfC'请输入文件名(包扌舌扩展名):
”);scanfi(H%s,\name);
f=fbpen(name;,in);
fscaiif(f/%d*\&n);
fbr(i=0;ifor(j=0jfbr(i=0;i住canfg'%lf;&b[i]);
pnntfC请输入A的阶数:
”);scanf(n%d%cT,&n);
prmtfC请输入A的值:
”);
fbr(i=0;ifor(j=Ojprintf("请输入b的值:
”);
fbr(i=0;i}
}
〃计算行列式的值
doubledet(doubles[105][105],intm){
intzj,k;
doubleb[105][105],total=0,r;/*b[N][N]ffl于存放,在矩阵s[N][N]中元素s[0]的余子式*/
fbr(z=0;zfor(j=0jfor(k=0;kif(k>=z)
b[j][k]=s[j+l][k+l];
else
bQ][k]=s[j+l][k];
if(z%2==0)
r=s[0][z]*det(b4ii-1);/*递归调用
else
r=(-1)*s[O]JXl*det(bjn-1);
total=total+r;
}
}
elseif(m=2)
total=s[0][0]*s[l][l]-s[0][l]*s[l][0];
elseif(m=1)
total=s[0][0];
returntotal;
}
//输出A和b和det(A)voidoutput_lQ{
intij;
pnntffA=\iin);
for(i=0;ifor。
=OJ}
printf(H\nb=\n”);
for(i=0;ipnntfC%15・4f\iT;b[i]);
printf(M\iidet(A)=%.4fn*\detA);}
//主计算函数
voidcount_x(){
mtij,k;
intmax;
doubletmpjiuk;
//构造增广矩阵
for(i=0;iA_B[i][j]=A[i]|j];A_B[i][n]=b[i];
}
pnntf(”\n展示消元过程(A_E为A的増广矩阵printf(HA_B=\iT);
for(i=0;i}
〃按列选主元
for(k=0;kfbr(i=k;iabs(A_B[max][k]))max=i;
〃若A[inax][k]=0,即det(A)=0,则无唯一解,退出计算
「s3al<餐s3al<•a==alvHs曰alvsggrfg曰q—v丄二sq—v丄二SST<
(++「u:
>■:
?
+;
「32al<二兰三alvH3H〕alv
)(++=uV匚+上HT)」OJ
M七賦泌s
QluuH3XGUTMIVs〔xc3qlv丄二gSTHv蛋HmE
)(4I!
.HcgT
oH4TU2
)(0HHg〔xuu二8—vm
xu3ql<*msql(++ruv^+thmE工U」zqlX!
^0ha=e;HnTOJ
•U=T•sale二U=T'aqlfms'umc•u」x
rsT:
oH4TU2
(0==〔「U=T;»1<七M44m型•灌—誉宋耳0H<七UT】d
「■§zql<・J寸・3贾呂目d
(++■?
Hv〔0H
X++-SV「0HVOJ「(Mhgrv.^md
oHssalv
//输出解向量xvoidoutput_2Q{
intij;
if(?
niaik)
pnntf(”\n该方程没有唯一解!
else{
prmtf(M\iib=\iin);
fbr(i=0;iprintf(H%15.5fn*\x[i]);
}
}
intmam(){
charch[20];
pnntfC普适列主元消去法解线性方程组E);
wlule(l){
mput();
detA=det(A.n);output」();count_xQ;
output_2();
//读取数据
//计算A的行列式
//输出A和bfndet(A)
//主计算函数
//输出解向量X
是否继续(Y/N)小);
scanf(M%sH,&ch);
if(ch[O]==T11|ch[0]=V)contmue;
else
break;
【结果测试】
一共采用了书上的例题和习题内的5组数据(dl〜d5),均采用文件读入方式读取,计算结果,与mntlab运算结果进行比对均相符合,基本验证了程序的正确性。
下面给出各组数据和运行结果:
[数据]
dl.txt
3
3.016.031.99
1.274.16-1.23
0.987-4.819.34
1
1
1d2.txt
3
3.006.031.99
1.274.16-1.23
0.99-4.819.34
1
1
1d3.txt
3
0.0012.0003.000
-1.0003.7124.623
-2.0001.0725.643
1.000
2.000
3.000d4.txt
4
10-701
-32.09999962
5-15-1
2102
8
5.900001
5d5.txt
4
10787
7565
86109
75910
32
2333
31
[运行结果]
普适列主元消去法解线性方程组
是否从文件读取数据(Y/N)y请输入文件名(包括扩展名):
dl.txt
A=
3.0100
6.0300
1.9900
1.2700
4.1600
-1.2300
0.9870
-4.8100
9.3400
1.0000
1.0000
1.0000
det(A)=-0.0305
展示消元过程(AJB为A的增广矩阵):
A_B=
3.0100
6.0300
1.9900
1.0000
1.2700
4.1600
-1.2300
1.0000
0.9870
-4.8100
9.3400
1.0000
A_B=
3.0100
6.0300
1.9900
1.0000
0.0000
1.6158
-2.0696
0.5781
0.0000
-6.7873
8.6875
0.6721
A_B=
3.0100
6.0300
1.9900
1.0000
0.0000
-6.7873
8.6875
0.6721
0.0000
0.0000
-0.0015
0.7381
A_B=
3.0100
6.0300
1.9900
1.0000
0.0000
-6.7873
8.6875
0.6721
0.0000
0.0000
-0.0015
0.7381
b=
1592.59962
-631.91138
-493.61772
是否继续(Y/N):
y
是否从文件读取数据(Y/N〉:
y
请输入文件名(包拾扩展名):
d2.txt
A=
3.0000
6.0300
1.9900
1.2700
4.1600
-1.2300
0.9900
-4.8100
9.3400
1.0000
1.0000
1.0000
det(A)=-0.4070
展示消元过程(AJB为A的增广矩阵):
A_B=
3.0000
1.2700
0.9900
6.0300
4.1600
-4.8100
1.9900
-1.2300
9.3400
1.0000
1.0000
1.0000
A_B=
3.0000
6.0300
1.9900
1.0000
0.0000
1.6073
-2.0724
0.5767
0.0000
-6.7999
8.6833
0.6700
A_B=
3.0000
6.0300
1.9900
1.0000
0.0000
-6.7999
8.6833
0.6700
0.0000
0.0000
-0.0200
0.7350
A_B=
3.0000
6.0300
1.9900
1.0000
0.0000
-6.7999
8.6833
0.6700
0.0000
0.0000
-0.0200
0.7350
119.52734
-47.14260
-36.84026
是否继续(Y/N)y
是否从文件读取数据(Y/N〉:
y
请输入文件名(包括•扩展名):
d3.txt
A=
0.0010
2.0000
3.0000
-1.0000
3.7120
4.6230
-2.0000
1.0720
5.6430
1.0000
2.0000
3.0000
det(A)=11.8660
展示消元过程(A_E为A的增广矩阵):
A_B=
0.0010
2.0000
3.0000
1.0000
-1.0000
3.7120
4.6230
2.0000
-2.0000
1.0720
5.6430
3.0000
A_B=
-2.0000
1.0720
5.6430
3.0000
0.0000
3.1760
1.8015
0.5000
0.0000
2.0005
3.0028
1.0015
A_B=
-2.0000
1.0720
5.6430
3.0000
0.0000
3.1760
1.8015
0.5000
0.0000
0.0000
1.8681
0.6866
A_B=
-2.0000
1.0720
5.6430
3.0000
0.0000
3.1760
1.8015
0.5000
0.0000
0.0000
1.8681
0.6866
-0.49040
-0.05104
0.36752
是否继续(Y/N):
y
是否从文件读取数据(Y/N):
y请输入文件名(包括扩展名):
d4.txtA=
10.0000
-7.0000
0.0000
1.0000
-3.0000
2.1000
6.0000
2.0000
5.0000
-1.0000
5.0000
-1.0000
2.0000
1.0000
0.0000
2.0000
b=
8.0000
5.9000
5.0000
1.0000
det(A)=-762.0001
展示消元过程(AJB为A的增广矩阵):
A_B=
10.0000
-7.0000
0.0000
1.0000
8.0000
-3.0000
2.1000
6.0000
2.0000
5.9000
5.0000
-1.0000
5.0000
-1.0000
5.0000
2.0000
1.0000
0.0000
2.0000
1.0000
A_B=
10.0000
-7.0000
0.0000
1.0000
8.0000
0.0000
-0.0000
6.0000
2.3000
8.3000
0.0000
2.5000
5.0000
-1.5000
1.0000
0.0000
2.4000
0.0000
1.8000
-0.6000
A_B=
10.0000
-7.0000
0.0000
1.0000
8.0000
0.0000
2.5000
5.0000
-1.5000
1.0000
0.0000
0.0000
6.0000
2.3000
8.3000
0.0000
0.0000
-4.8000
3.2400
-1.5600
A_B=
10.0000
-7.0000
0.0000
1.0000
8.0000
0.0000
2.5000
5.0000
-1.5000
1.0000
0.0000
0.0000
6.0000
2.3000
8.3000
0.0000
0.0000
0.0000
5.0800
5.0800
A_B=
10.0000
-7.0000
0.0000
1.0000
8.0000
0.0000
2.5000
5.0000
-1.5000
1.0000
0.0000
0.0000
6.0000
2.3000
8.3000
0.0000
0.0000
0.0000
5.0800
5.0800
-0.00000
-1.00000
1.00000
1.00000
是否继续(Y/N):
y
是否从文件读取数据(Y/N):
y请输入文件名(包括扩展名):
d5.txtA=
10.0000
7.0000
8.0000
7.0000
7.0000
5.0000
6.0000
5.0000
8.0000
6.0000
10.0000
9.0000
7.0000
5.0000
9.0000
10.0000
32.0000
23.0000
33.0000
31.0000
det(A)=1.0000
展示消元过程(AJB为A的增广矩阵):
A_B=
10.0000
7.0000
8.0000
7.0000
7.0000
5.0000
6.0000
5.0000
8.0000
6.0000
10.0000
9.0000
7.0000
5.0000
9.0000
10.0000
32.0000
23.0000
33.0000
31.0000
A_B=
10.0000
7.0000
8.0000
7.0000
32.0000
0.0000
0.1000
0.4000
0.1000
0.6000
0.0000
0.4000
3.6000
3.4000
7.4000
0.0000
0.1000
3.4000
5.1000
8.6000
A_B=
10.0000
7.0000
8.0000
7.0000
32.0000
0.0000
0.1000
0.4000
0.1000
0.6000
0.0000
0.0000
0.0000
0.0000
2.0000
3.0000
3.0000
5.0000
5.0000
8.0000
A_B=
10.0000
7.0000
8.0000
7.0000
32.0000
0.0000
0.1000
0.4000
0.1000
0.6000
0.0000
0.0000
3.0000
5.0000
8.0000
0.0000
0.0000
0.0000
-03333
-0.3333
A_B=
10.0000
7.0000
8.0000
7.0000
32.0000
0.0000
0.1000
0.4000
0.1000
0.6000
0.0000
0.0000
3.0000
5.0000
8.0000
0.0000
0.0000
0.0000
-03333
-0.3333
1.00000
1.00000
1.00000
1.00000
是否继续(Y/N):