数值计算方法实验二.docx

上传人:b****5 文档编号:7249648 上传时间:2023-01-22 格式:DOCX 页数:11 大小:114.29KB
下载 相关 举报
数值计算方法实验二.docx_第1页
第1页 / 共11页
数值计算方法实验二.docx_第2页
第2页 / 共11页
数值计算方法实验二.docx_第3页
第3页 / 共11页
数值计算方法实验二.docx_第4页
第4页 / 共11页
数值计算方法实验二.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数值计算方法实验二.docx

《数值计算方法实验二.docx》由会员分享,可在线阅读,更多相关《数值计算方法实验二.docx(11页珍藏版)》请在冰豆网上搜索。

数值计算方法实验二.docx

数值计算方法实验二

本科实验报告

 

课程名称:

计算机数值方法B

实验项目:

线性方程组的直接解法

实验地点:

北区逸夫楼302

专业班级:

学号:

学生姓名:

指导教师:

2013年4月11日

 

一、实验目的和要求

(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。

(2)加深对线性方程组求解方法的认识,掌握算法。

(3)会进行误差分析,并能对不同方法进行比较。

二、实验内容和原理

合理利用Gauss消元法、LU分解法或追赶法求解下列方程组:

(n=5,10,100,…)

三、主要仪器设备

编译环境:

C-Free5.0硬件基础:

HP6460b

四、操作方法与实验步骤

高斯分解法:

将原方程组化为三角形方阵的方程组:

lik=aik/akk

aij=aij-lik*akjk=1,2,…,n-1

i=k+1,k+2,…,nj=k+1,k+2,…,n+1

由回代过程求得原方程组的解:

xn=ann+1/ann

xk=(akn+1-∑akjxj)/akk(k=n-1,n-2,…,2,1)

LU分解法:

将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.

追赶法:

用来求对角方程组;将系数矩阵A转化为A=L*U,L为普通下n-1对角矩阵,U为单位上n-1对角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.

五、实验数据记录和处理

Gauss消元法:

#include"stdio.h"

doublea[15][15],a0[15][15];

doubleb[15],b0[15],l[15];

intn;

voiddisplayA()

{

inti,j;

printf("\n");

for(j=1;j<=n;j++)

{

for(i=1;i<=n;i++)

printf("a[%d][%d]=%f",j,i,a[j][i]);

printf("b[%d]=%f\n",j,b[j]);

}

for(j=1;j<=n;j++)

printf("l[%d]=%f",j,l[j]);

printf("\n");

}

voidmain()

{

FILE*f;

inti,j,k;

f=fopen("Gaussdata.txt","r");

fscanf(f,"%d",&n);

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

fscanf(f,"%lf",&a[i][j]);

a0[i][j]=a[i][j];

}

fscanf(f,"%lf",&b[i]);

b0[i]=b[i];

}

displayA();

k=1;

do

{

for(i=1;i<=n;i++)

{

if(i==k)continue;

l[i]=a0[i][k]/a0[k][k];

}

for(j=k+1;j<=n;j++)a[k][j]=a0[k][j]/a0[k][k];

b[k]=b0[k]/a0[k][k];

for(i=1;i<=n;i++)

{

if(i==k)continue;

for(j=k+1;j<=n;j++)

a[i][j]=a0[i][j]-l[i]*a0[k][j];

b[i]=b0[i]-l[i]*b0[k];

}

displayA();

for(i=1;i<=n;i++)

{

for(j=k+1;j<=n;j++)

a0[i][j]=a[i][j];

b0[i]=b[i];

}

if(k==n)break;

k++;

}while(0);

for(i=1;i<=n;i++)

printf("b[%2d]=%lf\n",i,b[i]);

}

LU分解法:

#include

#include

#include

#defineN4

