实验三:解线性方程组的直接法(一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法(C语言版)实验报告
实验三:解线性方程组的直接法(一)
(第三章)
一、实验目的:
1.用程序验证消元法和三角分解法。
2.掌握直接求解线性方程组的常用算法:列主元高斯消元法、LU分解法等。
3.记录运行结果,回答问题,完成实验报告。
二、实验条件:
Microsoft Visual C++
C-Free
三、实验内容及运行结果:
(一)、用列主元高斯消元法求解线性方程组:
x+y-z=1
-x+y-z=1
-x-y-z=3
1.源程序:
#include
#include
#define MAXSIZE 50
void input(double a[MAXSIZE] [MAXSIZE+1],long n);
void output(double x[MAXSIZE],long n);
int main(int)
{
double a[MAXSIZE] [MAXSIZE+1],x[MAXSIZE],s,max,t;
long n,i,j,k,maxi;
printf("\n Please enter the original equations of order number:"); scanf("%ld",&n);
input(a,n);
for(k=0;k<=n-2;k++)
{
max=a[k][k];maxi=k;
for(i=k+1;i<=n-1;i++)
if(fabs(a[i][k])>fabs(max))
{max=a[i][k];maxi=i;}
if(max==0)
break;
if(maxi!=k)
for(j=k;j<=n;j++)
{
t=a[k][j];
a[k][j]=a[maxi][j];
a[maxi][j]=t;
}
for(i=k+1;i<=n-1;i++)
{
a[i][k]/=-a[k][k];
for(j=k+1;j<=n;j++)
a[i][j]+=a[i][k]*a[k][j];
}
}
if(max==0)
printf("\nThe original equations has no solution。");
else{
for(k=n-1;k>=0;k--)
{
s=0;
for(j=k+1;j<=n-1;j++)
s+=a[k][j]*x[j];
x[k]=(a[k][n]-s)/a[k][k];
}
output(x,n);
}
}
void input(double a[MAXSIZE][MAXSIZE+1],long n)
{
long i,j;
printf("\nPlease enter the original equations of the augmented matrix:\n"); for(i=1;i<=n;i++)
for(j=i;j<=n+1;j++)
scanf("%lf",&a[i-1][j-1]);
}
void output(double x[MAXSIZE],long n)
{ long k;
printf("\n Solution for the original equations:\n");
for(k=1;k<=n;k++)
printf("%lf",x[k-1]);
}
2.运行结果:
(二)、用LU分解法求解线性方程组:
x+y-z=1
-x+y-z=1
-x-y-z=3
1.源程序:
#include
#include
#define MAXSIZE 50
void input(double a[MAXSIZE][MAXSIZE],double x[MAXSIZE],long n);
void output(double x[MAXSIZE],long n);
int main(void)
{
double a[MAXSIZE][MAXSIZE],x[MAXSIZE],s;
long n,i,j,k;
printf("\n Please enter the order number of the original equations:"); scanf("%ld",&n);
input(a,x,n);
for(k=0;k<=n-2;k++)
{
for(i=k+1;i<=n-1;i++)
{
s=0;
for(j=0;j<=k-1;j++)
s+=a[i][j]*a[j][k];
a[i][k]=(a[i][k]-s)/a[k][k];
}
for(j=k+1;j<=n-1;j++)
{
s=0;
for(i=0;i<=k;i++)
s+=a[k+1][i]*a[i][j];
a[k+1][j]-=s;
}
}
for(i=1;i<=n-1;i++)
{
s=0;
for(j=0;j<=i-1;j++)
s+=a[i][j]*x[j];
x[i]-=s;
}
for(i=n-1;i>=0;i--)
{
s=0;
for(j=i+1;j<=n-1;j++)
s+=a[i][j]*x[j];
x[i]=(x[i]-s)/a[i][i];
}
output(x,n);
}
void input(double a[MAXSIZE][MAXSIZE],double x[MAXSIZE],long n)
{
long i,j;
printf("\n Please enter the augmented matrix of the original equations:\n"); for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
scanf("%lf",&a[i][j]);
scanf("%lf",&x[i]);
}
}
void output(double x[MAXSIZE],long n)
{
long i;
printf("\n Solution for the original equation:\n");
for(i=0;i<=n-1;i++)
printf(" %lf",x[i]);
}
2.运行结果: