C语言用矩阵求解方程组

C语言用矩阵求解方程组,第1张

//作品:多元一次方程组的计算
//作者:与你看日出
//日期:2009年4月25日 星期六
//说明:输出值只能是小数(最多六位),如x=1876546
//Han: 初始设的最多未知数的个数,运行程序后只能比它的个数小
//hang:计算中途中自己改变的未知数的个数
//JUZHEN:初始的示例矩阵
#include <stdioh>
#include <mathh>
#define Han 200//(可自设)多元一次方程组有n行n+1列(多的一列是等号右边的值),给出行数就能确定矩阵,
#define JUZHEN {1,1,1,1,5},{1,2,-1,4,-2},{2,-3,-1,-5,-2},{3,1,2,11,0}//示例一个
main()
{
int i,j,k,m,n,t,cf,hang=4;
float temp;
float AA[Han][Han+1]={JUZHEN};//定义所要计算的数组
do//判断是否重试
{
for(i=0;i<hang;i++)//输出所定义的数组
{
printf("\n");
for(j=0;j<hang+1;j++)
{
printf("%g\t",AA[i][j]);
}
}
printf("\n");
printf("是否自己输入?是:1;否:0");
scanf("%d",&t);
if(t==1)//判断是否自己输入数组
{

printf("输入未知数的个数");
scanf("%d",&hang);
for(i=0;i<hang;i++)//输入所定义的数组
{
for(j=0;j<hang+1;j++)
{
printf("第%d行第%d列的数为:",i+1,j+1);
scanf("%f",&AA[i][j]);
}
}
}
for(k=0;k<hang;k++)//这个大循环将数组的左下角转化为0
{

while(AA[k][k]==0)//如果第K行K列的那个数为0,则加和重组一行。
{
for(m=k+1;m<hang;m++)
for(n=k;n<hang+1;n++)
{
AA[k][n]+=AA[m][n];
}
}
for(i=k;i<hang;i++)//将第K列下面变为1
{
temp=AA[i][k];
for(j=k;j<hang+1;j++)//将每列变为1
{
AA[i][j]/=temp;
}
}
for(i=k+1;i<hang;i++)//将下面的数列与上面的数列相减使其下面为0
{
for(j=0;j<hang+1;j++)
{
AA[i][j]-=AA[k][j];
}
}
}
for(k=hang-2;k>=0;k--)//这个大循环将数组的右上角转化为0
{
for(i=k+1;i<hang+1-1;i++)//将第i列上面变为0
{
AA[k][hang+1-1]-=AA[k][i]AA[i][hang+1-1];
AA[k][i]=0;
}
}
for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
{
printf("\n");
for(j=0;j<hang+1;j++)
{
printf("%g\t",AA[i][j]);
}
}
printf("\n未知数的值为:\n");
for(i=0;i<hang;i++)//输出该矩阵(也就是多元一次方程组)的解
{
printf("x(%d)=\t%g\n",i+1,AA[i][hang+1-1]);
}
printf("\n");
printf("是否再试一次?是:1;否:0");
scanf("%d",&cf);
}
while(cf==1);//判断是否重试
}

矩阵方程是未知数为矩阵的方程,对于矩阵方程,当系数矩阵是方阵时,先判断是否可逆 。

第一种是无解,也就是说,方程之间出现有矛盾的情况。

第二种情况是解为零,这也是其次线性方程组唯一解的情况。

另外一种是齐次线性方程组系数矩阵线性相关,这种情况下有无数个解。

列方程解应用题步骤:

根据含有未知数数目不同、含有未知数幂数不同和含有未知数数目和幂数的不同来划分方程式的类型。

根据含有未知数数目不同,分为一元方程式、二元方程式和多元方程式。

根据含有未知数幂数不同,分为一元一次方程,一元二次方程,一元多次方程。

根据含有未知数数目和幂数的不同,分为二元一次方程,二元二次方程,二元多次方程,多元多次方程。

将线性方程组的增广矩阵通过行的初等变换化为行简化阶梯形矩阵 ,则以行简化阶梯形矩阵为增广矩阵的线性方程组与原方程组同解。当方程组有解时,将其中单位列向量对应的未知量取为非自由未知量,其余的未知量取为自由未知量,即可找出线性方程组的解。 扩展资料

好比解一元一次方程:ax=b 就要用a的逆运算1/a去乘方程两边就可以得到:x=b/a 这样就用乘法运算(b乘以a的逆1/a)得到方程的解了。 线性方程组实际上就是一元一次矩阵方程:Ax=b 所以解方程的数学思想是一样的:都是一元一次方程。 不同的只是:A是矩阵不是数,x是未知列向量不是一个未知量,b是已知列向量不是一个已知数 只要你算出A的逆A^-1(因为矩阵乘法不能交换,所以不可以写成1/A) 同样是乘以方程两边(不同的是只能左乘,不可右乘)就得到:x=(A^-1)b 这样就用矩阵乘法运算(逆矩阵A^-1乘以列矢量b)得到矩阵程的解了。

有两种方法,第一种方法是手算的方法(考试的时候用的),由原式子,可知X=BA^-1将B写上面,A写在下边,然后通过列变换把A变成单位矩阵E,变换时B也跟着进行列变换,当A变成E时,B的区域就是所求的X,这种方法要求学生必须掌握,考试时用的就是这个方法
方法二:借用计算软件的方法,在MATLAB里,定义A=(2
1
-1
;2
1
0;1
-1
1),B=(1-
1
3;4
3
2)
后,输入命令:X=B/A(这叫右除),其结果就是本题的答案具体命令及输出结果是:
A=[2
1
-1;2
1
0;1
-1
1]
B=[1
-1
3;4
3
2]
X=B/A
输出结果是:
X
=
-20000
20000
10000
-26667
50000
-06667
以上解答希望对你有用,如果有用,敬请采纳


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12659632.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存