#用C语言求解N阶线性矩阵方程Axb的简单解法Word文件下载.docx
- 文档编号:20038874
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:10
- 大小:428.63KB
#用C语言求解N阶线性矩阵方程Axb的简单解法Word文件下载.docx
《#用C语言求解N阶线性矩阵方程Axb的简单解法Word文件下载.docx》由会员分享,可在线阅读,更多相关《#用C语言求解N阶线性矩阵方程Axb的简单解法Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
外第j行以下的其他元素通过第二种初等行变换化为0,这样,就能使系数矩阵通过这样的行变换化为一个上三角矩阵,即
,
当系数矩阵A进行初等行变换时,常数矩阵也要进行对应的初等行变换,即此时
那么有
接下来,进行“反代”,由
可求出
,再往上代入
即可求出
以此类推,即可从
xn推到
xn-1
,再推到xn-2
直至
x1
。
至此,未知矩阵x的所有元素就全部求出,即求出了原方程组有且仅有的唯一一组解。
基本原理示意图:
三、编写程序
1.#include<
stdio.h>
2.#include<
stdlib.h>
3.#include<
math.h>
4.#definedim10
//定义最大的维数10,为防止计算值溢出
5.doublea[dim+1][dim+1],b[dim+1],x[dim+1];
//定义双精度数组
6.doubletemp;
7.doublegetarray(intn);
//定义输入矩阵元素的函数
8.doubleshowarray(intn);
//定义输出化简系数矩阵过程的函数
9.intn,i,j,k,p,q;
10.doublemain()
11.{
12.
13.printf("
请输入系数矩阵的阶数n(n<
10):
"
);
14.scanf("
%d"
&
n);
15.
/*判断矩阵阶数是否超过界定值*/
16.
if(n>
dim)
17.
{
18.
printf("
错误:
元数超过初设定的值%d,请重启程序重新输入\n"
dim);
19.
exit(0);
20.
}
21.
/*输入系数矩阵和常数矩阵(即增广矩阵)的元素*/
22.
getarray(n);
23.
24.
/*使对角线上的主元素不为0*/
25.
for(j=1;
j<
=n-1;
j++)
26.
27.
if(a[j][j]==0)
28.
for(i=j+1;
i<
=n;
i++)
29.
{
30.
if(a[i][j]!
=0)
31.
32.
/*交换增广矩阵的第i行和第j行的所有元素*/
33.
for(k=1;
k<
k++)
34.
35.
a[i][k]+=a[j][k];
36.
a[j][k]=a[i][k]-a[j][k];
37.
a[i][k]-=a[j][k];
38.
}
39.
b[i]+=b[j];
40.
b[j]=b[i]-b[j];
41.
b[i]-=b[j];
42.
43.
continue;
//找到第j列第一个不为0的元素即跳回第一层循环
44.
45.
46.
/*开始用高斯简单迭代消元法进行求解计算*/
47.
48.
49.
/*使系数矩阵转化为上三角矩阵,常数矩阵相应进行变换*/
50.
51.
52.
temp=a[i][j]/a[j][j];
53.
b[i]=b[i]-temp*b[j];
54.
55.
a[i][k]=a[i][k]-temp*a[j][k];
56.
\n通过初等行变换增广矩阵矩阵C化为:
\n"
57.
/*输出进行初等行变换的过程*/
58.
C="
59.
for(p=1;
p<
p++)
60.
61.
for(q=1;
q<
q++)
62.
\t%.3f"
a[p][q]);
63.
printf("
\t%.3f\n"
b[p]);
64.
65.
66.
67.
68.
/*输出最终的增广矩阵C*/
69.
showarray(n);
70.
/*开始按顺序反代求解x[i](i=n,n-1,n-2,…,2,1)*/
71.
x[n]=b[n]/a[n][n];
72.
for(j=n-1;
j>
=1;
j--)
73.
74.
x[j]=b[j];
75.
for(k=n;
k>
=j+1;
k--)
76.
x[j]=x[j]-x[k]*a[j][k];
77.
x[j]=x[j]/a[j][j];
78.
79.
\n原方程组的唯一一组实数解为:
80.
81.
x[%d]=%.3f\n"
j,x[j]);
82.}
83./*定义矩阵输入函数getarray(n)并打印以作检查*/
84.doublegetarray(intn)
85.{
86.printf("
\n请输入该矩阵各行的实数(以空格隔开)\n"
87.for(i=1;
88.
89.printf("
\n第%d行:
\t"
i);
90.for(j=1;
91.
92.
scanf("
%lf"
a[i][j]);
93.
a[%d][%d]=%.3f"
i,j,a[i][j]);
94.
95.
96.
97.
\nA="
98.for(i=1;
99.
100.for(j=1;
101.printf("
a[i][j]);
102.printf("
103.
104.
105.
/*输入常数矩阵的各个数*/
106.
for(i=1;
++i)
107.
108.
请输入常数b[%d]="
109.
b[i]);
110.
111.}
112./*定义增广矩阵C输出函数showarray(n)*/
113.doubleshowarray(intn)
114.{
115.printf("
\n通过初等行变换最终增广矩阵矩阵C化为:
116.
117.
118.
119.
for(j=1;
120.
121.
b[i]);
122.
123.
124.
temp=1;
125.
126.
temp*=a[i][i];
127.
\n矩阵的行列式|A|=%f\n"
temp);
128.
/*判断原线性方程组是否有唯一解*/
129.
if(temp==0)
130.
131.
\n该方程组无唯一解,请重新启动程序输入\n"
132.
133.
134.}
复制代码
程序执行结果:
四、误差分析
由程序执行结果图可知,该C语言程序所求得的该N阶矩阵方程即N维线性方程组的解为
由于程序中所有变量除了增广矩阵的角标以外都定义为double型,而double型变量的精确度是16位,所以程序运行过程中变量的有效数字至多有15位,而为了程序执行时界面的清爽,将每个变量的有效数字只取了小数点后3位,就运行的具体程序来说,这小数点的后三维数字均为有效数字,所以本程序的误差至多为0.001即小数点后三位。
而在该具体的5维线性方程组中,用克拉默法则计算出系数行列式
|A|=665,其精确解为
所以各个解均在误差范围内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 求解 线性 矩阵 方程 Axb 简单 解法
