数值方法实验报告

  • 格式:doc
  • 大小:295.50 KB
  • 文档页数:14

如有你有帮助,请购买下载,谢谢!

1页 2009-2010学年 第一学期

《数值方法》实验报告

学 院: 石油工程学院

专业班级:

指导教师: 李梦霞

学生姓名:

实验一

1.题目 高斯列主元素消去法:

用Gauss列主元消去法解线性方程组Axb,其中,

A=17.031 -0.615 -2.991 1.007 -1.006 0.000-1.000 34.211 -1.000 -2.100 0.300 -1.7000.000 0.500 13.000 -0.500 1.000 -1.5004.501 3.110 -3.907 -61.705 12.170 8.9990.101 -8.012 -0.017 -0.910 4.918 0.1001.000 2.000 3.000 4.500 5.000 21.803 0.230

-52.322

54.000 240.236

29.304

-117.818b

2.理论分析及算法描述

(1)理论分析:

由高斯消去法,当a)(kkk=0时,消去过程则中断。此外,即使a)(kkk≠0,但当绝对值较小时,也会因用它作除数而出现舍入误差急剧增长的系数,从而导致计算结果不准确。

列主元高斯消去法只需在高斯消去法消去过程的第k步消去计算前,插入搜索绝对值最大元和交换过程(交换增广矩阵的行)的处理。

(2)Guass 列主元消去法算法描述:

Step1:k=1;

Step2:按列选主元|aikk|=|aik|,rikrk; 如有你有帮助,请购买下载,谢谢!

2页 Step3:if|aikk|=0,停止计算;

Step4:ik=K,则不换行。Else,交换ik行与K行,aikjakj(j=k,...N),

bikbk;

Step5:计算乘数

akkikalik(i=k+1,...n);

Step6:消元计算

aij=aij-lik*akj

bi=bi-lik*bk(i,j=k+1,...n);

Step7:k=k+1,If k<=n-1转Step2;

Step8:回代求解

axakkkikjkkn1*bb(k=n,n-1,...1)。

3.源程序

#include

#include

#define N 6

main()

{

int i,j,k;

float p,m;

float a[N][N],b[N],l[N];

FILE *fp1=fopen("d:\\date1.txt","rw");

FILE *fp2=fopen("d:\\date2.txt","rw");

for(i=0;i

{

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

printf("%8.3f\n",b[i]);

}

fclose(fp2);

for(i=0;i

{

for(j=0;j

{

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

printf("%8.3f ",a[i][j]); 如有你有帮助,请购买下载,谢谢!

3页 }

printf("\n");

}

fclose(fp1);

for(j=0;j

{

for(i=j+1;i

{

if(abs(a[i][j])>abs(a[j][j]))

{

for(k=0;k

{

p=a[i][k];

m=b[i];

a[i][k]=a[j][k];

b[i]=b[j];

a[j][k]=p;

b[j]=m;

}

}

}

if(a[j][j]==0)

{

printf("can not do it");

break;

}

}

for(j=0;j

{

for(i=j+1;i

{

l[i]=a[i][j]/a[j][j];

for(k=j+1;k

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

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

}

}

}

b[N-1]=b[N-1]/a[N-1][N-1];

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

{

m=0.000;

for(k=i;k

{

m=m+a[i][k]*b[k]; 如有你有帮助,请购买下载,谢谢!

4页 }

b[i]=(b[i]-m)/a[i][i];

}

for(i=0;i

{ printf("X%d解为:",i+1);

printf("%8.3f\n",b[i]);

}

}

4.运行结果 如有你有帮助,请购买下载,谢谢!

5页 实验二

1.题目 用Cholesky分解,解下列方程组Axb,其中:

2.理论分析及算法描述

(1)理论分析:

在工程计算中,常遇到所求解的线性方程组的系数矩阵具有对称正定性,矩阵的这一特性使它的三角分解具有更简单的形式。

设矩阵A为对称正定矩阵,即A的各阶顺序主子式均大于零,则由定理可知存在一个单位下三角矩阵L和一个上三角矩阵U使得 A=LU 成立。

定理2.3 如果A为对称正定矩阵,则存在唯一的对角线元素全为正数的下三角形矩阵L,使得 A=LL 成立。

当矩阵A完成Cholesky分解后,求解方程组Ax=b就转化为求解方程组

Ly=b , LTx=y 。

(2)算法描述:

Step1:ltatjkjkikijij11

Step2:dtljijij

Step3:ltadikikikiii11

3.源程序

Chosy分解

#include

#include

#define N 8

main()

{ int i,j,k;

float m;

float a[N][N],b[N];

FILE *fp1=fopen("d:\\date3.txt","rw");

FILE *fp2=fopen("d:\\date4.txt","rw"); 如有你有帮助,请购买下载,谢谢!

6页 for(i=0;i

{

for(j=0;j

{

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

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

}

printf("\n");

}

fclose(fp1);

for(i=0;i

{

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

printf("%4.1f\n",b[i]);

}

fclose(fp2);

a[0][0]=(float)sqrt(a[0][0]);

for(i=1;i

{ for(j=0;j

{ m=0.0;

for(k=0;k

m=a[i][k]*a[j][k];

a[i][j]=(a[i][j]-m)/a[j][j];

}

m=0.0;

for(k=0;k

m=a[i][k]*a[i][k];

a[i][i]=(float)sqrt(a[i][i]-m);

}

b[0]=b[0]/a[0][0];

for(i=1;i

{ m=0.0;

for(k=0;k

m=a[i][k]*b[k];

b[i]=(b[i]-m)/a[i][i];

}

b[N-1]=b[N-1]/a[N-1][N-1];

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

{ m=0.0;

for(k=i+1;k

m=a[i][k]*b[k];

b[i]=(b[i]-m)/a[i][i];

}

for(i=0;i

printf("x%d解为: %4.1f\n",i,b[i]); 如有你有帮助,请购买下载,谢谢!

7页 }

3.运行结果 如有你有帮助,请购买下载,谢谢!

8页 实验三

1.题目 用SOR迭代法解方程组AxB,其中

4100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014A,7513261214455B

选择松弛因子w=0.8;0.9;1;1.1;1.2,试看对算法收敛性的影响,并找出所选用的松弛因子的最佳者.取410.

2.理论分析及算法描述

(1)理论分析:

松弛法是一种线性加速方法。下面介绍的松弛法是Gauss-Seidel方法的一种修正形式,其基本思想是将前一步的结果xk)(与Gauss-Seidel方法的迭代值xk)1(适当进行线性组合,以构成一个收敛速度较快的近似解序列。这种方法称为逐次超松弛迭代法,简称SOR方法。

(2)算法描述:

Step1:k=0;xi=0(i=1,2....n);

Step2:k=k+1;

Step3:q=0

Step4:i=1,2....n

(1) )()()1(11xaxabaxkjnijijkjijijiiiiw

P=xi

(2)if |P|>|q| 则q=P

(3)xi=xi+P