计算数值方法实验报告概要.docx

上传人:b****3 文档编号:5210817 上传时间:2022-12-14 格式:DOCX 页数:21 大小:239.22KB
下载 相关 举报
计算数值方法实验报告概要.docx_第1页
第1页 / 共21页
计算数值方法实验报告概要.docx_第2页
第2页 / 共21页
计算数值方法实验报告概要.docx_第3页
第3页 / 共21页
计算数值方法实验报告概要.docx_第4页
第4页 / 共21页
计算数值方法实验报告概要.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

计算数值方法实验报告概要.docx

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

计算数值方法实验报告概要.docx

计算数值方法实验报告概要

 

课程名称:

计算机数值方法

实验项目:

方程求根,线性方程组的直接解法与迭代解法,代数插值,最小二乘法拟合多项式

实验地点:

逸夫楼402

专业班级:

学号:

学生姓名:

指导教师:

于亚男

2012年4月26日

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

学院名称

软件学院

专业班级

学号

学生姓名

实验日期

4月26日

成绩

课程名称

计算机数值方法

实验题目

方程求根

1、实验目的和要求

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

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

二、实验内容和原理

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

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

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

3、主要仪器设备

HP笔记本,VC++6.0

4、操作方法与实验步骤

1.二分法:

#include

#include

doublef(doublex)

{

doubley;

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

return(y);

}

main()

{

doublea,b,yl,yr,ym,x1,xr,xm;

a=1;

b=2;

yl=f(a);

yr=f(b);

while(yl*yr>0)

{

yl=f(a);

yr=f(b);

}

xr=a;

x1=b;

while(fabs(xr-x1)>0.000001)

{

xm=(x1+xr)/2;

ym=f(xm);

yl=f(x1);

yr=f(xr);

if(yl*ym<0&&yr*ym>0)

xr=xm;

else

x1=xm;

printf("%f\t%f\t%f\n",x1,xr,xm);

}

printf("\n所求根为x=%f\n",xm);

return0;

}

2.牛顿法:

#include

#include

doublef(doublex)

{

return(pow(x,3)+4*pow(x,2)-10);

}

doublef1(doublex)

{

return(3*pow(x,2)+10*x);

}

intmain()

