实验三:解线性方程组的直接法(一)

  • 格式:docx
  • 大小:123.70 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.运行结果: