数值计算方法实验报告含所有.docx

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

数值计算方法实验报告含所有.docx

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

数值计算方法实验报告含所有.docx

数值计算方法实验报告含所有

 

本科实验报告

 

课程名称:

计算机数值方法

实验项目:

计算机数值方法实验

实验地点:

虎峪校区致远楼B401

专业班级:

软件学院1217班学号:

******xxxx

学生姓名:

xxx

指导教师:

xxx

2014年5月21日

太原理工大学学生实验报告

学院名称

软件学院

专业班级

1217班

学号

201200xxxx

学生姓名

xx

实验日期

2014.05.21

成绩

课程名称

数值计算方法

实验题目

实验一方程求解

一、实验目的和要求

熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。

选择上述方法中的两种方法求方程:

二分法f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<0.5×10-5

二、主要设备

笔记本HPProBook6470b一台

编译软件:

VC++6.0

三、实验内容和原理

函数f(x)在区间(x,y)上连续,先在区间(x,y)确定a与b,若f(a),f(b)异号,说明在区间(a,b)内存在零点,然后求f[(a+b)/2]。

  假设F(a)<0,F(b)>0,a

1如果f[(a+b)/2]=0,该点即为零点;

2如果f[(a+b)/2]<0,则区间((a+b)/2,b)内存在零点,(a+b)/2≥a;  

3如果f[(a+b)/2]>0,则区间(a,(a+b)/2)内存在零点,(a+b)/2≤b;

返回①重新循环,不断接近零点。

通过每次把f(x)的零点所在区间收缩一半的方法,使区间内的两个端点逐步逼近函数零点,最终求得零点近似值。

 

四、操作方法与实验步骤

1.二分法:

#include

#include

#include

intmain()

