计算数值方法实验报告概要.docx
《计算数值方法实验报告概要.docx》由会员分享,可在线阅读,更多相关《计算数值方法实验报告概要.docx(21页珍藏版)》请在冰豆网上搜索。
![计算数值方法实验报告概要.docx](https://file1.bdocx.com/fileroot1/2022-12/13/da5a6bd0-b865-4f9a-b009-c719f7ce9487/da5a6bd0-b865-4f9a-b009-c719f7ce94871.gif)
计算数值方法实验报告概要
课程名称:
计算机数值方法
实验项目:
方程求根,线性方程组的直接解法与迭代解法,代数插值,最小二乘法拟合多项式
实验地点:
逸夫楼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;ifor(f=0;fscanf("%f",&a[i][f]);
printf("Inputb[]:
");
for(i=0;iscanf("%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;fa[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;fk=k-a[i][f]*x[f];
x[i]=(k+b[i])/a[i][i];
}
printf("Theansweris");
for(i=0;iprintf("%.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;iy[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;ib*=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;jsumX[i]+=power(X[j],i);
cout<<"sumX["<
}
for(i=2;i<=index+1;i++)
{
sumY[i]=0;
for(j=0;jsumY[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
指导教师
于亚男