设计一个C程序,解线性方程组
请设计一个程序,解线性方程组,如下:Ax=Ba(1,1)x1+a(1,2)x2+...+a(1,n)xn=b1a(2,1)x1+a(2,2)x2+...+a(2,n)xn...
请设计一个程序,解线性方程组,如下:
Ax=B
a(1,1)x1+a(1,2)x2+...+a(1,n)xn=b1
a(2,1)x1+a(2,2)x2+...+a(2,n)xn=b2
......
a(n,1)x1+a(n,2)x2+...+a(n,n)xn=bn
我已经有了一个程序,但它是从a(0,0)x0 b0到a(n-1,n-1)xn-1 bn-1的,
那位朋友帮我改成上面所要求的。谢谢! 展开
Ax=B
a(1,1)x1+a(1,2)x2+...+a(1,n)xn=b1
a(2,1)x1+a(2,2)x2+...+a(2,n)xn=b2
......
a(n,1)x1+a(n,2)x2+...+a(n,n)xn=bn
我已经有了一个程序,但它是从a(0,0)x0 b0到a(n-1,n-1)xn-1 bn-1的,
那位朋友帮我改成上面所要求的。谢谢! 展开
1个回答
展开全部
原来的程序为:(那位朋友帮我改一下)
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
#define MAX 255
int Guass(a,b,n)
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;
/*下面是换主元部分,即从系数矩阵A的第K行,第K列之下的部分选出
绝对值最大的元,交换到对角线上。*/
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{
t=fabs(a[i*n+j]); /*fabs()定义在math.h中,含义是求一个浮点数的绝对值。*/
if (t>d) { d=t; js[k]=j; is=i;}
}
if (d+1.0==1.0) l=0; /*主元为0*/
/*主元不为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;
/*下面为矩阵A,B消元部分*/
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("该矩阵为奇异矩阵\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);
}
main()
{
int i,n;
double A[MAX];
double B[MAX];
clrscr();
puts("This is a program to solve N order linear equation set Ax=B.");
puts("\n It use Guass Elimination Method to solve the equation set:");
puts("\n a(0,0)x0+a(0,1)x1+a(0,2)x2+...+a(0,n-1)xn-1=b0");
puts(" a(1,0)x0+a(1,1)x1+a(1,2)x2+...+a(1,n-1)xn-1=b1");
puts(" ......");
puts(" a(n-1,0)x0+a(n-1,1)x1+a(n-1,2)x2+...+a(n-1,-1)xn-1=bn-1\n");
printf(" >> Please input the order n (>1): ");
scanf("%d",&n);
printf(" >> Please input the %d elements of matrix A(%d*%d) one by one:\n",n*n,n,n);
for(i=0;i<n*n;i++)
scanf("%lf",&A[i]);
printf(" >> Please input the %d elements of matrix B(%d*1) one by one:\n",n,n);
for(i=0;i<n;i++)
scanf("%lf",&B[i]);
if (Guass(A,B,n)!=0) /*调用Guass消去,1为计算成功*/
printf(" >> The solution of Ax=B is x(%d*1):\n",n);
for (i=0;i<n;i++) /*打印结果*/
printf("x(%d)=%f ",i,B[i]);
puts("\n Press any key to quit...");
getch();
}
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
#define MAX 255
int Guass(a,b,n)
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;
/*下面是换主元部分,即从系数矩阵A的第K行,第K列之下的部分选出
绝对值最大的元,交换到对角线上。*/
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{
t=fabs(a[i*n+j]); /*fabs()定义在math.h中,含义是求一个浮点数的绝对值。*/
if (t>d) { d=t; js[k]=j; is=i;}
}
if (d+1.0==1.0) l=0; /*主元为0*/
/*主元不为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;
/*下面为矩阵A,B消元部分*/
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("该矩阵为奇异矩阵\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);
}
main()
{
int i,n;
double A[MAX];
double B[MAX];
clrscr();
puts("This is a program to solve N order linear equation set Ax=B.");
puts("\n It use Guass Elimination Method to solve the equation set:");
puts("\n a(0,0)x0+a(0,1)x1+a(0,2)x2+...+a(0,n-1)xn-1=b0");
puts(" a(1,0)x0+a(1,1)x1+a(1,2)x2+...+a(1,n-1)xn-1=b1");
puts(" ......");
puts(" a(n-1,0)x0+a(n-1,1)x1+a(n-1,2)x2+...+a(n-1,-1)xn-1=bn-1\n");
printf(" >> Please input the order n (>1): ");
scanf("%d",&n);
printf(" >> Please input the %d elements of matrix A(%d*%d) one by one:\n",n*n,n,n);
for(i=0;i<n*n;i++)
scanf("%lf",&A[i]);
printf(" >> Please input the %d elements of matrix B(%d*1) one by one:\n",n,n);
for(i=0;i<n;i++)
scanf("%lf",&B[i]);
if (Guass(A,B,n)!=0) /*调用Guass消去,1为计算成功*/
printf(" >> The solution of Ax=B is x(%d*1):\n",n);
for (i=0;i<n;i++) /*打印结果*/
printf("x(%d)=%f ",i,B[i]);
puts("\n Press any key to quit...");
getch();
}
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询