用c语言编程求线性方程组的解
例如A={11}B={1}求AX=B的x的解122在线等答的对有加分。加分不低于30分哦...
例如 A={1 1}B={1} 求 AX=B的 x的解
1 2 2
在线等
答的对有加分。加分不低于30分哦 展开
1 2 2
在线等
答的对有加分。加分不低于30分哦 展开
4个回答
展开全部
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
int rgauss(n,a,b)
int n;
double a[],b[];
{ int *js,l,k,i,j,is,p,q;
double d,t;
js=malloc(n*sizeof(int));
l=1;
for (k=0;k<=n-2;k++)
{ d=0.0;
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{ t=fabs(a[i*n+j]);
if (t>d) { d=t; js[k]=j; is=i;}
}
if (d+1.0==1.0) l=0;
else
{ if (js[k]!=k)
for (i=0;i<=n-1;i++)
{ p=i*n+k; q=i*n+js[k];
t=a[p]; a[p]=a[q]; a[q]=t;
}
if (is!=k)
{ for (j=k;j<=n-1;j++)
{ p=k*n+j; q=is*n+j;
t=a[p]; a[p]=a[q]; a[q]=t;
}
t=b[k]; b[k]=b[is]; b[is]=t;
}
}
if (l==0)
{ free(js); printf("fail\n");
return(0);
}
d=a[k*n+k];
for (j=k+1;j<=n-1;j++)
{ p=k*n+j; a[p]=a[p]/d;}
b[k]=b[k]/d;
for (i=k+1;i<=n-1;i++)
{ for (j=k+1;j<=n-1;j++)
{ p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if (fabs(d)+1.0==1.0)
{ free(js); printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for (i=n-2;i>=0;i--)
{ t=0.0;
for (j=i+1;j<=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for (k=n-1;k>=0;k--)
if (js[k]!=k)
{ t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}
free(js);
return(1);
}
徐世良老师的.原地工作全选主元的高斯消元.用的符号有点诡异,而且将矩阵以线性表输入庆巧哗的.
我也写过一个,不过估宽轮计你不太喜欢用我的,这个誉行用来解b也是矩阵的.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void swap(double *a,double *b){
double temp;
temp=*a;
*a=*b;
*b=temp;
}
void printMatrix(int n,int m,double **a){
int i,j;
for (i=0;i<n;i++){
for (j=0;j<m;j++) printf("%e\t",a[i][j]);
printf("\n");
}
}
int rgauss(int n,int m,double **a,double **b){//,double *det){
int *colex,rowex,s,i,j,k;
double d,t;
// *det=1;
s=0;
colex=malloc(n*sizeof(int));
for (k=0;k<n;k++){
d=0.0;
for (i=k;i<n;i++){
for (j=k;j<n;j++){
t=fabs(a[i][j]);
if (t>d){
d=t;
colex[k]=j;
rowex=i;
}
}
}
if (d+1.0==1.0){
free(colex);
printf("Singular Matrix!\n");
return 0;
}
else{
if (colex[k]!=k){
for (i=0;i<n;i++)
swap(a[i]+colex[k],a[i]+k);
s=s+colex[k]-k;
}
if (rowex!=k){
for (j=0;j<n;j++)
swap(a[rowex]+j,a[k]+j);
for (j=0;j<m;j++)
swap(b[rowex]+j,b[k]+j);
s=s+rowex-k;
}
}
d=a[k][k];
// *det=*det*d;
for (j=k+1;j<n;j++) a[k][j]/=d;
for (j=0;j<m;j++) b[k][j]/=d;
for (i=k+1;i<n;i++){
for (j=k+1;j<n;j++)
a[i][j]-=a[i][k]*a[k][j];
for (j=0;j<m;j++)
b[i][j]-=a[i][k]*b[k][j];
}
}
for (i=n-2;i>-1;i--)
for (j=i+1;j<n;j++)
for (k=0;k<m;k++)
b[i][k]-=a[i][j]*b[j][k];
colex[n-1]=n-1;
for (i=n-1;i>-1;i--)
if (colex[i]!=i)
for (j=0;j<m;j++) swap(b[colex[i]]+j,b[i]+j);
// if (s&1) *det=-*det;
return 1;
}
void main(){
#define N 2
#define M 1
double input_a[]={1,1,1,2};
double input_b[]={1,2};
double *a[N],*b[N];
int i;
for (i=0;i<N;i++){
a[i]=input_a+N*i;
b[i]=input_b+M*i;
}
rgauss(N,M,a,b);
printf("方程解为:\n");
printMatrix(N,M,b);
printf("\n");
}
#include "math.h"
#include "stdio.h"
int rgauss(n,a,b)
int n;
double a[],b[];
{ int *js,l,k,i,j,is,p,q;
double d,t;
js=malloc(n*sizeof(int));
l=1;
for (k=0;k<=n-2;k++)
{ d=0.0;
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{ t=fabs(a[i*n+j]);
if (t>d) { d=t; js[k]=j; is=i;}
}
if (d+1.0==1.0) l=0;
else
{ if (js[k]!=k)
for (i=0;i<=n-1;i++)
{ p=i*n+k; q=i*n+js[k];
t=a[p]; a[p]=a[q]; a[q]=t;
}
if (is!=k)
{ for (j=k;j<=n-1;j++)
{ p=k*n+j; q=is*n+j;
t=a[p]; a[p]=a[q]; a[q]=t;
}
t=b[k]; b[k]=b[is]; b[is]=t;
}
}
if (l==0)
{ free(js); printf("fail\n");
return(0);
}
d=a[k*n+k];
for (j=k+1;j<=n-1;j++)
{ p=k*n+j; a[p]=a[p]/d;}
b[k]=b[k]/d;
for (i=k+1;i<=n-1;i++)
{ for (j=k+1;j<=n-1;j++)
{ p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if (fabs(d)+1.0==1.0)
{ free(js); printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for (i=n-2;i>=0;i--)
{ t=0.0;
for (j=i+1;j<=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for (k=n-1;k>=0;k--)
if (js[k]!=k)
{ t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}
free(js);
return(1);
}
徐世良老师的.原地工作全选主元的高斯消元.用的符号有点诡异,而且将矩阵以线性表输入庆巧哗的.
我也写过一个,不过估宽轮计你不太喜欢用我的,这个誉行用来解b也是矩阵的.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void swap(double *a,double *b){
double temp;
temp=*a;
*a=*b;
*b=temp;
}
void printMatrix(int n,int m,double **a){
int i,j;
for (i=0;i<n;i++){
for (j=0;j<m;j++) printf("%e\t",a[i][j]);
printf("\n");
}
}
int rgauss(int n,int m,double **a,double **b){//,double *det){
int *colex,rowex,s,i,j,k;
double d,t;
// *det=1;
s=0;
colex=malloc(n*sizeof(int));
for (k=0;k<n;k++){
d=0.0;
for (i=k;i<n;i++){
for (j=k;j<n;j++){
t=fabs(a[i][j]);
if (t>d){
d=t;
colex[k]=j;
rowex=i;
}
}
}
if (d+1.0==1.0){
free(colex);
printf("Singular Matrix!\n");
return 0;
}
else{
if (colex[k]!=k){
for (i=0;i<n;i++)
swap(a[i]+colex[k],a[i]+k);
s=s+colex[k]-k;
}
if (rowex!=k){
for (j=0;j<n;j++)
swap(a[rowex]+j,a[k]+j);
for (j=0;j<m;j++)
swap(b[rowex]+j,b[k]+j);
s=s+rowex-k;
}
}
d=a[k][k];
// *det=*det*d;
for (j=k+1;j<n;j++) a[k][j]/=d;
for (j=0;j<m;j++) b[k][j]/=d;
for (i=k+1;i<n;i++){
for (j=k+1;j<n;j++)
a[i][j]-=a[i][k]*a[k][j];
for (j=0;j<m;j++)
b[i][j]-=a[i][k]*b[k][j];
}
}
for (i=n-2;i>-1;i--)
for (j=i+1;j<n;j++)
for (k=0;k<m;k++)
b[i][k]-=a[i][j]*b[j][k];
colex[n-1]=n-1;
for (i=n-1;i>-1;i--)
if (colex[i]!=i)
for (j=0;j<m;j++) swap(b[colex[i]]+j,b[i]+j);
// if (s&1) *det=-*det;
return 1;
}
void main(){
#define N 2
#define M 1
double input_a[]={1,1,1,2};
double input_b[]={1,2};
double *a[N],*b[N];
int i;
for (i=0;i<N;i++){
a[i]=input_a+N*i;
b[i]=input_b+M*i;
}
rgauss(N,M,a,b);
printf("方程解为:\n");
printMatrix(N,M,b);
printf("\n");
}
展开全部
给,下面的代码已经编译运行确认,肯定好用了,试试吧:)
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define
number
20
#define
esc
0x1b
#define
enter
0x0d
float
a[number][number+1]
,ark;
int
flag,n;
void
exchange(int
r,int
k);
float
max(int
k);
void
message();
int
main()
{
float
x[number];
/*此数组用于存放方程解*/
int
k,i,j;
char
celect;
system("cls");
printf("\n用gauss列主元消元法解线性方程组");
printf("竖中陵\n1.解方程组请按enter.");
printf("\n2.退出程式请按esc.");
celect=getch();
if(celect==esc)
exit(0);
printf("\n
输入方程组的维数:n=");
scanf("%d",&n);
printf("\n现在输入系数矩阵a和向量b:");
for(i=1;i<=n;i++)
{
printf("\n请输入a%d1--a%d%d系数和余戚向量b%d:
\n",i,i,n,i);
/*实现将每培中一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
for(j=1;j<=n+1;j++)
/*将刚才输入的数存入数组*/
scanf("%f",&a[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0)
/*判断方程是否为线性方程,即是否合法*/
{
printf("\n此方程组不合法!");message();
}
else
if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
a[i][j]=a[i][j]-a[k][j]*a[i][k]/a[k][k];
}
x[n]=a[n][n+1]/a[n][n];
for(
k=n-1;k>=1;k--)
{
float
me=0;
for(j=k+1;j<=n;j++)
{
me=me+a[k][j]*x[j];
}
x[k]=(a[k][n+1]-me)/a[k][k];
}
for(i=1;i<=n;i++)
{
printf("\nx%d=%f",i,x[i]);
}
message();
getch();
return
1;
}
void
exchange(int
r,int
k)
/*交换行的矩函数*/
{
int
i;
for(i=1;i<=n+1;i++)
a[0][i]=a[r][i];
for(i=1;i<=n+1;i++)
a[r][i]=a[k][i];
for(i=1;i<=n+1;i++)
a[k][i]=a[0][i];
}
float
max(int
k)
/*比校系数大小的函数*/
{
int
i;
float
temp=0;
for(i=k;i<=n;i++)
if(fabs(a[i][k])>temp)
{
temp=fabs(a[i][k]);
flag=i;
}
return
temp;
}
void
message()
/*实现菜单选择的函数*/
{
printf("\n
继续运算按
enter
,退出程式按
esc!");
switch(getch())
{
case
enter:
main();
case
esc:
exit(0);
default:{printf("\n不合法的输入!");message();}
}
}
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define
number
20
#define
esc
0x1b
#define
enter
0x0d
float
a[number][number+1]
,ark;
int
flag,n;
void
exchange(int
r,int
k);
float
max(int
k);
void
message();
int
main()
{
float
x[number];
/*此数组用于存放方程解*/
int
k,i,j;
char
celect;
system("cls");
printf("\n用gauss列主元消元法解线性方程组");
printf("竖中陵\n1.解方程组请按enter.");
printf("\n2.退出程式请按esc.");
celect=getch();
if(celect==esc)
exit(0);
printf("\n
输入方程组的维数:n=");
scanf("%d",&n);
printf("\n现在输入系数矩阵a和向量b:");
for(i=1;i<=n;i++)
{
printf("\n请输入a%d1--a%d%d系数和余戚向量b%d:
\n",i,i,n,i);
/*实现将每培中一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
for(j=1;j<=n+1;j++)
/*将刚才输入的数存入数组*/
scanf("%f",&a[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0)
/*判断方程是否为线性方程,即是否合法*/
{
printf("\n此方程组不合法!");message();
}
else
if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
a[i][j]=a[i][j]-a[k][j]*a[i][k]/a[k][k];
}
x[n]=a[n][n+1]/a[n][n];
for(
k=n-1;k>=1;k--)
{
float
me=0;
for(j=k+1;j<=n;j++)
{
me=me+a[k][j]*x[j];
}
x[k]=(a[k][n+1]-me)/a[k][k];
}
for(i=1;i<=n;i++)
{
printf("\nx%d=%f",i,x[i]);
}
message();
getch();
return
1;
}
void
exchange(int
r,int
k)
/*交换行的矩函数*/
{
int
i;
for(i=1;i<=n+1;i++)
a[0][i]=a[r][i];
for(i=1;i<=n+1;i++)
a[r][i]=a[k][i];
for(i=1;i<=n+1;i++)
a[k][i]=a[0][i];
}
float
max(int
k)
/*比校系数大小的函数*/
{
int
i;
float
temp=0;
for(i=k;i<=n;i++)
if(fabs(a[i][k])>temp)
{
temp=fabs(a[i][k]);
flag=i;
}
return
temp;
}
void
message()
/*实现菜单选择的函数*/
{
printf("\n
继续运算按
enter
,退出程式按
esc!");
switch(getch())
{
case
enter:
main();
case
esc:
exit(0);
default:{printf("\n不合法的输入!");message();}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以用列主元素高斯消去法做。
你去搜一下吧,算法不麻烦,但是我也懒的写了。。
你去搜一下吧,算法不麻烦,但是我也懒的写了。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对于我这种不懂的人来说 这个 很难~~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询