{

doublea=1.0,b=2.0;

doublex,s;

printf("An\t\tBn\t\tF(Xn)\n");

while

(1)

{

x=(a+b)/2;

s=pow(x,3)+4*x*x-10;

if(-0.000005

{

break;

}

elseif(s<0)

{

a=x;

}

elseif(s>0)

{

b=x;

}

printf("%f\t%f\t%f\n",a,b,s);

}

printf("X的值为:

%f\n",x);

printf("误差:

\t%f\n",s);

return0;

}

2.割线法:

#include"stdio.h"

#include"math.h"

intmain()

{

floatc,a=1.0,b=2.0;

printf("每次得到的X的近似值:

\n");

while

(1)

{

c=b-(b*b*b+4*b*b-10)*(b-a)/(b*b*b+4*b*b-(a*a*a+4*a*a));

if(fabs(b-c)<0.5*0.00001)break;

b=c;

printf("%f\n",b);

}

printf("X的值为:

%f\n",c);

}

 

五、实验结果与分析

二分法割线法

分析:

由程序知,使用二分法和割线法均能计算出方程的根,但利用割线法要比二分法计算的次数少,并且能够较早的达到精度要求。

相比之下,割线法程序代码量较少,精简明了。

六、讨论、心得

本次数值计算方法程序设计实验从习题练习中跳脱出来,直接面对实用性较强的程序代码编写。

效果很好,不仅加深对二分法、割线法的理解,还加强了实际用运能力。

将理论知识成功地转化成实践结果。

 

实验地点

虎峪校区致远楼B401

指导教师

xx

太原理工大学学生实验报告

学院名称

软件学院

专业班级

1217班

学号

201200xxxx

学生姓名

xx

实验日期

2014.05.28

成绩

课程名称

数值计算方法

实验题目

实验二线性方程组的直接解法

一、实验目的和要求

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

1

2

3

1

2

3

4

(n=5,10,100,…)

二、主要设备

笔记本HPProBook6470b一台

编译软件:

VC++6.0

三、实验内容和原理

高斯消元法:

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

lik=aik/akk

aij=aij-lik*akj

(k=1,2,…,n-1i=k+1,k+2,…,nj=k+1,k+2,…,n+1)

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

xn=ann+1/ann

xk=(akn+1-∑akjxj)/akk

LU分解法:

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

四、操作方法与实验步骤

1.完全主元素消元法:

#include

#include

#include"math.h"

floata[100][101];

floatx[10];

intN;

voidshuchu()

{

for(inti=1;i<=N;i++)

{

for(intj=1;j<=N+1;j++)

{

cout<

}

cout<

}

}

voidshuru()

{

cout<<"请输入矩阵阶数:

"<

cin>>N;

cout<<"请输入矩阵各项:

"<

for(inti=1;i<=N;i++)

for(intj=1;j<=N+1;j++)

{

cin>>a[i][j];

}

cout<

}

voidmain()

{

intz[10];

intmaxi,maxj;

shuru();

for(inti=1;i<=N;i++)

z[i]=i;

for(intk=1;k

{

maxi=k;maxj=k;floatmaxv=abs(a[k][k]);

for(i=k;i<=N;i++)

for(intj=k;j<=N;j++)

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

{

maxv=abs(a[i][j]);maxi=i;maxj=j;

}

if(maxi!

=k)

{

for(intj=1;j<=N+1;j++)

{

floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;

}

}

if(maxj!

=k)

{

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

{

floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;

}

intt=z[k];z[k]=z[maxj];z[maxj]=t;

}

for(inti=k+1;i<=N;i++)

{

floatl=a[i][k]/a[k][k];

for(intj=k;j<=N+1;j++)

{

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

}

}

}

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

{

floats=0;

for(intj=i+1;j<=N;j++)

{

s+=a[i][j]*x[z[j]];

}

x[z[i]]=(a[i][N+1]-s)/a[i][i];

}

cout<<"完全主元素消去法之后的矩阵为:

"<

shuchu();

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

cout<<"x["<

}

2.列主元素消元法:

#include"stdio.h"

intmain()

{

floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};

floatx[3];

floatsum=0;

intk,i,j;

for(k=0;k<2;k++)

for(i=k+1;i<3;i++)

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

a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

{

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

}

printf("\n");

}

x[2]=a[2][3]/a[2][2];

for(k=1;k>=0;k--)

{

sum=0;

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

{

sum+=a[k][j]*x[j];

}

x[k]=(a[k][3]-sum)/a[k][k];

}

for(i=0;i<3;i++)

{

printf("x[%d]=%f\n",i+1,x[i]);

}

printf("\n");

}

3.LU分解法:

#include

#include

#defineL30

doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];

intmain()

{

intn,i,j,k,r;

printf("请输入矩阵元次:

\n");

scanf("%d",&n);

printf("请输入矩阵各项:

\n");

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

{

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

{

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

}

}

printf("请输入方程组的常数项:

\n");

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

{

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

}

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

{

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

{

l[i][j]=0;

u[i][j]=0.0;

}

}

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

{

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

{

u[k][j]=a[k][j];

for(r=1;r

{

u[k][j]-=l[k][r]*u[r][j];

}

}

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

{

l[i][k]=a[i][k];

for(r=1;r

{

l[i][k]-=l[i][r]*u[r][k];

}

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

}

l[k][k]=1.0;

}

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

{

y[i]=b[i];

for(j=1;j

{

y[i]-=l[i][j]*y[j];

}

}

for(i=n;i>0;--i)

{

x[i]=y[i];

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

{

x[i]-=u[i][j]*x[j];

}

x[i]/=u[i][i];

}

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

{

printf("%0.2lf\n",x[i]);

}

return0;

}

五、实验结果与分析

完全主元素消元法:

列主元素消元法:

LU分解法:

分析:

对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素。

即,为了节约内存及时效,可以不必计算出主元素下方数据。

列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。

列主元素消元法的耗时比完全主元素法少很多,常采用之。

对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。

其中的L为n阶单位下三角阵、U为上三角阵.

六、讨论、心得

本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间。

纠正各种语法、算法、思路错误。

最后勉强成功,但还是有几处警告,不得解决之法。

感到程序学习的不足,再加之对高斯的不甚了解。

编写过程很是痛苦。

查阅各种内外部资料,这点有利有弊。

突然觉得,应该再把数据结构之类的重新学习一下才行。

以后多花时间在编程吧,重在理解。

必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。

实验地点

虎峪校区致远楼B401

指导教师

xx

太原理工大学学生实验报告

学院名称

软件学院

专业班级

1217班

学号

201200xxxx

学生姓名

xx

实验日期

2014.06.04

成绩

课程名称

数值计算方法

实验题目

实验三线性方程组的迭代解法

一、实验目的和要求

使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。

二、主要设备

笔记本HPProBook6470b一台

编译软件:

VC++6.0

三、实验内容和原理

设线性方程组Ax=b

的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令

D=diag(a11,a22,…,ann)

并将A分解成A=(A-D)+D

从而线性方程组可写成Dx=(D-A)x+b

则有迭代公式

x(k+1)=B1x(k)+f1

其中,B1=I-D-1A,f1=D-1b。

 

四、操作方法与实验步骤

高斯—赛德尔迭代法

#include"iostream"

#include"iomanip"

usingnamespacestd;

intmain()

{

inti,j,k=0,m,n;

doublet1,t2,e1,e2=0.0;

cout<<"请输入精度e:

";

cin>>e1;

cout<<"请输入系数矩阵行数:

";

cin>>m;

cout<<"请输入系数矩阵列数:

";

cin>>n;

cout<

double(**a)=newdouble*[m];

for(i=0;i<=m;i++)

{

a[i]=newdouble[n];

}

double(*b)=newdouble[m];

double(*x)=newdouble[n];

cout<<"请输入系数矩阵:

"<

cout<<"-------------------------------------------------------------"<

for(intnum1=0;num1

{

for(intnum2=0;num2

{

cin>>a[num1][num2];

}

cout<

}

cout<<"输入的系数矩阵为:

"<

for(intnum3=0;num3

{

for(intnum4=0;num4

{

cout<

}

cout<

}

cout<<"请输入矩阵b:

"<

for(intnum5=0;num5

{

cin>>b[num5];

}

cout<<"输入的矩阵b为:

"<

for(intnum6=0;num6

{

cout<

}

cout<

for(intnum7=0;num7

{

x[num7]=0.0000;

}

do

{

cout<<"第"<

";

e2=0.0;

for(i=0;i

{

doublesum=0.0;

for(j=0;j

{

if(j!

=i)

sum+=a[i][j]*x[j];

}

t1=x[i];

t2=e2;

x[i]=(b[i]-sum)/a[i][i];

e2=(x[i])-t1>=0?

(x[i])-t1:

t1-(x[i]);

e2=(e2>=t2?

e2:

t2);

cout<

}

cout<

k++;

}while(e2>=e1&&k<30);

cout<<"共迭代了"<

delete[]a;

delete[]b;

delete[]x;

return0;

}

 

雅克比迭代法:

 

#include

#include

intmain()

{

floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2};

floatx[3]={0,0,0},sum;

inti,j,k,n=3;

printf("\t\tX[1]\t\tX[2]\t\tX[3]\n");

for(k=0;k<8;k++)

{

for(i=0;i<3;i++)

{

sum=0;

for(j=0;j

{

if(i==j)continue;

sum=sum+a[i][j]*x[j];

}

x[i]=(b[i]-sum)/a[i][i];

}

printf("第%d次迭代:

\t",k+1);

for(i=0;i

{

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

}

printf("\n");

}

}

 

五、实验结果与分析

高斯赛德尔迭代法:

 

雅克比迭代:

 

分析:

使用高斯-赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。

从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。

时效性上后者要好些。

六、讨论、心得

这次试验算是比较成功,要归功于授课时候的认真听讲。

程序编写之前,对书本的理论知识进行了进一步的探索。

预习准备工作很彻底,自然随后的一切也都很顺利。

实验地点

虎峪校区致远楼B401

指导教师

xx

太原理工大学学生实验报告

学院名称

软件学院

专业班级

1217班

学号

201200xxxx

学生姓名

xx

实验日期

2014.06.11

成绩

课程名称

数值计算方法

实验题目

实验四代数插值和最小二乘法拟合

一、实验目的和要求

(1)使用拉格朗日插值法或牛顿插值法求解:

已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。

X

0.40

0.55

0.65

0.80

0.90

1.05

f(x)

0.41075

0.57815

0.69675

0.88811

1.02652

1.25386

(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。

xi

0

0.5

0.6

0.7

0.8

0.9

1.0

yi

1

1.75

1.96

2.19

2.44

2.71

3.00

 

二、主要设备

笔记本HPProBook6470b一台

编译软件:

VC++6.0

三、实验内容和原理

(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件

Pn(xj)=yj,j=0,1,…,n

Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)

其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,

则Ln(x)是一次数不超过n的多项式,且满足

Ln(xj)=yj,L=0,1,…,n

再由插值多项式的唯一性,得

Pn(x)≡Ln(x)

(2)建立正规方程组:

∑(∑xij+k)ak=∑xijyi,j=0,1,…,n

平方误差:

I=∑(∑akxik-yi)2

对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)-Yi]2。

从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。

函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法。

得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:

a0=(∑Yi)/m-a1(∑Xi)/m

a1=[m∑XiYi-(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]

即最终的拟合多项式各项系数。

四、操作方法与实验步骤

(1)代数插值

#include

#include

#include

#include

voiddifference(float*x,float*y,intn)

{

float*f;

intk,i;

f=(float*)malloc(n*sizeof

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

当前位置:首页 >

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

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