intmain(){

floatA[N][N],U[N][N],L[N][N],X[N],Y[N],B[N];

floats=0;

inti,j,k;

printf("你好!

欢迎你使用本系统!

");

printf("\n\n请输入将要分解的矩阵:

");

for(i=0;i

for(j=0;j

scanf("%f",&A[i][j]);

printf("\n以下输出待分解的矩阵,请确认无误。

");

for(i=0;i

{//输出带分解矩阵

for(j=0;j

printf("%f\t",A[i][j]);

putchar('\n');

}

for(i=0;i

for(j=0;j

{

L[i][j]=0;

U[i][j]=0;

if(i==j)

L[i][j]=1;

}

for(j=0;j

U[0][j]=A[0][j];

for(i=1;i

L[i][0]=A[i][0]/U[0][0];//求L矩阵的第一列

for(k=1;k

{

for(j=k;j

{

for(intu=0;u<=k-1;u++)

{

s=s+L[k][u]*U[u][j];

}

U[k][j]=A[k][j]-s;

s=0;//每行的和不一致,一行使用完后要置0

}

for(i=k+1;i

{

for(intl=0;l<=k-1;l++)

{

s=s+L[i][l]*U[l][k];

}

L[i][k]=(A[i][k]-s)/U[k][k];

s=0;//每列的和不一致,一行使用完后要置0

}

}

printf("\nL\n");

for(i=0;i

{//输出LU

for(j=0;j

printf("%f\t",L[i][j]);

putchar('\n');

}

printf("\nU\n");

for(i=0;i

{

for(j=0;j

printf("%f\t",U[i][j]);

putchar('\n');

}

for(i=0;i

scanf("%f",&B[i]);

Y[0]=B[0];//求Y

for(k=1;k

{

for(j=0;j

{s=s+L[k][j]*Y[j];}

Y[k]=B[k]-s;

s=0;

}

printf("\nY:

\n");//输出Y

for(i=0;i

printf("%f\t",Y[i]);

putchar('\n');

X[N-1]=Y[N-1]/U[N-1][N-1];//求X

for(k=N-2;k>=0;k--)

{

for(j=k+1;j

{s=s+U[k][j]*X[j];}

X[k]=(Y[k]-s)/U[k][k];

s=0;

}

printf("\nX:

\n");//输出X

for(i=0;i

printf("%f\t",X[i]);

putchar('\n');

system("pause");

return0;

}

追赶法:

#include

#include

#include

intmain(void)

{

floata[15],b[15],c[15],d[15];

floatt;

inti,n;

system("cls");

printf("数值计算方法:

追赶法求解方程组");

printf("\n\n------------------------------------WELCOME-------------------------------------");

printf("\n");

printf("请输入n=");

scanf("%d",&n);

printf("\n======================\n");

printf("请输入b[1],c[1],d[1]:

\n");

scanf("%f%f%f",&b[1],&c[1],&d[1]);

printf("\n======================\n");

printf("从输入从2到n-1:

\n");

for(i=2;i<=n-1;i++)

{

scanf("%f%f%f%f",&a[i],&b[i],&c[i],&d[i]);

}

printf("\n======================\n");

printf("请输入a[n],b[n],d[n]:

\n");

scanf("%f%f%f",&a[n],&b[n],&d[n]);

c[1]=c[1]/b[1];

d[1]=d[1]/b[1];

for(i=2;i<=n-1;i++)

{

t=b[i]-c[i-1]*a[i];

c[i]=c[i]/t;

d[i]=(d[i]-d[i-1]*a[i])/t;

}

d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]);

For(i=n-1;i>=1;i--)d[i]=d[i]-c[i]*d[i+1];

printf("\n======================\n");

for(i=1;i<=n;i++)

{

putchar('\n');

printf("%f",d[i]);

}

system("pause");

return0;

}

六、实验结果与分析

Gauss消元法:

 

LU分解法:

 

追赶法:

 

七、讨论、心得

(1)Gauss消元法的程序在编译过程中忽略了while

(1)的错误,导致在运行的过程中出现了死循环,以后要注意。

程序运行时出现无内容情况:

是编译器问题,此程序无错误。

 

(2)LU分解法在编译成功后运行时弹出对话框无法关闭。

(3)不同的方法在求解方程组时时间有较大的差异,应结合具体问题选择不同的方法。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1