计算数值方法实验报告材料太原理工大学.docx

上传人:b****8 文档编号:10101141 上传时间:2023-05-23 格式:DOCX 页数:30 大小:319.57KB
下载 相关 举报
计算数值方法实验报告材料太原理工大学.docx_第1页
第1页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第2页
第2页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第3页
第3页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第4页
第4页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第5页
第5页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第6页
第6页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第7页
第7页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第8页
第8页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第9页
第9页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第10页
第10页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第11页
第11页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第12页
第12页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第13页
第13页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第14页
第14页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第15页
第15页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第16页
第16页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第17页
第17页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第18页
第18页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第19页
第19页 / 共30页
计算数值方法实验报告材料太原理工大学.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

计算数值方法实验报告材料太原理工大学.docx

《计算数值方法实验报告材料太原理工大学.docx》由会员分享,可在线阅读,更多相关《计算数值方法实验报告材料太原理工大学.docx(30页珍藏版)》请在冰点文库上搜索。

计算数值方法实验报告材料太原理工大学.docx

计算数值方法实验报告材料太原理工大学

 

计算数值方法

实验报告

 

学院:

软件学院

专业:

软件工程

班级:

软件1012班

学号:

2010004719

姓名:

乔婧峰

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

学院名称

软件学院

专业班级

软件1012班

学号

2010004719

学生姓名

乔婧峰

实验日期

2012.4

成绩

课程名称

数值计算方法

实验题目

实验一二分法

一、课题名称

方程求根:

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

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

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

迭代法:

用迭代公式x=f(x)进行迭代计算,直到满足|x*-xn|<0.5×10-5为止。

割线法:

x=x-f(x)/g(x),其中f(x)为给定的函数,g(x)为给定函数的导数,直到满足|x*-xn|<0.5×10-5为止。

二、目的和意义

(1)了解非线性方程求根的常见方法,如二分法、牛顿法、割线法。

(2)加深对方程求根方法的认识,掌握算法。

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

三、计算公式

f(x)在区间(x,y)上连续

  先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],

  现在假设f(a)<0,f(b)>0,a

①如果f[(a+b)/2]=0,该点就是零点,

  如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用

  中点函数值判断。

  如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b,从①开始继续使用

  中点函数值判断。

  这样就可以不断接近零点。

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

 

四、主要仪器设备

Vc2008,hp

五、结构程序设计

迭代法:

#include"stdafx.h"

#include"stdio.h"

#include"math.h"

#include"iostream"

usingnamespacestd;

floatmain()

{

floata;

cin>>a;

floatt,x;

x=a;

do{

x=sqrt((10-x*x*x)/4);

t=a;

a=x;

}while(fabs(a-t)>0.5*1e-5);

printf("x=%f",a);

system("pause");

}

 

割线法:

#include"stdafx.h"

#include"stdio.h"

#include"math.h"

#include"iostream"

usingnamespacestd;

floatmain()

{

floatc,a=1.0,b=2.0;

//cin>>a>>b;

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.000001)break;

b=c;

}

cout<

}

 

六、结果讨论和分析

割线法:

迭代法:

分析:

使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同。

实验地点

ZSA401

指导教师

李志

 

学院名称

软件学院

专业班级

软件1012班

学号

2010004719

学生姓名

乔婧峰

实验日期

2012.4

成绩

课程名称

数值计算方法

实验题目

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

一、课题名称

线性方程组的直接解法

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

(n=5,10,100………)

二、目的和意义

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

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

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

三、计算公式

高斯分解法:

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

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.

 

四、主要仪器设备

Vc2008,hp

五、结构程序设计

Gauss消元法:

#include"stdafx.h"

#include"stdio.h"

#include"iostream"

usingnamespacestd;

floatmain()

{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]);

cout<

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,",i+1,x[i]);

}

LU分解法:

#include"stdafx.h"

#include

#include

#defineL30

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

intmain(){

intn,i,j,k,r;

scanf("%d",&n);

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

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

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

}

}

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;

}

追赶法:

#include"stdafx.h"

#include"stdio.h"

voidmain()

{

FILE*f;

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

doublet;

inti,n;

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

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

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

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

{

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

}

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

fclose(f);

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++)

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

Zgf.txt文件中的内容是:

5

21-7

121-5

121-5

121-5

12-5

 

六、结果讨论和分析

Gauss消元法:

 

LU分解法:

追赶法:

分析

从消元过程可以看出,对于n阶线性方程组,只要各步主元素不为零,经过n-1步消元,就可以得到一个等价的系数矩阵为上三角形阵的方程组,然后再利用回代过程可求得原方程组的解.

消元过程相当于分解A为单位下三角阵L与上三角阵U的乘积,解方程组Ly=b

回代过程就是解方程组Ux=y。

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

在A的LU分解中,L取下三角阵,U取单位上三角阵,这样求解方程组Ax=d的方法称为追赶法.

 

实验地点

ZSA401

指导教师

李志

学院名称

软件学院

专业班级

软件1012

学号

2010004719

学生姓名

乔婧峰

实验日期

2011.4

成绩

课程名称

数值计算方法

实验题目

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

一、课题名称

线性方程组的迭代解法

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

二、目的和意义

学习使用雅可比迭代法或高斯-赛德尔迭代法

三、计算公式

雅克比迭代法:

设线性方程组

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。

四、主要仪器设备

Vc2008,hp

 

五、结构程序设计

高斯-赛德尔迭代法:

#include"stdafx.h"

#include

#include

voidmain()

{

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},sum1,sum2;

inti,j,k,n=3;

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

{for(i=0;i

{

sum1=0;

sum2=0;

for(j=0;j

{

sum1=sum1+a[i][j]*x[j];}

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

{

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

}

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

for(i=0;i

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

printf("\n");

}

}

}

雅克比迭代:

#include"stdafx.h"

#include

#include

voidmain()

{

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},sum1;

inti,j,k,n=3;

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

{

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

{

sum1=0;

for(j=0;j

{if(i==j)continue;

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

}

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

}

for(i=0;i

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

printf("\n");

}

}

 

六、实验结果与分析:

高斯-赛德尔迭代法:

雅克比迭代:

 

分析:

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

 

实验地点

ZSA401

指导教师

李志

 

学院名称

软件学院

专业班级

软件1012班

学号

2010004719

学生姓名

乔婧峰

实验日期

2011.4

成绩

课程名称

数值计算方法

实验题目

实验四最小二乘法拟合多项式

一、课题名称

(1)了解矩阵特征值与特征向量问题解法,掌握幂法。

(2)加深对矩阵特征值与特征向量问题求解方法的认识,掌握算法。

(3)会进行误差分析。

二、目的和意义

学习使用最小二乘法拟合多项式

三、计算公式

幂法:

由已知的非零向量x0和矩阵A的乘幂构造向量序列{xn}以计算矩阵A的按模最大特征值及其特征向量的方法,称为幂法。

迭代公式:

结果可取

四、主要仪器设备

Vc2008,hp

五、结构程序设计

 

五、结果讨论和分析

分析:

幂法是一种求任意矩阵A的按模最大特征值及其对应特征向量的迭代算法。

该方法的最大优点是计算简单,容易在计算机上实现,对稀疏矩阵较为适合,但有时收敛速度很慢。

 

实验地点

综合楼六层606室

指导教师

王峥

学院名称

计算机科学与技术

专业班级

计算机

学号

1111111111

学生姓名

某某

实验日期

2011-6-20

成绩

课程名称

数值计算方法

实验题目

实验五代数插值

一、课题名称

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

已知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

二、目的和意义

学习使用拉格朗日插值法或牛顿插值法求解

三、计算公式

设函数在区间[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)

 

四、结构程序设计

#include

#include

#include

typedefstructdata

{

floatx;

floaty;

}Data;//变量x和函数值y的结构

Datad[20];//最多二十组数据

floatf(ints,intt)//牛顿插值法,用以返回插商

{

if(t==s+1)

return(d[t].y-d[s].y)/(d[t].x-d[s].x);

else

return(f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);

}

floatNewton(floatx,intcount)

{

intn;

while

(1)

{

cout<<"请输入n值(即n次插值):

";//获得插值次数

cin>>n;

if(n<=count-1)//插值次数不得大于count-1次

break;

else

system("cls");

}

floatt=1.0;

floaty=d[0].y;

floatyt=0.0;

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

{

t=(x-d[j-1].x)*t;

yt=f(0,j)*t;

y=y+yt;

}

returny;

}

floatlagrange(floatx,intcount)

{

floaty=0.0;

for(intk=0;k

{

floatp=1.0;//初始化p

for(intj=0;j

{//计算p的值

if(k==j)continue;//判定是否为同一个数

p=p*(x-d[j].x)/(d[k].x-d[j].x);

}

y=y+p*d[k].y;//求和

}

returny;//返回y的值

}

voidmain()

{

floatx,y;

intcount;

while

(1)

{

cout<<"请输入x[i],y[i]的组数,不得超过20组:

";//要求用户输入数据组数

cin>>count;

if(count<=20)

break;//检查输入的是否合法

system("cls");

}

//获得各组数据

for(inti=0;i

{

cout<<"请输入第"<

";

cin>>d[i].x;

cout<<"请输入第"<

";

cin>>d[i].y;

system("cls");

}

cout<<"请输入x的值:

";//获得变量x的值

cin>>x;

while

(1)

{

intchoice=3;

cout<<"请您选择使用哪种插值法计算:

"<

cout<<"(0):

退出"<

cout<<"

(1):

Lagrange"<

cout<<"

(2):

Newton"<

cout<<"输入你的选择:

";

cin>>choice;//取得用户的选择项

if(choice==2)

{

cout<<"你选择了牛顿插值计算方法,其结果为:

";

y=Newton(x,count);break;//调用相应的处理函数

}

if(choice==1)

{

cout<<"你选择了拉格朗日插值计算方法,其结果为:

";

y=lagrange(x,count);break;//调用相应的处理函数

}

if(choice==0)

break;

system("cls");

cout<<"输入错误!

!

!

!

"<

}

cout<

}

五、结果讨论和分析

分析:

拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费。

 

实验地点

综合楼六层606室

指导教师

王峥

学院名称

计算机科学与技术

专业班级

计算机

学号

1111111111

学生姓名

某某

实验日期

2011-6-20

成绩

课程名称

数值计算方法

实验题目

实验六最小二乘法拟合多项式

一、课题名称

给定数据点(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.

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2