{

doublex,x1,y1,y2;

printf("请输入一个任意实数:

X=");

scanf("%lf",&x);

printf("方程的解为:

\n");

do{

x1=x;

y1=f(x);

y2=f1(x1);

x=x1-y1/y2;

}

while(fabs(x-x1)>=5e-6);

printf("%lf\n",x1);

}

3.追赶法

5、实验数据记录和处理

1.二分法

2..牛顿法

6、实验结果与分析

通过这个两个程序可看出,二分法的计算量更大一些。

7、讨论、心得

通过这个实验,我了解了线性方程的一些求根方法,对于方程近似值的求解有了更多的理解。

 

实验地点

指导教师

于亚男

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

学院名称

专业班级

学号

学生姓名

实验日期

4月26日

成绩

课程名称

计算机数值方法

实验题目

求解线性方程组

一、实验目的和要求

(1)了解直接法解线性方程组

(2)对Gauss消元法、LU分解法、追赶法有更深刻的理解

二、实验内容和原理

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

(n=5,10,100,…)

三.主要仪器设备

HP笔记本,VC++6.0

四.操作方法与实验步骤

1.高斯:

#include

voidmain()

{

inti,j,f,n;

floata[5][5],b[5],x[5],l,k;

printf("Inputn:

");

scanf("%d",&n);

printf("Inputa[][]:

");

for(i=0;i

for(f=0;f

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

printf("Inputb[]:

");

for(i=0;i

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

for(i=0;i

{

for(j=i+1;j

{

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

b[j]=b[j]+b[i]*l;

for(f=i;f

a[j][f]=a[j][f]+a[i][f]*l;

}

}

x[n-1]=b[n-1]/a[n-1][n-1];

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

{

x[i]=b[i];

k=0;

for(f=i+1;f

k=k-a[i][f]*x[f];

x[i]=(k+b[i])/a[i][i];

}

printf("Theansweris");

for(i=0;i

printf("%.4f",x[i]);

}

2.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=\n");

scanf("%d",&n);

printf("a[n][n]=\n");

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

{

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

{

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

}

}

printf("b[n]=\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;

}

五.实验数据记录和处理

1.高斯

2.LU分解

六、实验结果与分析

本次实验数据较多,在输入上要多费点功夫,一不小心就全部都错了。

在今后编程过程中,一定要小心谨慎。

七、讨论、心得

通过本次实验,我深刻理解了直接法在计算机上解线性方程组的有效性,对于Gauss消元法、LU分解法也有了深刻的理解。

 

实验地点

逸夫楼402

指导教师

于亚男

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

学院名称

软件学院

专业班级

学号

学生姓名

实验日期

4月26日

成绩

课程名称

计算机数值方法

实验题目

线性方程组的迭代解法

1、实验目的和要求

掌握雅可比迭代法和高斯-赛德尔迭代法对方程组进行求解

二、实验内容和原理

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

三、主要仪器设备

HP笔记本,VC++6.0

四、操作方法与实验步骤

雅可比迭代法:

#include

#include

intmain()

{

doublea[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");

}

}

五、实验数据记录和处理

六、实验结果与分析

在本次实验中,编程不太容易,对c/c++的学习应该更进一步。

七、讨论、心得

通过这次实验,我明白了雅克比迭代的一般性解法,对于编程的应用也有了更深刻的理解。

 

实验地点

逸夫楼402

指导教师

于亚男

 

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

学院名称

软件学院

专业班级

学号

学生姓名

实验日期

4月26日

成绩

课程名称

计算机数值方法

实验题目

代数插值

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

三、主要仪器设备

HP笔记本,VC++6.0

四、操作方法与实验步骤

#include"stdafx.h"

#include

#include

#include

#include

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

{

float*f;

intk,i;

f=(float*)malloc(n*sizeof(float));

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

{

f[0]=y[k];

for(i=0;i

y[k]=f[k];

}

return;

}

intmain()

{

inti,n;

floatx[10],y[10],xx,yy;

printf("输?

入?

结á点?

个?

数簓n:

阰");

scanf("%d",&n);

printf("\n");

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

{

printf("x[%d]=",i);

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

printf("y[%d]=",i);

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

printf("\n");

}

difference(x,(float*)y,n);

printf("所ù求ó插?

值μX:

阰");

scanf("%f",&xx);

yy=y[20];

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

yy=yy*(xx-x[i])+y[i];

printf("\n近ü似?

值μ为a:

阰F(%f)=%f\n",xx,yy);

}

五、实验数据记录和处理

六、实验结果与分析

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

所以要用到牛顿插值多项式,两种方法相结合才能更好的解决多项式的问题。

实验地点

逸夫楼402

指导教师

于亚男

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

学院名称

软件学院

专业班级

学号

学生姓名

实验日期

4月26日

成绩

课程名称

计算机数值方法

实验题目

最小二乘法拟合多项式

一、实验目的和要求

掌握用最小二乘法拟合数据的多项式,并求平方误差

二、实验内容和原理

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

三、主要仪器设备

HP笔记本,VC++6.0

四、操作方法与实验步骤

#include

#include

#defineN15

doublepower(double&a,intn)

{

doubleb=1;

for(inti=0;i

b*=a;

returnb;

}

voidGauss();

doubleX[N],Y[N],sumX[N],sumY[N],a[N][N],b[N],l[N][N],x[N];

voidmain()

{

ofstreamoutdata;

ifstreamindata;

doubles;

inti,j,k,n,index;

cout<<"请输入已知点的个数n=";

cin>>n;

cout<

cout<<"请输入X和Y:

"<

for(i=0;i

{

cout<<"X["<

cin>>X[i];

sumX[1]+=X[i];

cout<<"Y["<

cin>>Y[i];

sumY[1]+=Y[i];

cout<

}

cout<<"sumX[1]="<

cout<<"请输入拟合次数index=";

cin>>index;

cout<

i=n;

sumX[0]=i;

for(i=2;i<=2*index;i++)

{

sumX[i]=0;

for(j=0;j

sumX[i]+=power(X[j],i);

cout<<"sumX["<

}

for(i=2;i<=index+1;i++)

{

sumY[i]=0;

for(j=0;j

sumY[i]+=power(X[j],i-1)*Y[j];

cout<<"sumY["<

}

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

{//建立正规方程组

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

a[i][j]=sumX[i+j-2];

b[i]=sumY[i];

}

k=1;//用高斯消元法解方程组

do{

for(j=k+1;j<=index+1;j++)l[j][k]=a[j][k]/a[k][k];

for(i=k+1;i<=index+1;i++){

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

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

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

}

if(k==index+1)break;

k++;

}while

(1);

x[index+1]=b[index+1]/a[index+1][index+1];

for(i=index;i>=1;i--)

{

s=0;

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

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

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

}

cout<<"拟合系数为:

";//输出拟合系数

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

cout<

doublem=0;

cout<

";

for(i=0;i

{

doublet=x[1]+x[2]*X[i]-Y[i];

m=m+power(t,2);

}

cout<

}

五、实验数据记录和处理

六、讨论、心得

通过本次实验,我了解到了拟合的重要性,对于解决方程有了更多的方法和技巧。

 

实验地点

逸夫楼402

指导教师

于亚男

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

当前位置:首页 > 解决方案 > 学习计划

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

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